2

我尝试在 nltk 中制作词性(或 POS)标记器,但我无法使用退避让它在一段时间内为多个 ngram 标记器工作。我读到你使用更多的标签来获得更高的分数,但这对我不起作用。我希望它首先使用更多的单词,然后使用更少的单词。我是这样试的

import nltk
from nltk.corpus import brown

#sentence =  brown.sents(categories = "news")
trains = brown.tagged_sents(categories = "news")


from nltk import NgramTagger

fortest = ["hi", "how","are", "you"]

tagger = (nltk.NgramTagger (n, trains, backoff=n-1) for n in range (3))
print tagger.tag(fortest)

但它给了我错误 AttributeError: 'generator' object has no attribute 'tag'

所以我没有列出清单:

for n in range(3):
    tagger = nltk.NgramTagger(n, trains, backoff=n-1)

但后来我得到:

File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nltk/tag/sequential.py", line 271, in __init__
  ContextTagger.__init__(self, model, backoff)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nltk/tag/sequential.py", line 121, in __init__
  SequentialBackoffTagger.__init__(self, backoff)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nltk/tag/sequential.py", line 46, in __init__
  self._taggers = [self] + backoff._taggers AttributeError: 'int' object has no attribute '_taggers'

请帮助我,因为我是新来做 python 的。

4

2 回答 2

3

Spaceghost 是正确的,您需要提供对实际NgramTagger对象的引用作为backoff参数,而不仅仅是int. 简单地使用一个数字作为回退是没有意义的——当创建一个新的标注器时,它不知道去哪里寻找先前创建的具有较小相对上下文的标注器。

这就是为什么你得到AttributeError: 'int' object has no attribute '_taggers'. NLTK 正在寻找继承自SequentialBackoffTagger.

根据你的range(3),我猜你实际上想要一个三元标记器,它带有一个二元标记器的回退,一个单元标记器的回退。

你可以尝试类似的东西,

from nltk.corpus import brown
from nltk import NgramTagger

trains = brown.tagged_sents(categories="news")
tagger = None         # None here is okay since it's the default argument anyway
for n in range(1,4):  # start at unigrams (1) up to and including trigrams (3)
    tagger = NgramTagger(n, trains, backoff=tagger)

注意:无需多次导入 nltk。

>>> tagger.tag('hi how are you'.split())
[('hi', None), ('how', 'WRB'), ('are', 'BER'), ('you', 'PPSS')]

注意,我们得到None了像“hi”这样的词的词性,因为它没有出现在给定的语料库(布朗的新闻类别)中。如果需要,您可以通过初始设置tagger(在 for 循环之前)设置默认标记器,例如,

from nltk import DefaultTagger
tagger = DefaultTagger('NN')
于 2013-06-24T04:16:09.447 回答
1

参数 backoff 应该指向另一个标记器,当当前标记器做得最好时使用该标记器。您需要定义第二个标记器或使用默认值,然后更改代码以使用它。像这样的东西:

default_tagger = nltk.data.load(nltk.tag._POS_TAGGER)
tagger = nltk.NgramTagger(n, trains, backoff=default_tagger)
于 2013-06-23T21:17:58.863 回答