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

3
我知道完美地从句子中分离主语名词短语和宾语名词短语是一个公开的研究问题,并且在这里不容易解释,但是是否有一种聪明的方法可以做到这一点(假设我已经有一个词性标注的句子),可以适用于大多数句子,或者至少是相对简单的句子?我知道简单地假设第一个名词短语是主语是一个相当好的近似值,但在以介词短语开头的句子中(例如,“Across the clearing and through the stream ran the frightened deer.”),这种方法会失败。理想情况下,我希望还能识别这种情况下的主语。
作为参考,该示例句子使用Stanford解析器生成以下解析树:
我的当前策略如下:
  1. 主语:在树上进行BFS,寻找第一个NP。

  2. 动词:在树上进行BFS,查找第一个VP。在此子树上,进行BFS查找VB(D|G|N|P|Z)。

  3. 宾语:在上面找到的VP子树上进行BFS,查找NP。

这个策略对于我的示例给出了以下结果: SUBJECT: (NP (DT the) (NN stream) ) , VERB: (VBD ran) , OBJECT: (NP (DT the) (ADJP (JJ frightened) ) (NNS deer) )。
如果可能的话,我希望修改我的策略,以使其不在这些情况下失败,并最终处理更复杂的情况。

你需要像http://nlp.stanford.edu/software/lex-parser.shtml这样的解析器。 - alvas
1
欢迎来到stackoverflow.com!你尝试过pattern's parse trees吗?它们有一个关系标志,可能可以帮助你得到想要的结果。 - arturomp
2个回答

6

编辑:好的,您正在使用斯坦福解析器。然后解析器会给出结果。例如,如果我在 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))))
        (. .)))

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

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

显然,解析器并非没有错误,在句子倒装(主语跟在动词后面)的情况下,它会感到困惑:

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

然后,你会正确地将the frightened deer识别为主语。
该怎么办?你可以尝试通过在更多类似的句子上重新训练解析器来改进它(除了它们已经训练过的那些),但这是很多工作量。或者你可以尝试识别它无法正确处理的句子类型,并专注于识别错误。也不容易。你也可以尝试使用不同的解析器,比如LinGO项目中使用的解析器,但它更难使用(我认为它需要lisp或类似的东西)
除了POS标记器,我还会得到一个块分析器,然后:
- 主语是第一个(顶级)NP(名词短语)。在你的“Across the clearing”句子中,NP将是介词短语(PP)的一部分,因此你不会注意到它;它仍然会失败,因为存在倒装。 - 如果有话题,则对象是紧随有限动词后面的(顶级)NP。
根据块分析器的不同,你可能会错过协调NP,可能会剥夺NP的PP(获取my friend而不是my friend from New York)。
如果你负担不起运行块分析器,只需查找主/谓语的头: - N或主语代词(we但不包括us),在有限动词之前(但要记住,存在像John and me went to the store这样的句子。 - N或宾格代词(us但不包括we),如果有的话。你应该添加一个检查,即N所属的NP紧随动词之后,并且它不是PP的一部分。假设你可以检查动词紧随(Det) ((Adv) Adj)* N) 你还应该考虑问题(其中主语跟随有限动词,宾语跟随基本动词:Do YOU see THE APPLE?)。你也可以通过要求一个主语并在动词之后寻找它来处理倒装,如果你没有在之前找到它,但这会导致命令式出现问题(Eat the deer!)。不确定是否值得。
显然,稍微不寻常的句子,如带有无界依赖性的句子,会使你失去平衡(Kim, Sandy knows Chris trusts,其中Kimtrusts的对象)。如果你需要在这种情况下得到合理的答案,你需要运行一个真正的解析器。

感谢您详细的回复。也许我应该再详细说明一下;我正在使用斯坦福CoreNLP,它给了我整个解析树,所以我可能不需要使用“分块器”。我对问题并不是特别关注,甚至对祈使句更不关心,我只想确保尽可能准确地提取“正常”句子的主语和宾语。正如您已经提到的,仅仅在动词后面取NP作为主语有时会失败,但我不确定我能做多少来解决这个问题。 - dwo
如果它给出了解析树,那么主语就是 S 下面的 NP(紧挨着 VP),而宾语则是 VP 下的第一个 NP(如果有的话)。就这样。 - Jirka
再次强调,这仅适用于简单的句子,我希望能够找到一种启发式方法,适用于更广泛的情况(例如我提供的主语在最后的例子),但完全有可能没有这种方法。 - dwo
除非解析器出错,否则您仍然可以通过在S下直接获取NP(无论其位置如何)来获取主题。您能发布该句子的括号树吗? - Jirka
解析器(englishPCFG.ser.gz)在您的句子上出现了错误。它认为stream是主语。如果在前置修饰语后面加上逗号(我认为这是美式英语的正确写法),它并没有什么帮助——解析器仍然认为该句子没有主语。 - Jirka
显示剩余3条评论

0

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

看起来,如果您可以(通过 brute force)确定动词,那么主语和宾语将位于其两侧。


我认为在当今的英语中这是不可能的,因为你有动词化的名词,例如“他谷歌了一些东西”。 - alvas
这可能是正确的(至少在合理的准确度范围内),但它无法处理主语出现在句子末尾的情况(就像我给出的例子一样)。 - dwo
1
他说这些句子已经进行了词性标注,因此无需再识别动词(此外,您需要知道该动词是否为有限动词)。 - Jirka
啊啊啊...POS就是“词性(part of speech)”。我知道它不是我首先想到的,但是死活想不出来! - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接