2012-02-23 46 views
12

我在食谱上使用pos_tagger。我遇到的一个问题是,pos_tagger返回命令式中的单词是名词,它们不应该是动词吗? 例如:NLTK认为命令是名词

随着输入:

combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder 

输出是:

[('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',',  ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')] 

下面是我使用此代码:

def part_of_speech(self,input_sentance): 
     text = nltk.word_tokenize(input_sentance) 
     return nltk.pos_tag(text) 

不应该'combine'被标记为某种动词?这是nltk的错吗?或者我做错了什么?

+0

你能告诉我们你目前使用什么代码来生成上述代码。 – 2012-02-23 02:42:33

+0

yep刚添加了代码 – mdogg 2012-02-23 04:42:01

+2

尽管我对nltk一无所知,但在一次不寻常的巧合中,本周NFL球探联合会正在印第安纳波利斯举行,其中“combine”被用作名词。 – DSM 2012-02-23 04:56:31

回答

10

您所看到的是传统统计自然语言处理(NLP)中的一个非常常见的问题。简而言之,您使用标记器的数据看起来不像它所训练的数据。 NLTK没有记录详细信息,但据我所知,默认标记器是在华尔街日报文章,布朗语料库或两者的某种组合上进行培训的。这些语料库包含的命令很少,所以当您将命令赋予其数据时,它不会做正确的事情。

一个好的长期解决方案是纠正大量食谱的标签,并在纠正的数据上训练,这样可以解决培训和测试数据之间不匹配的问题。然而,这是一项大量的工作。理想情况下,一个有很多必要条件的语料库已经存在;我的研究小组已经研究过这个问题,但我们还没有找到合适的,尽管我们正在制作一个。

我在最近的一个项目中使用的一个简单得多的解决方案,要求必须正确理解命令,就是简单地记下所需的命令,并强制这些单词的标签正确。

所以在下面的例子中,我做了一个词典,说“combine”应该被当作动词,然后用列表理解来改变标签。

tagged_words = [('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')] 
force_tags = {'combine': 'VB'} 
new_tagged_words = [(word, force_tags.get(word, tag)) for word, tag in tagged_words] 

new_tagged_words的内容现在有原来的标签,除了改变只要有在force_tags的条目。

>>> new_tagged_words 
[('combine', 'VB'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')] 

这个解决方案确实需要你说出你想要强加给动词的单词是什么。这远非理想,但没有更好的通用解决方案。

+0

我明白了。那么这是否意味着POS只是一个字符串匹配?还是我简化了它? – mdogg 2012-03-07 08:09:16

+1

Taggers通常会考虑至少两种信息:标签之间的位置信息(即,名词跟随“the”这样的确定符),以及关于每个单词可能采用的标签的信息(即,'steer'多少次是动词或名词)。在这种情况下,主要是位置信息是问题,因为在训练数据句子中几乎从不以动词开始。 – Constantine 2012-03-08 11:56:27

+0

有关信息,我使用MatePosTagger分析德语文本时遇到同样的问题。 – 2018-01-23 07:45:31

1

与名词映射的“组合”可能是由于它认为它是一个名词。以联合收割机为例。我的猜测是你应该调整你的用例的名词算法或者更改/修改单词语料库。

+0

你如何去做呢?我是一个完全noob当谈到NLTK – mdogg 2012-02-23 02:22:27

+0

有两个伟大的nltk Python书我都有。如果这将是一件大事,你让他们大声笑。否则,提高你的赏金,我可能会为你编写一个例子。 – 2012-02-23 02:25:53

+0

也请投票我的答案,如果你认为它是正确的。 – 2012-02-23 02:27:10

3

关于命令语料库的培训将是最佳选择。但是,如果你没有时间或者不认为这种努力是值得的,这里是一个简单的解决方案(更多的是黑客):只要在每句话之前加一个“他们”这样的代名词(你肯定是势在必行) )。现在nltk在默认标记器上做的很好。

0
>>> from nltk import pos_tag, word_tokenize 
>>> def imperative_pos_tag(sent): 
...  return pos_tag(['He']+sent)[1:] 
... 
>>> sent1 = 'combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder' 

>>> imperative_pos_tag(word_tokenize(sent1)) 
[('combine', 'VBD'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',', ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')] 

而且,看看Python NLTK pos_tag not returning the correct part-of-speech tagNLTK identifies verb as Noun in Imperatives

1

尝试Stanford POS tagger

我已经有了更好的运气。与默认的NLTK标记器相比,它已经被训练了更多的命令性句子。

也码头在cuzzo/stanford-pos-tagger

例如

Follow us on Instagram 
VB PRP IN NN 
+0

你如何替换斯坦福大学的NLTK标记器? – 2017-10-01 15:04:34