使用NLTK进行自定义POS标注(错误)

4
我正在尝试将自己的简单自定义标记器与nltk默认标记器(在这种情况下是感知器标记器)结合起来。
我的代码如下(基于this answer):
import nltk.tag, nltk.data

default_tagger = nltk.data.load(nltk.tag._POS_TAGGER)
model = {'example_one': 'VB' 'example_two': 'NN'}
tagger = nltk.tag.UnigramTagger(model=model, backoff=default_tagger)

然而,这会出现以下错误:
  File "nltk_test.py", line 24, in <module>
    default_tagger = nltk.data.load(nltk.tag._POS_TAGGER)
  AttributeError: 'module' object has no attribute '_POS_TAGGER'

我尝试通过将默认标记器更改为以下内容来解决此问题:

from nltk.tag.perceptron import PerceptronTagger
default_tagger = PerceptronTagger()

但是我遇到了以下错误:
  File "nltk_test.py", line 26, in <module>
    tagger = nltk.tag.UnigramTagger(model=model, backoff=default_tagger)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/nltk/tag/sequential.py", line 340, in __init__
    backoff, cutoff, verbose)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/nltk/tag/sequential.py", line 284, in __init__
    ContextTagger.__init__(self, model, backoff)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/nltk/tag/sequential.py", line 125, in __init__
    SequentialBackoffTagger.__init__(self, backoff)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/nltk/tag/sequential.py", line 50, in __init__
    self._taggers = [self] + backoff._taggers
AttributeError: 'PerceptronTagger' object has no attribute '_taggers'

在查看文档时,似乎_POS_TAGGER已经不存在了。然而将其改为_pos_tagpos_tag也没有起作用。

2个回答

4

快速回答:目前使用nltk 3.0.1 pip install nltk==3.0.1

更好的回答:他们在去年9月更改了树库标注器,这对其他方面也有很多影响(我们目前只使用3.0.1版本,因为新的标注器至少对我们的需求来说更差)。

这个代码似乎可以工作,但我不确定它的正确性:

class BackoffTagger:
    def __init__(self):
        self._taggers = [PerceptronTagger()]

model = {'example_one': 'VB', 'example_two': 'NN'}
tagger = nltk.tag.UnigramTagger(model=model, backoff=BackoffTagger())
tagger.tag(['example_one'])
>>> [('example_one', 'VB')]

已更新答案,附上可与最新的nltk一起使用的代码片段。 - AnilRedshift
非常感谢!nltk 3.0.1 可以正常工作,但是3.1的解决方案更好。它与您的示例配合得很好。然而,当我引入模型中没有的标记,例如'example_three'时,tag函数会出现错误:site-packages/nltk/tag/sequential.py", line 61, in tag tags.append(self.tag_one(tokens, i, tags)) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/nltk/tag/sequential.py", line 81, in tag_one tag = tagger.choose_tag(tokens, index, history) AttributeError: 'PerceptronTagger' object has no attribute 'choose_tag' - freefall
2
在这种情况下,您可能需要扩展PerceptronTagger类本身以添加任何所需的功能。这似乎涉及到打地鼠的领域。我建议直接向NLTK专家寻求新世界的指导。 - AnilRedshift
好的,挺公平的,我在想是否有更简单的解决办法。那么我就继续使用3.0.1版本吧,因为目前看来它运行得很好。再次感谢! - freefall
感知机标注器(现在是默认的 NLTK 标注器)不继承与 nGram 标注器相同的类,因此将其用作回退并不起作用。这就解释了为什么会出现“对象没有选择标记”错误。但是您可以使用 maxent_treebank_pos_tagger 作为回退。 - Ric Gaudet

1
尝试以下自定义标记:

(保留HTML,不解释)
import nltk.tag, nltk.data
from nltk.tag.perceptron import PerceptronTagger
default_tagger = PerceptronTagger()

使用自定义标签定义您的模型:

model={"paining": "Reaction", "Itching":"Reaction", "Removed":"Reaction", "skin":"site"}

class BackoffTagger:
    def __init__(self):
        self._taggers = [PerceptronTagger()]

tagger = nltk.tag.UnigramTagger(model=model, backoff=BackoffTagger())
tagger.tag(['skin'])

输出:

[('skin', 'site')]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接