我正在使用Stanford 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所述),但是还没有弄清楚如何将其集成到管道中。
最佳答案
我认为这实际上是不平凡的。如果有人有干净的方法在管道中执行此操作,请发出提示!但是,如果要这样做,则可能只是手动调用代码的组成部分。这表示:
SemanticGraph
创建GrammaticalStructure
对象。 IndexedWord
添加一个引理注解。可以通过在每个 token 上调用Morphology#lemma(word, posTag)
并将LemmaAnnotation
设置为此来完成。 annotate()
方法推送。但是,如果您不太关心OpenIE系统识别否定字词,则可以通过将Polarity#DEFAULT
值添加到SemanticGraph
键上PolarityAnnotation
中的每个标记中来跳过此注释器。 OpenIE#clausesInSentence(SemanticGraph)
将根据给定的图生成子句的集合。 OpenIE#entailmentsFromClause(SentenceFragment)
将为每个子句生成简短的内容。您想将上述函数的每个输出传递给它,并收集所有产生的片段。 OpenIE#relationsInFragment(SentenceFragment)
将把一个简短的需求细分为一个关系三元组。它返回一个Optional
-大多数片段不会分段成任何三元组。您希望将上述调用中收集的每个简短内容传递给此函数,并收集在此函数的输出中定义的三元关系。这些是您的OpenIE三元组。 出于好奇,您到底打算做什么?也许有一种更简单的方法可以实现相同的目标。