POS标记 - NLTK认为名词是形容词

5
在下面的代码中,为什么nltk认为“fish”是形容词而不是名词?
>>> import nltk
>>> s = "a woman needs a man like a fish needs a bicycle"
>>> nltk.pos_tag(s.split())
[('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man', 'NN'), ('like', 'IN'), ('a', 'DT'), ('fish', 'JJ'), ('needs', 'NNS'), ('a', 'DT'), ('bicycle', 'NN')]

请返回正确的词性标注有问题的Python代码,NLTK POS标记未正常工作。 - alvas
5个回答

4

我不确定有什么解决方法,但你可以在这里检查源代码 https://nltk.googlecode.com/svn/trunk/nltk/nltk/tag/

同时,我尝试了一种略微不同的方法来处理你的句子。

>>> s = "a woman needs a man. A fish needs a bicycle"
>>> nltk.pos_tag(s.split())
[('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man.', NP'), ('A','NNP'),   ('fish', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('bicycle', 'NN')]

这导致鱼被标记为“NN”。

1
我认为这是因为短句通常具有更高的准确性。 - alvas

4
如果你使用了查找标注器,就像NLTK book, chapter 5中所描述的那样(例如使用WordNet作为查找参考),那么你的标注器已经“知道”fish不能是形容词。对于所有有多个可能POS标记的单词,你可以使用统计标注器作为备用标注器。

你能给出你回答末尾所提到的统计标注器的示例吗? - Private
大多数 NLTK 中的 POS 标注器利用单词/特征组合的统计信息。例如,TNT 和 Naive Bayes。 - Suzana

3

这取决于POS标记器如何接收输入。例如对于句子:"a woman needs a man like a fish needs a bicycle"。

如果使用默认的nltk单词分词器和正则表达式分词器,结果值将不同。

import nltk 
from nltk.tokenize import RegexpTokenizer

TOKENIZER = RegexpTokenizer('(?u)\W+|\$[\d\.]+|\S+')

s = "a woman needs a man like a fish needs a bicycle"

regex_tokenize = TOKENIZER.tokenize(s)
default_tokenize = nltk.word_tokenize(s)

regex_tag = nltk.pos_tag(regex_tokenize)
default_tag = nltk.pos_tag(default_tokenize)

print regex_tag
print "\n"
print default_tag

输出结果如下:
  Regex Tokenizer: 

[('a', 'DT'), (' ', 'NN'), ('woman', 'NN'), (' ', ':'), ('needs', 'NNS'), (' ', 'VBP'), ('a', 'DT'), (' ', 'NN'), ('man', 'NN'), (' ', ':'), ('like', 'IN'), (' ', 'NN'), ('a', 'DT'), (' ', 'NN'), ('fish', 'NN'), (' ', ':'), ('needs', 'VBZ'), (' ', ':'), ('a', 'DT'), (' ', 'NN'), ('bicycle', 'NN')]

 Default Tokenizer: 

[('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man', 'NN'), ('like', 'IN'), ('a', 'DT'), ('fish', 'JJ'), ('needs', 'NNS'), ('a', 'DT'), ('bicycle', 'NN')]

在正则表达式分词器中,“fish”是一个名词,而在默认分词器中,“fish”是一个形容词。根据使用的分词器不同,解析过程也不同,从而导致不同的解析树结构。

3
由于您希望“女人需要男人就像鱼需要自行车”这样的“解析”获得POS标签,所以出现了这种情况:

[ [[a woman] needs [a man]] like [[a fish] needs [a bicycle]] ]

但是,NLTK默认的POS标记器不够智能,给您提供了这样一个解析的POS标记:

[ [[a woman] needs [a man]] like [a fish needs] [a bicycle] ]


2
如果您使用斯坦福词性标注器(3.5.1),则该短语将被正确标记:
from nltk.tag.stanford import POSTagger
st = POSTagger("/.../stanford-postagger-full-2015-01-30/models/english-left3words-distsim.tagger",
               "/.../stanford-postagger-full-2015-01-30/stanford-postagger.jar")
st.tag("a woman needs a man like a fish needs a bicycle".split())

产生,得出,产量
[('a', 'DT'),
 ('woman', 'NN'),
 ('needs', 'VBZ'),
 ('a', 'DT'),
 ('man', 'NN'),
 ('like', 'IN'),
 ('a', 'DT'),
 ('fish', 'NN'),
 ('needs', 'VBZ'),
 ('a', 'DT'),
 ('bicycle', 'NN')]

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