斯坦福CoreNLP管道中的java输入Penn树库组成树
我正在使用斯坦福NLP库中的OpenIE工具从句子中获取最小子句。以下是我到目前为止的想法(主要受他们的演示代码启发):
public static void main(String[] args) {
Properties props = new Properties();
props.setProperty("annotators", "tokenize,ssplit,pos,lemma,depparse,natlog,openie");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
Annotation doc = new Annotation("Obama was born in Hawaii. He is our president.");
pipeline.annotate(doc);
for (CoreMap sentence : doc.get(CoreAnnotations.SentencesAnnotation.class)) {
OpenIE split = new OpenIE(props);
List<SentenceFragment> clauses = split.clausesInSentence(sentence);
for (SentenceFragment clause : clauses) {
List<SentenceFragment> short_clauses = split.entailmentsFromClause(clause);
for (SentenceFragment short_clause : short_clauses){
System.out.println(short_clause.parseTree);
}
}
}
}
我现在想使用PTB组成树作为输入,而不是纯文本,然后只使用depparse、natlog和openie注释器来获取子句
我知道我可以使用PTB树作为斯坦福解析器的输入(如here所述),但还没有弄清楚如何将其集成到管道中
# 1 楼答案
我觉得这其实很平常。如果有人有一个干净的方法来做这件事在管道中,插嘴!但是,如果我要这么做,我可能会手动调用代码的组件位。这意味着:
从选区树中的
GrammaticalStructure
创建一个SemanticGraph
对象向语义图中的每个
IndexedWord
添加引理注释。这可以通过在每个令牌上调用Morphology#lemma(word, posTag)
,并将LemmaAnnotation
设置为该值来实现运行自然逻辑注释器将是一件棘手的事情。一个选项是模拟注释对象,并通过通常的
annotate()
方法推送它。但是,如果您不太关心OpenIE系统识别否定,您可以通过向PolarityAnnotation
键上的SemanticGraph
中的每个标记添加值Polarity#DEFAULT
来跳过这个注释器现在,依赖关系树应该可以通过OpenIE注释器了。你想在这里打三个电话:
OpenIE#clausesInSentence(SemanticGraph)
将从给定的图生成子句集合李>OpenIE#entailmentsFromClause(SentenceFragment)
将从每个子句生成简短的蕴涵。您希望将上述函数的每个输出传递到该函数中,并收集所有结果片段李>OpenIE#relationsInFragment(SentenceFragment)
将一个短的蕴涵分割成一个关系三元组。它返回一个Optional
大多数片段不会分割成任何三元组。您希望将从上述调用中收集的每个短蕴涵传递到此函数中,并收集此函数输出中定义的关系三元组。这是你的OpenIE三元组李>出于好奇,你到底想做什么?也许有更简单的方法来实现同样的目标