我正在寻找一种将复杂句子分段为子句的好工具。由于我使用CoreNLP工具进行解析,因此我知道OpenIE在从句子中提取关系三元组的过程中处理子句分段。目前,我使用的是github repository的OpenIEDemo类中提供的示例代码,但它不能正确地将句子分成子句。
这是代码:

// Create the Stanford CoreNLP pipeline
Properties props = PropertiesUtils.asProperties(
        "annotators", "tokenize,ssplit,pos,lemma,parse,natlog,openie");

StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
//Annotate sample sentence
text = "I don't think he will be able to handle this.";

Annotation doc = new Annotation(text);
pipeline.annotate(doc);

// Loop over sentences in the document
int sentNo = 0;
for (CoreMap sentence : doc.get(CoreAnnotations.SentencesAnnotation.class)) {
      List<SentenceFragment> clauses = new OpenIE(props).clausesInSentence(sentence);
  for (SentenceFragment clause : clauses) {
    System.out.println("Clause: "+clause.toString());
  }
}


我期望get as output三个子句:


我不认为
他将能够
处理这个


而是,代码返回完全相同的输入:


我认为他不会处理这个


但是,这句话


  奥巴马出生于夏威夷,他不再是我们的总统。


得到两个子句:


奥巴马出生于夏威夷,不再担任我们的总统
他不再是我们的总统


(似乎协调连接是很好的细分指标)

OpenIE通常用于子句​​分段吗?如果是,如何正确执行呢?

欢迎使用任何其他用于子句分段的实用方法/工具。提前致谢。

最佳答案

因此,子句分段器与OpenIE的集成要比其名称所暗示的更加紧密。该模块的目标是产生逻辑上必要的从句,然后可以将其缩短为逻辑上必要的句子片段。看两个例子:



  我认为他将无法应付。


我认为这三个子句中没有一个与原始句子相关:


“我不认为”-即使您认为某些事情不正确,您仍可能会“思考”。
“他将有能力”-如果您“认为世界是平坦的”,那并不意味着世界是平坦的。同样,如果您“认为他可以”,那并不意味着他就可以。
“处理”-我不确定这是一个子句...我将其与“他将能够处理”分组,并将“能够”视为一个动词。


  奥巴马出生于夏威夷,他不再是我们的总统。


当然,这两个条款应该是“奥巴马出生在夏威夷”和“他不再是我们的总统”。但是,子句拆分器将输出原始句子代替第一个子句,以期OpenIE提取器的下一步将去除“ conj:and”边缘。

10-08 19:41