我需要从给定的文本中提取所有英语动词,我想知道我是如何做到的......乍一看,我的想法是使用正则表达式,因为所有英语动词时态都遵循模式,但也许有另一种方法可以做到这一点 . 我的想法很简单:
-
为每个动词时态创建一个模式 . 我必须以某种方式区分常规动词(http://en.wikipedia.org/wiki/English_verbs)和不规则动词(http://www.chompchomp.com/rules/irregularrules01.htm) .
-
迭代这些模式并使用它们分割文本(每个子字符串的最后一个单词应该是赋予句子完整含义的动词,我需要用于其他目的 - >名义化)
你怎么看?我想这不是一种有效的方法,但我无法想象另一种方法 .
先感谢您!
PS:
-
我有两本词典,一本用于所有英语动词,另一本用于所有英语名词
-
所有这一切的主要问题在于项目包含动词名词化(只是一个单项目),所以"effort"应该集中在这个部分,名词化 . 具体来说,我遵循这个模型:acl.ldc.upenn.edu/P/P00/P00-1037.pdf) . 该项目包括给定文本,查找该文本中的所有动词,并为每个动词提出多个名词化 . 所以第一步(找到动词)应该尽可能简单......但是我不能允许这样做
4 回答
Parsing natural language with regex is impossible. Forget it.
作为一个激烈的例子:你如何在这句话中找到动词(用星号标记)?
虽然你很难遇到像这样的极端情况,但是如果你只看这个词的话,还有几十个动词也可以是名词,形容词等 .
你需要一个像Stanford NLP这样的自然语言解析器 . 我从来没有使用过,所以我不知道你的结果会有多好,但是比Regex更好,我可以告诉你 .
Part of Speech tagger
使用Part-of-Speech (POS) tagger识别并提取文本中的所有动词是 very easy . 这些标记符标记文本中的所有单词,其中包含词性标记,表明它们是动词,名词,形容词,副词等 . 现代POS标记器非常准确 . 例如,Toutanova等 . 2003年报道了斯坦福在新闻专线数据上的开源POS标签 assigns the correct tag 97.24% of time .
Performing POS tagging
Java 如果你正在使用Java,那么一个很好的POS标签包就是Stanford Log-linear Part-Of-Speech Tagger . Matthew Jockers汇总了一个关于使用这个tagger的好教程,你可以找到here .
Python 如果您更喜欢Python,可以使用Natural Language Toolkit (nltk)中包含的POS标记器 . 下面给出了演示如何使用此包执行POS标记的代码片段:
得到的POS标记的标记将是元组的数组,其中每个元组中的第一个条目是标记单词的标识,第二个条目是单词的POS标记,例如,对于
pos_tagged_tokens
上方的代码段,将设置为:Understanding the Tag Set
Stanford POS标记器和NLTK都使用Penn Treebank tag set . 如果您只想提取动词,请提取所有具有以"V"开头的POS标记的单词(例如,VB,VBD,VBG,VBN,VBP和VBZ) .
这在NLP(自然语言处理)中实际上是一项非常艰巨的任务 . 那里的正则表达式是不够的 . 以“训练”这个词为例 - 它可以用作动词或名词(“我要参加训练课程”) . 显然,正则表达式无法区分两者之间的区别 . 也存在问题,“-ed”是结束紧张动词的常用方法,但在“厌恶”的情况下会使你失败 .
有些技术可以为你提供一个好的(不完美的,但很好的)指示给定的单词是否是一个动词 - 它们在计算上也可能非常昂贵 .
因此,您应该问自己(在我看来)的第一个问题是答案的质量与您感兴趣的处理时间 .
虽然一年后,但我发现西北大学的一个非常有用的工具叫做MorphAdorner .
它处理各种情况,例如词形还原,语言识别,名称识别,解析器,句子分割器等 .
方便易用 .