Tree 如何从复句中提取主要的主语和宾语短语?

Tree 如何从复句中提取主要的主语和宾语短语?,tree,nlp,stanford-nlp,Tree,Nlp,Stanford Nlp,在斯坦福解析器的文档中,给出了以下示例语句: 印度有史以来最强的降雨导致金融中心关闭 在孟买,通讯线路中断,机场关闭,被迫关闭 成千上万的人在上班时间睡在办公室或步行回家 官员们今天说是晚上 这将生成解析树: [词根[S[NP[NP[DT The][JJS estest][NN rain][VP[ADVP[RB] 曾经]][VBN录制][PP[IN][NP[NNP印度]]]]][VP[VP[VBD] 关闭][PRT[RP down][NP[NP[DT the][JJ financial][NN

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

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

这将生成解析树:

[词根[S[NP[NP[DT The][JJS estest][NN rain][VP[ADVP[RB] 曾经]][VBN录制][PP[IN][NP[NNP印度]]]]][VP[VP[VBD] 关闭][PRT[RP down][NP[NP[DT the][JJ financial][NN hub]][PP [孟买国家警察局][NP[NNP孟买国家警察局]]][,][VP[VBD抓拍][NP[NN] 通讯][NNS线路]]][,][VP[VBD关闭][NP[NNS] 机场]]][CC和][VP[VBD强制][NP[NP[NNS千]][PP [IN of][NP[NNS people]]][S[VP[TO][VP[VP[VB sleep][PP [IN IN][NP[PRP$ITS][NNS办公室]]][CC或][VP[VB步行][NP [NN home]][PP[IN during][NP[DT the][NN night]]]]] [,][NP[NNS官员]][VP[VBD said][NP-TMP[NN today]][。 .]]

(见附件)

哪种NLP工具能够从上述复句示例输出句子主语和宾语?所需输出:

sentence_subj_phrase = "the strongest rain ever recorded in India"
sentence_obj_phrase = "the financial hub of Mumbai"
来自原OP的帖子(只是关于他认为不起作用的细节):

提取句子中主语和宾语的一种简单方法是找出动词前后的名词短语。然而,在复杂的句子中,有多个动词,因此有多个主语和宾语。可以把这样的复合句看作是多个句子(使用独立子句的第一部分作为“根”,用从属子句替换第二部分),但通常第一句是最重要的,可以被认为是句子的主要“话题”。
做一个简单的BFS,找出动词前的第一个NP将导致“官员”成为主语,因为它处于最低的深度。这并没有抓住包含主语的第一个子句的直觉。我尝试的一种方法是在第一个“基本”节点(即,以S节点为根的最低级别子树)中搜索NPs,但在本例中,这将捕获以S3为根的节点。

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


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

需要注意的是,当你谈论语法主语和宾语时,他们遵循的是大多数NLP任务都遵循的语言学理论

接下来,当你谈论语法主语和宾语时,你应该只提及实体(即事物/事件)本身,不包括实体修饰语: “印度有史以来最强的降雨”

然后,我们来讨论NLP任务,即如何检测
EP_mod

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

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

  • 最后,您需要找到短语的修饰符,该短语包含主谓词的sub/OBJ实体(可能您需要找到一个依赖项解析器(斯坦福解析器是一个依赖项解析器),该解析器为您提供注释,说明
    sub\u短语支配修饰符\u短语


  • 您需要的是当前现有工具的混合,因此最好的解决方案是解决方案。玩得开心=)

    这里有一个Python Spacy方法:

    代码 结果
    这是什么!!!这是一个问题,还是问题本身的混乱答案???人们会厌倦正确地回答你的问题。这是一个实际的问题(如你在最后一段中所看到的),但我觉得我需要解释一下我试图做的事情,然后才能理解它。如果这有助于澄清,我可以把问题本身放在更接近开始的地方。这很公平,但我不明白为什么这需要否决这个问题,因为以前没有人以这种形式提出过这个问题,也可能对其他人进行这类信息提取有用。我不支持否决你的问题。我知道这个句子中有多个语法主语和宾语(正如我所说的),但我正试图确定选择其中一个的最佳方式(是的,这会丢失一些信息)。您是否有理由选择最左边的子树而不是最上面的子树(即“嵌套”最少的子树)?或者它是如此依赖于特定的句子,以至于你只是随意地提出这个问题?这不是随意的,因为你说你想找到第一个:“这并没有抓住包含主语的第一个从句的直觉。”你提出的算法都没有找到句子中最左的限定动词的主语,就是你声称要找的那个。对于可靠地找到某种主题来说,这显然是不够的。谢谢
    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"
    
    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]