NLTK认为势在必行是名词

mdo*_*ogg 12 python nltk

我在配方上使用pos_tagger.我遇到的一个问题是pos_tagger返回命令式时态中的单词是名词,它们不应该是动词吗?例如:

随着输入:

combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder
Run Code Online (Sandbox Code Playgroud)

输出是:

[('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')]
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码:

    def part_of_speech(self,input_sentance):
        text = nltk.word_tokenize(input_sentance)
        return nltk.pos_tag(text)
Run Code Online (Sandbox Code Playgroud)

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

Con*_*ine 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]
Run Code Online (Sandbox Code Playgroud)

new_tagged_words的内容现在具有原始标记,除了在force_tags中有条目的地方更改.

>>> new_tagged_words
[('combine', 'VB'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')]
Run Code Online (Sandbox Code Playgroud)

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