3

在斯坦福解析器的文档中,给出了以下例句:

官员们今天表示,印度有史以来最强的降雨导致孟买金融中心关闭,通讯线路中断,机场关闭,数千人被迫在办公室睡觉或晚上步行回家。

这将产生解析树:

[ROOT [S [S [NP [NP [DT] [JJS 最强] [NN 雨]] [VP [ADVP [RB 曾经]] [VBN 记录][PP [IN] [NP [NNP 印度]]] ] ] [VP [VP [VBD 关闭] [PRT [RP down] ] [NP [NP [DT] [JJ 金融] [NN hub] ] [PP [IN] [NP [NNP Mumbai] ] ] ] [, ,] [VP [VBD 捕捉] [NP [NN 通信] [NNS 线路] ] [, ,] [VP [VBD 关闭] [NP [NNS 机场]] ] [CC 和] [VP [VBD 强制] [NP [NP [NNS 数千] ] [PP [IN 的] [NP [NNS 人] ] ] [S [VP [TO 到] [VP [VP [VB 睡眠] [PP [IN] [NP [PRP $他们] [NNS 办公室] ] ] [CC or] [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"

来自 ORIGINAL OP 的帖子(这只是关于他认为不起作用的细节):

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

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

4

3 回答 3

4

您似乎在某种程度上混淆了主题和语法主题的概念。“官员”是“说”的一个很好的语法主语。正如您所解释的那样,您应该考虑查找子句的主题(树中的“S”子树)而不是句子的主题。在您的示例中,“最强的雨......”是 S_2 的语法主题。

如果您想要的只是句子中任何子句中的第一个语法主语,请使用您选择的任何算法(S->NP VP 子树中的 NP 等)查找所有 S 子树中的所有主语,然后选择一个这是整个树中最左侧的位置。(不过,这显然不一定能找到一个好的话题。)

于 2013-09-27T09:07:32.090 回答
3

需要注意的几点是,当您谈论语法主语和宾语时,它们遵循的是语言学的结构主义理论,这是大多数 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"

然后我们归结为如何检测的 NLP 任务EP_mod

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

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

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

您需要的是当前现有工具的混搭,因此最好的解决方案是吃自己的狗粮解决方案。玩得开心 =)

于 2013-09-28T16:09:47.847 回答
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]
于 2016-12-17T19:46:17.240 回答