如何从复杂句子中提取主要主语和对象短语?

时间:2013-09-26 14:36:03

标签: tree nlp stanford-nlp

在Stanford Parser的文档中,给出了以下例句:

  

印度有史以来最严重的降雨关闭了金融中心   孟买,快速通信线路,封闭机场和强迫   成千上万的人在他们的办公室里睡觉或者在家里走回家   官员今天晚上说。

这会生成解析树:

  

[ROOT [S [S [NP [NP [DT] [JJS最强] [NN降雨]] [VP [ADVP [RB]   永远]] [VBN记录] [PP [IN in] [NP [NNP India]]]]] [VP [VP [VBD]   关闭] [PRT [RP down]] [NP [NP [DT] [JJ财务] [NN集线器]] [PP   [IN] [NP [NNP Mumbai]]]]] [,,] [VP [VBD snapped] [NP [NN]   通信] [NNS线路]]] [,,] [VP [VBD关闭] [NP [NNS   机场]]] [CC和] [VP [VBD强制] [NP [NP [NNS千]] [PP   [IN] [NP [NNS人]]]] [S [VP [TO to] [VP [VP [VB睡眠] [PP]   [IN in] [NP [PRP $他们的] [NNS办公室]]]] [CC或] [VP [VB walk] [NP   [NN home]] [PP [IN during] [NP [DT the] [NN night]]]]]]]]]]   [,,] [NP [NNS官员]] [VP [VBD说] [NP-TMP [NN今天]] [。   。]]]

(见http://i.imgur.com/mZLBDmh.png)。

哪种NLP工具能够从上述复杂句子示例输出句子主题和对象?期望输出:

sentence_subj_phrase = "the strongest rain ever recorded in India"
sentence_obj_phrase = "the financial hub of Mumbai"

FROM ORIGINAL OP的帖子(这只是关于他认为什么不起作用的详细信息):

在句子中提取主语和宾语的一种天真的方法是在动词之前和之后找到名词短语。然而,在复杂的句子中,有多个动词,因此有多个主语和宾语。可以将这样的复杂句子视为多个句子(使用独立子句的第一部分作为“根”,并用每个从属子句替换第二部分),但通常第一个句子是最重要的可以被认为是句子的主要“主题”。

使用简单的BFS来查找动词之前的第一个NP会导致“官员”成为主题,因为它处于最低深度级别。这并没有捕捉包含主题的第一个子句的直觉。我尝试的一种方法是在第一个“基础”S节点中搜索NP(即,以S节点为根的最低级子树),但在这种情况下,它将捕获以S 3 为根的节点。

3 个答案:

答案 0 :(得分:5)

你似乎在某种程度上混淆了主题和语法主题的概念。 “官员”是一个非常好的“说”的语法主题。当你解释时,你应该考虑找到条款的主语(树中的“S”子树)而不是句子主语。 “最强的雨......”是你的例子中S_2的语法主题。

如果您想要的只是句子中任何条款中的第一个语法主语,请使用您选择的任何算法(S-> NP VP子树中的NP等)查找所有S子树中的所有主题,并且然后选择整棵树中最左边的那个。 (但这显然不一定能找到一个好主题的短语。)

答案 1 :(得分:2)

需要注意的一点是,当你谈论语法科目和对象时,他们遵循structuralist语言学理论,这是大多数NLP任务所遵循的。

接下来当你谈论语法主题和对象时,你应该只引用实体(即事物/事件)本身并排除实体修饰符: “印度有史以来最大的降雨”

entity = "rain"
entity modifiers = [('Adjective/Preposition_Phrase', "ever recorded in India"), ("Determiners", "the"), (Adjective_Phrase, "strongest")]
entity phrase = "The strongest rain"
entity phrase with all posssible modifiers (EP_mod)= "the strongest rain ever recorded in India"

然后我们来看看如何检测EP_mod的NLP任务:

  1. 首先,您可以尝试找出一个算法来确定复句中的主谓词(即浅层计算语法中的动词)。 (我建议,在解析树的最顶层找到动词)

  2. 然后,您需要找到包含主谓词的SUBJ / OBJ实体的短语。 (任何普通的NLP解析器都应该告诉你)

  3. 最后,你需要找到包含主谓词的SUBJ / OBJ实体的短语的修饰符(可能你需要找到一个依赖解析器(斯坦福解析器是一个依赖项)解析器),为您提供注释SUBJ_phrase governs Modifier_phrase

  4. 您要求的是当前现有工具的混搭,因此最佳解决方案是eat your own dog food解决方案。玩得开心=)

答案 2 :(得分:1)

这是一个Python Spacy方法:

代码

from spacy.en import English
nlp = English()


SUBJECTS = ["nsubj","nsubjpass"] ## add or delete more as you wish
OBJECTS = ["dobj", "pobj", "dobj"] ## add or delete more as you wish


sent = "The strongest rain ever recorded in India shut down the financial hub of Mumbai, snapped communication lines, closed airports and forced thousands of people to sleep in their offices or walk home during the night, officials said today."

doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ in SUBJECTS) ]
obj_toks = [tok for tok in doc if (tok.dep_ in OBJECTS) ]

print("Subjects:", sub_toks)
print("Objects :", obj_toks)

结果

Subjects: [rain, officials]
Objects : [India, hub, Mumbai, lines, thousands, people, offices, night]