我正在寻找一种将复杂句子分段为子句的好工具。由于我使用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”边缘。