Python NLTK将动词识别为祈使句中的名词

Python NLTK将动词识别为祈使句中的名词,python,nlp,nltk,pos-tagger,Python,Nlp,Nltk,Pos Tagger,我正在使用NLTK POS标记器,如下所示 sent1='get me now' sent2='run fast' tags=pos_tag(word_tokenize(sent2)) print tags [('run', 'NN'), ('fast', 'VBD')] 我发现类似的帖子建议将这个词作为动词添加到字典中。 问题是我有太多这样的生词。 但我有一个线索,它们总是出现在短语的开头 例如:“立即下载”、“立即预订”、“注册” 如何正确帮助NLTK生成正确的结果您可以在NLTK中加载其

我正在使用NLTK POS标记器,如下所示

sent1='get me now'
sent2='run fast'
tags=pos_tag(word_tokenize(sent2))
print tags
[('run', 'NN'), ('fast', 'VBD')]
我发现类似的帖子建议将这个词作为动词添加到字典中。 问题是我有太多这样的生词。 但我有一个线索,它们总是出现在短语的开头

例如:“立即下载”、“立即预订”、“注册”


如何正确帮助NLTK生成正确的结果

您可以在
NLTK
中加载其他第三方模型。看看


为了用一些技巧来回答这个问题,你可以通过添加代词来欺骗POS标记符,这样动词就可以得到主语,例如

>>> from nltk import pos_tag
>>> sent1 = 'get me now'.split()
>>> sent2 = 'run fast'.split()
>>> pos_tag(['He'] + sent1)
[('He', 'PRP'), ('get', 'VBD'), ('me', 'PRP'), ('now', 'RB')]
>>> pos_tag(['He'] + sent1)[1:]
[('get', 'VBD'), ('me', 'PRP'), ('now', 'RB')]
要使答案功能化,请执行以下操作:

>>> from nltk import pos_tag
>>> sent1 = 'get me now'.split()
>>> sent2 = 'run fast'.split()
>>> def imperative_pos_tag(sent):
...     return pos_tag(['He']+sent)[1:]
... 
>>> imperative_pos_tag(sent1)
[('get', 'VBD'), ('me', 'PRP'), ('now', 'RB')]
>>> imperative_pos_tag(sent2)
[('run', 'VBP'), ('fast', 'RB')]

如果希望命令中的所有动词都接收基本表单VB标记:

>>> from nltk import pos_tag
>>> sent1 = 'get me now'.split()
>>> sent2 = 'run fast'.split()
>>> def imperative_pos_tag(sent):
...     return [(word, tag[:2]) if tag.startswith('VB') else (word,tag) for word, tag in pos_tag(['He']+sent)[1:]]
... 
>>> imperative_pos_tag(sent1)
[('get', 'VB'), ('me', 'PRP'), ('now', 'RB')]
>>> imperative_pos_tag(sent2)
[('run', 'VB'), ('fast', 'RB')]

在这里找到了一个叫做spaCy的新图书馆,效果很好

import spacy
nlp = spacy.load("en_core_web_sm")
text = ("run fast")
doc = nlp(text)
verbs = [(token, token.tag_) for token in doc]
print(verbs)
输出:

[('run', 'VB'), ('fast', 'RB')]

安装指南:

它可能重复给我错误的结果,例如:“run”应标记为VB(动词基本形式)而不是VBP在“get”的情况下应为“VB”而不是“VBD”。我尝试过使用Stanford POS tagger,但NLTK的速度非常慢,您能建议其他第三方tagger或其他方法修改并使用NLTK的POS_标记,请参阅。而且,由于您只对VB感兴趣,而对命令式标记不感兴趣,因此可以删除VB*标记中的最后一个字符。