我正在使用斯坦福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所解释的那样),但还没有弄清楚如何将它集成到管道中。
答案 0 :(得分:2)
我认为这实际上是非常重要的。如果某人有一个干净的方式在管道中这样做,请加入!但是,如果我这样做,我可能只是手动调用组件代码。这意味着:
从选区树的SemanticGraph
创建一个GrammaticalStructure
对象。
在语义图中为每个IndexedWord
添加一个引理注释。这可以通过在每个令牌上调用Morphology#lemma(word, posTag)
并将LemmaAnnotation
设置为此来完成。
运行自然逻辑注释器会很棘手。一种选择是模拟Annotation对象并将其推送到通常的annotate()
方法。但是,如果您不太关心承认否定的OpenIE系统,可以通过在Polarity#DEFAULT
SemanticGraph
上的每个标记中添加值PolarityAnnotation
来跳过此注释器。键。
现在你的依赖树应该准备好通过OpenIE注释器了。你想在这里打三个电话:
OpenIE#clausesInSentence(SemanticGraph)
将生成给定图表中的子句集合。OpenIE#entailmentsFromClause(SentenceFragment)
将从每个条款中产生短暂的蕴涵。您希望将上述函数中的每个输出传递给此函数,并收集所有生成的片段。OpenIE#relationsInFragment(SentenceFragment)
会将短暂的蕴涵分为三联系。它返回Optional
- 大多数片段不会分段为任何三元组。您希望将从上述调用中收集的每个简短蕴涵传递给此函数,并收集在此函数的输出中定义的关系三元组。这些是你的OpenIE三元组。出于好奇,你到底想做什么?也许有一种更容易实现同一目标的方法。