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

5 回答 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”。

于 2012-12-12T09:27:04.403 回答
4

如果您首先使用NLTK 书第 5 章中描述的查找标记器(例如使用 WordNet 作为查找参考),您的标记器将已经“知道”不能是形容词。对于具有多个可能 POS 标签的所有单词,您可以使用统计标记器作为退避标记器。

于 2013-01-23T17:43:14.640 回答
3

这是因为您想a woman needs a man like a fish needs a bicycle为这样的“解析”获取 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] ]

于 2013-01-17T10:28:50.823 回答
3

这取决于如何给 POS 标注器输入。例如句子:“女人需要男人,就像鱼需要自行车一样”

如果您使用默认的 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')]

在 Regex Tokenizer 中,fish 是一个名词,而在默认的 tokenizer 中,fish 是一个形容词。根据使用的分词器,解析不同导致解析树结构不同。

于 2014-04-17T08:59:05.260 回答
2

如果您使用Stanford POS 标记器(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')]
于 2015-03-16T23:37:46.713 回答