【问题标题】:tagging pos in nltk using backoff ngrams使用退避 ngram 在 nltk 中标记 pos
【发布时间】:2013-06-20 01:04:15
【问题描述】:

我尝试在 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 新手,请提供帮助。

【问题讨论】:

    标签: python nltk pos-tagger


    【解决方案1】:

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

    这就是您获得AttributeError: 'int' object has no attribute '_taggers' 的原因。 NLTK 正在寻找继承自 SequentialBackoffTagger 的类的对象。

    根据您的range(3),我猜您实际上想要一个 trigram 标记器,它可以回退到 bigram 标记器,并且可以回退到 一元标记器.

    你可以试试,

    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')
    

    【讨论】:

      【解决方案2】:

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

      default_tagger = nltk.data.load(nltk.tag._POS_TAGGER)
      tagger = nltk.NgramTagger(n, trains, backoff=default_tagger)
      

      【讨论】:

        猜你喜欢
        • 2016-07-02
        • 2013-03-13
        • 1970-01-01
        • 2015-03-25
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多