例如,“鹦鹉不会游泳”。这里的主要动词是“游泳”。我们如何通过语言处理来提取它?是否有任何已知的算法用于此目的?
2 回答
您可以对句子运行依赖解析root
算法并找到关系的依赖。例如,通过Stanford Parser 在线演示运行句子“鹦鹉不会游泳” ,我得到以下依赖项:
nsubj(swim-4, Parrots-1)
aux(swim-4, do-2)
neg(swim-4, not-3)
root(ROOT-0, swim-4)
这些行中的每一行都提供了有关句子中两个单词之间不同语法关系的信息(见下文)。你需要最后一行,它说这swim
是句子的根,即主要动词。所以要提取主要动词,首先进行依存解析,找到读取的依存关系root(ROOT-0, X)
。X
将是主要动词。
有几种现成的依赖解析器,例如Stanford CoreNLP或Malt parser可用的一种。我更喜欢斯坦福,因为它在准确性上相当,但有更好的文档并支持多线程解析(如果你有很多文本)。斯坦福解析器输出 XML,因此您必须对其进行解析以获取上述依赖信息。
为了完整起见,对其余输出进行简要说明。第一行说,句子中的第一个词,是第四个词parrots
的主语。swim
第二行说thatdo
是与相关的助动词swim
,第三行说not
否定swim
。有关每个依赖项含义的更详细解释,请参阅斯坦福类型依赖手册。
编辑:根据您的定义main verb
,某些句子可能有多个主要动词,例如I like cats and hate snakes
。此依赖项解析包含依赖项:
root(ROOT-0, like-2)
conj(like-2, hate-5)
它们一起说,根据解析器,主要动词是like
,但hate
与它相连。出于您的目的,您可能需要同时考虑两者like
并hate
成为主要的。
为了获得动词(或任何其他词性),有许多可用的监督和非监督算法,如维特比算法、隐马尔可夫模型、布里尔标记器、约束语法等。甚至我们也有像NLTK(自然语言工具包)这样的库对于已经在其中编码这些算法的 Python(Java 也可以使用类似的方法)。在任何文档或句子中注释 POS 是一项复杂的工作(特别是当您需要高精度时),并且您需要在该领域有深入的知识,首先从最基本的开始,持续的努力可能会导致您开发出更高的算法效率高于主流。