当前位置: 首页 > 知识库问答 >
问题:

有没有一种合理准确的启发式方法来检测英语句子的主语和宾语?

云炜
2023-03-14

我意识到完美地将主语名词短语和宾语名词短语从句子中分离出来是一个开放的研究问题,在这里不容易解释,但有没有一种聪明的方法(假设我已经有一个带有词性标记的句子)适用于大多数句子,或者至少适用于相对简单的句子?我知道,简单地假设第一个名词短语是主语是一个很好的近似,但在以介词短语开头的句子中(例如,“穿过空地,穿过小溪,跑过受惊的鹿”。),这是失败的。理想情况下,我想要一个能识别这个主题的东西。

作为参考,该示例语句给出了斯坦福解析器的以下解析树:

[ROOT[S[PP[IN over][NP[NP[DT the][NN clearing][CC and][NP[IN through][NN stream][NP[DT the][NN VP[VBD run][NP DT the][ADJP[JJ feeder][NNS deer][

我目前的策略如下:

>

动词:在树上做一个BFS,寻找第一个VP。在这个子树上,执行BFS查找VB(D | G | N | P | Z)。

对象:在上面找到的VP子树上做BFS,寻找NP。

这个策略导致我的例子如下:主语:(NP(DT)(NN-stream)),动词:(VBD-ran),宾语:(NP(DT)(ADJP(JJ-fear))(NNS-deer))

如果可能的话,我想修改我的策略,以避免在这些情况下失败,并最终在更复杂的情况下失败。


共有2个答案

井镜
2023-03-14

我现在似乎无法证实这一事实,但在几周前的一次会议上,有人说英语中只有几千个动词。

似乎如果你能识别动词(用蛮力?),主语和宾语就会在它的两边。

巩俊远
2023-03-14

编辑:好的,您正在使用斯坦福解析器。然后解析器会给出结果。例如,如果我在伦敦的上运行它,我的朋友吃了一个大苹果和一个梨 我得到:

    (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))))
        (. .)))

那么主语是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)

告诉你主体(朋友)和直接客体(苹果、梨)的头部是什么。

显然,解析器并非没有错误,实际上在您的带有inversion的句子中(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)))
    (. .)))

正确的解析应该是

(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))
    (. .)))

然后您将正确识别受惊的鹿作为主题。

怎么办?您可以尝试通过在更多类似这样的句子上对解析器进行再培训来改进解析器(除了他们培训过的句子),但这是一项很大的工作。或者你也可以试着找出它不正确的句子类型,然后集中精力找出错误。也不容易。您也可以尝试不同的解析器,比如LinGO项目中使用的解析器,但使用起来要困难得多(我认为它需要lisp或类似的东西)

除了POS标签,我还会得到一个chunker,然后:

  • 主语是第一级名词短语。在你的句子中,NP是介词短语(PP)的一部分,所以你不会把它捡起来;由于存在反转,它仍然会失败
  • 宾语是紧跟在限定动词后面的(顶层)NP,如果有的话

根据chunker的不同,您可能会错过协调的NPs,可能会从他们的PPs中删除NPs(获取我的朋友,而不是我来自纽约的朋友)。

如果您负担不起运行chunker的费用,只需查找主语/宾语的头部:-N或主语代词(我们但不是我们),在有限动词之前(但请记住有像John and me to the store这样的句子。-N或宾语代词(我们但不是我们),如果有的话。您应该添加一个检查,即N是其中一部分的NP紧跟在动词之后,并且它不是PP的一部分)。假设您可以检查动词紧跟在(Det)((Adv)Adj)*N)

您还应该考虑问题(主语跟随有限动词,宾语跟随基本动词:你看到苹果了吗?)。您还可以通过要求主语并在动词之后查找来处理倒置,如果您之前没有找到它,但这会导致祈使句的问题(吃鹿!)。不确定这是否值得。

显然,一些稍微不寻常的句子,比如具有无限依赖性的句子,会让你感到不舒服(Kim,Sandy知道Chris trusts,其中Kimtrusts的对象)。如果在这种情况下需要合理的答案,则需要运行真正的解析器。

 类似资料:
  • 我在一个机器翻译项目中工作。为了继续我的工作,我需要识别句子的主语、动词、宾语。目前我正在使用斯坦福NLP解析器来分析这个句子。但我不知道如何提取SVO。我有什么想法可以考虑吗?

  • 我正在使用Jersey创建一个RESTful API,其中实现了一个ExceptionMapper类来捕获所有错误。 有没有办法从异常中获取查询字符串?或者实现PreparedStatement并在其中创建一个方法来获取查询字符串?

  • 我正在开发一个java程序,它接受输入的分数,给出输入的总数和平均值,但是我很难计算出如何获得当前输入的最高分数“我使用了大量嵌套的else-if语句,但必须有一种简单的方法来实现这一点,而不是键入100个else-if语句这是我的代码。我在else-if语句开始的地方添加了一条注释,以确定最高级别

  • 我已经回顾了类似的问题“查看并清除Postgres缓存/缓冲区?,但所有的答案都集中在数据缓冲区上,并且自2010年以来,Postgresql发生了很大变化。 与那个问题的OP不同,我不是在计算性能时寻找一致的行为,而是在数据库随时间变化时寻找自适应的行为。 在我的应用程序中,在作业执行开始时,工作表中的行为空。查询运行非常快,但是随着时间的推移,性能下降,因为准备好的语句没有使用理想的访问路径(

  • 在斯坦福解析器的文档中,给出了以下示例语句: 印度官员今天表示,印度有史以来最强的降雨导致金融中心孟买关闭,通讯线路中断,机场关闭,数千人被迫在办公室睡觉或在夜间步行回家。 这会产生解析树: [ROOT[S[NP[NP[DT The][JJS stress][NN rain][VP[ADVP[RB ever][VBN recorded][PP[IN IN][NP[NNP India]]]][VP[

  • 我正在使用ApacheOpenNLP库。我正在做一个项目,需要用不同的语言执行几个NLP任务,其中俄语是一个非常重要的任务。然而,我不懂俄语,也找不到任何适用于俄语的OpenNLP模型。 因此,我可以可靠地执行句子检测的唯一方法是在俄语文本上训练句子检测器并生成一个我稍后将使用的模型。我必须分析的文本非常具体,并且不够笼统,无法创建有效的模型。 因此,我想问是否有人能为我提供一份俄语参考文本,分为