我尝试在nltk中制作一部分语音(或POS)标记器但是我无法使用退避来使用多个ngram标记器。我读到你使用更多的标记符来获得更高的分数,但它对我不起作用。我希望它首先使用更多单词,然后使用less to one。我试过这样,
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'对象没有属性'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。
答案 0 :(得分:3)
Spaceghost是正确的,您需要提供一个实际NgramTagger
对象的引用作为backoff
参数,而不仅仅是int
。简单地使用数字作为退避是没有意义的 - 在创建新的标记器时,它不知道在哪里寻找具有较小相对上下文的先前创建的标记器。
这就是你得到AttributeError: 'int' object has no attribute '_taggers'
的原因。 NLTK正在寻找一个继承自SequentialBackoffTagger
的类的对象。
根据您的range(3)
,我猜你实际上想要一个 trigram tagger ,退回到 bigram tagger ,后退到< em> unigram tagger 。
你可以尝试类似的东西,
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
这样的单词的POS,例如“hi”,因为它不会出现在给定的语料库中(布朗的新闻类别)。您可以通过最初设置tagger
(在for循环之前)来设置默认标记器,例如,
from nltk import DefaultTagger
tagger = DefaultTagger('NN')
答案 1 :(得分:1)
参数退避应该指向另一个标记器,当当前的标记器完成它时,它将被使用。您需要定义第二个标记或使用默认值,然后更改您的代码以使用它。像这样:
default_tagger = nltk.data.load(nltk.tag._POS_TAGGER)
tagger = nltk.NgramTagger(n, trains, backoff=default_tagger)