我意识到完美地将主语名词短语和对象名词短语从句子中分离出来是一个开放的研究问题,这里不容易解释,但有一种聪明的方法可以做到这一点(假设我已经有一个POS标记的句子)大多数句子,或者至少相对简单的句子?我知道,简单地假设第一个名词短语是主题是一个非常好的近似,但在以介词短语开头的句子中(例如,"在整个清理过程中,通过流经过受惊的鹿."),这就失败了.理想情况下,我喜欢在这种情况下也能识别主题的东西.
作为参考,该例句给出了以下使用Stanford Parser的解析树:
[ROOT [S [PP [IN Across] [NP [NP [DT the] [NN clearing] ] [CC and] [NP [IN through] ] ] ] [NP [DT the] [NN stream] ] [VP [VBD ran] [NP [DT the] [ADJP [JJ frightened] ] [NNS deer] ] ] [. .] ] ]
我目前的策略如下:
主题:在树上做一个BFS,寻找第一个NP.
动词:在树上做一个BFS,寻找第一个VP.在这个子树上,做一个寻找VB的BFS(D | G | N | P | Z).
对象:在上面找到的VP子树上执行BFS,寻找NP.
这个策略在我的例子中产生以下结果:
SUBJECT: (NP (DT the) (NN stream) ) , VERB: (VBD ran) , OBJECT: (NP (DT the) (ADJP (JJ frightened) ) (NNS deer) ).
如果可能的话,我想修改我的策略,以便在这些情况下不失败,最终甚至更复杂的情况.
编辑:好的,你正在使用斯坦福解析器.然后解析器为您提供结果.例如,如果我运行它,In London, my friend ate a big apple and a pear.我得到:
(ROOT
(S
(PP (IN In)
(NP (NNP London)))
(, ,)
(NP (PRP$ my) (NN friend))
(VP (VBD ate)
(NP
(NP (DT a) (JJ big) (NN apple))
(CC and)
(NP (DT a) (NN pear))))
(. .)))
Run Code Online (Sandbox Code Playgroud)
然后主题是S下的NP(我的朋友),对象是S下的VP(大苹果和梨)下的NP.实际上依赖解析:
prep_in(ate-6, London-2)
poss(friend-5, my-4)
nsubj(ate-6, friend-5)
root(ROOT-0, ate-6)
det(apple-9, a-7)
amod(apple-9, big-8)
dobj(ate-6, apple-9)
det(pear-12, a-11)
dobj(ate-6, pear-12)
conj_and(apple-9, pear-12)
Run Code Online (Sandbox Code Playgroud)
告诉你主题(朋友)和直接对象(苹果,梨)的头部是什么.
显然,解析器并非没有错误,实际上你的句子有反转(subj跟在动词之后)它会混淆:
(ROOT
(S
(PP (IN Across)
(NP
(NP (DT the) (NN clearing))
(CC and)
(NP (IN through))))
(NP (DT the) (NN stream))
(VP (VBD ran)
(NP (DT the)
(ADJP (JJ frightened))
(NNS deer)))
(. .)))
Run Code Online (Sandbox Code Playgroud)
正确的解析将是
(ROOT
(S
(PP
(PP (IN Across)
(NP (DT the) (NN clearing)))
(CC and)
(PP (IN through)
(NP (DT the) (NN stream))))
(VP (VBD ran))
(NP (DT the)
(ADJP (JJ frightened))
(NNS deer))
(. .)))
Run Code Online (Sandbox Code Playgroud)
然后你会正确识别the frightened deer为主题.
该怎么办?您可以尝试通过在更多的句子上重新训练它来改进解析器(除了他们训练它的那些),但这是很多工作.或者你可能会尝试识别它不正确的句子类型,并专注于识别错误.也不容易.您也可以尝试使用不同的解析器,例如LinGO项目中使用的解析器,但它更难使用(我认为它需要lisp或类似的东西)
除了POS标记器之外,我还会获得一个chunker然后:
根据chunker,你可能会错过协调的NP,可能剥去他们的PP的NP(my friend取而代之my friend from New York).
如果你不能运行一个chunker,只需寻找主题/对象的头部: - N或主语代词(我们但不是我们),在有限动词之前(但请记住有句子如John and me went to the store. - N或对象代词(我们但不是我们),如果有的话.你应该添加一个检查,其中N是其中一部分的NP紧跟动词并且它不是PP的一部分).假设您可以立即检查动词(Det) ((Adv) Adj)* N)
您还应该考虑问题(主题遵循有限动词,对象遵循基本动词:) Do YOU see THE APPLE?.你也可以通过要求一个主题并在动词之后查找它来处理反转,如果你之前没有找到它,但这会导致命令式(Eat the deer!)的问题.不确定是否值得.
显然,稍微不寻常的句子,例如具有无限依赖关系的句子,会让你失望(对象Kim, Sandy knows Chris trusts在哪里).如果在这种情况下需要合理的答案,则需要运行一个真正的解析器.Kimtrusts