使用backoff ngrams在nltk中标记pos

时间:2013-06-23 10:47:35

标签: python nltk pos-tagger

我尝试在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。

2 个答案:

答案 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)