2012-11-23 59 views
4

在下面的代码中,为什么nltk认为'鱼'是形容词而不是名词?POS标记 - NLTK认为名词是形容词

>>> 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')] 
+0

看到http://stackoverflow.com/questions/30821188/python -ntlk-pos-tag-not-returnig-the-correct-pos – alvas

回答

3

我不知道有什么解决办法,但你可以检查这里的源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

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] ]

4

如果您使用的查找标注器作为NLTK book, chapter 5描述(例如使用共发现作为查找基准)首先,你的恶搞一会已经“知道”不能成为形容词。对于具有多个可能的POS标签的所有单词,您可以使用统计标签作为退避标签。

+0

您可以举一个你在答案结尾提到的统计标签的例子吗? – Private

+0

NLTK中的大多数POS标签都利用了单词/特征组合的统计。例如,[TNT](http://www.nltk.org/api/nltk.tag.html#nltk.tag.tnt.TnT)和[朴素贝叶斯](http://www.nltk.org/api /nltk.classify.html#nltk.classify.naivebayes.NaiveBayesClassifier)。 –

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

在正则表达式的分词器鱼是名词,而在默认标记生成器鱼是一个形容词。 根据使用的标记器,解析不同导致不同的分析树结构。

2

如果使用Stanford POS tagger(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')]