假设有这样一个句子:
On March 1, he was born.
将其改为:
He was born on March 1.
不会破坏句子的意义,并且仍然有效。以任何其他方式打乱词语会产生奇怪甚至无效的句子。 所以基本上,我讨论的是句子的各个部分,这些部分使信息更具体,但删除它们不会破坏整个句子。 是否有任何 NLP 库可以识别这些部分?
回答:
成分 (Constituents)
听起来你想要识别句子的成分(constituents),这些成分是根据语言语法作为一个单元运行的词语组合。
事实上,当语言学家试图发现一种语言的语法时,他们部分地通过观察移动(movement)来实现。 就像你的例子一样,当一组词语可以移动到句子中的不同位置,同时仍然保留句子的含义时,就会发生这种情况。
成分可以是单个词语、短语,甚至更大的组,例如整个从句。 在一个句子中,它们具有嵌套的层级结构。 例如,你给出的第一个例句可以分析为:
(S (PP (IN On) (NP (NNP March) (CD 1))) (NP (PRP he)) (VP (VBD was) (VP (VBN born))))
整个句子由一个介词短语,后跟一个名词短语,然后是一个动词短语组成。 介词短语可以进一步分解为一个由单个词“On”和一个名词短语组成的单元。
短语结构解析器
要自动查找成分,你可能需要使用短语结构解析器。 有很多这样的解析器可供选择,它们都是开源的,包括:
- Stanford Parser(Java)
- Berkeley Parser(Java)
- BLLIP (Charniak-Johnson) Parser(C++)
- Bikel Parser(这是用 Java 编写的 Collins 解析器的重新实现和改进版本)
- Collins Parser(C++)
- OpenNLP Parser(Java)
- SharpNLP Parser(C#)
Stanford 和 Berkeley 解析器可能最容易安装和使用。 正如Cer et al. 2010中看到的那样,最准确的解析器是 Berkeley 和 Charniak。 Bikel 解析器比其他解析器慢且准确性较低。
在线演示
这里有 Stanford 解析器的在线演示。 我使用该演示生成了上面给出的示例句子的解析结果。
关于删除的注意事项
在每个成分中,都会有一个中心词。 例如,采用名词短语:
(NP (DT The) (JJ big) (JJ blue) (NN ball))
这里的中心词是名词ball
,它由形容词big
和blue
修饰。 如果这个名词短语嵌入在一个句子中,你可以删除这些修饰语,仍然得到一些与原始句子的含义一致但不太具体的东西。
在名词短语中,通常可以删除形容词、非中心词的名词和嵌套的介词短语。
在动词短语和完整从句中,事情变得更加棘手,因为删除作为动词参数的材料可能会完全改变句子的解释。 例如,从He sold Jim the book
中删除the book
会导致He sold Jim
。