我需要从给定的文本中提取所有英语动词,我想知道我该怎么做... 乍一看,我的想法是使用正则表达式,因为所有英语动词时态都遵循模式,但也许有另一种方法可以做到这一点。我所想的只是:
提前谢谢!
PS:
答案 0 :(得分:13)
部分语音标记
使用Part-of-Speech (POS) tagger识别并提取文本中的所有动词非常简单。这些标记符标记文本中的所有单词,其中包含词性标记,表明它们是动词,名词,形容词,副词等。现代POS标记器非常准确。例如,Toutanova等。 2003年报道斯坦福的开源POS标签为新闻专线数据分配了97.24%的正确标签。
执行POS标记
Java 如果你正在使用Java,那么一个很好的POS标记包就是Stanford Log-linear Part-Of-Speech Tagger。 Matthew Jockers汇总了一个关于使用此标记器的精彩教程,您可以找到here。
Python 如果您更喜欢Python,则可以使用Natural Language Toolkit (nltk)中包含的POS标记器。下面给出了演示如何使用此软件包执行POS标记的代码片段:
import nltk
text = "I am very happy to be here today"
tokens = nltk.word_tokenize(text)
pos_tagged_tokens = nltk.pos_tag(tokens)
生成的POS标记标记将是一个元组数组,其中每个元组中的第一个条目是标记单词的标识,第二个条目是单词的POS标记,例如,对于pos_tagged_tokens
上方的代码段,将设置为:
[('I', 'PRP'), ('am', 'VBP'), ('very', 'RB'), ('happy', 'JJ'), ('to', 'TO'),
('be', 'VB'), ('here', 'RB'), ('today', 'NN')]
了解标记集
Stanford POS标记器和NLTK都使用Penn Treebank tag set。如果您只想提取动词,请提取所有具有以“V”开头的POS标记的单词(例如,VB,VBD,VBG,VBN,VBP和VBZ)。
答案 1 :(得分:4)
用正则表达式解析自然语言是不可能的。算了吧。
作为一个激烈的例子:你如何在这句话中找到动词(用星号标记)?
Buffalo buffalo Buffalo buffalo buffalo* buffalo* Buffalo buffalo
虽然你很难遇到像这样的极端情况,但是如果你只看这个词,就会有几十个动词也可以是名词,形容词等。
您需要一个像Stanford NLP这样的自然语言解析器。我从来没有使用过,所以我不知道你的结果会有多好,但是比Regex好,我可以告诉你。
答案 2 :(得分:0)
这在NLP(自然语言处理)中实际上是一项非常艰巨的任务。那里的正则表达式是不够的。以“训练”这个词为例 - 它可以用作动词或名词(“我要参加训练课程”)。显然,正则表达式无法区分两者之间的区别。也有问题,“-ed”是结束过去时态动词的常用方法,但在“厌恶”的情况下会使你失败。
有一些技巧可以为你提供一个好的(不完美的,但很好的)指示某个给定的单词是否是一个动词 - 它们在计算上也可能非常昂贵。
因此,您应该问自己(在我看来)的第一个问题是答案的质量与您感兴趣的处理时间。
答案 3 :(得分:0)