我在配方上使用pos_tagger。我遇到的一个问题是pos_tagger返回命令式时态中的单词是名词,它们不应该是动词吗? 例如:
输入:
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)
不应该'结合'被标记为某种动词吗?这是nltk的错吗?或者我做错了什么?
答案 0 :(得分: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')]
这个解决方案确实要求你说出你想要动词的词是什么。这远非理想,但没有更好的通用解决方案。
答案 1 :(得分:4)
对命令式语料库的培训将是最佳选择。但是如果你没有时间或者不认为努力是值得的,这里有一个简单的解决方案(更多的是黑客):在每个句子之前放一个像'他们'的代词(你肯定是必要的) )。现在nltk使用默认标记器做得很好。
答案 2 :(得分:1)
'组合'与名词地图可能是因为它认为它是名词。例如联合收割机。我的猜测是你应该根据你的用例调整名词算法,或者改变/修改单词corpus。
答案 3 :(得分:1)
我运气好了。与默认的NLTK标记器相比,它已经训练了更多命令式句子。
还在cuzzo/stanford-pos-tagger停靠。
e.g。
Follow us on Instagram
VB PRP IN NN
答案 4 :(得分: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 tag和NLTK identifies verb as Noun in Imperatives