我正在使用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设置为此来完成。
  • 通过自然逻辑注释器运行将很棘手。一种选择是模拟Annotation对象,并将其通过常规的annotate()方法推送。但是,如果您不太关心OpenIE系统识别否定字词,则可以通过将Polarity#DEFAULT值添加到SemanticGraph键上PolarityAnnotation中的每个标记中来跳过此注释器。
  • 现在,您的依赖关系树应该可以通过OpenIE注释器了。您要在这里打三个电话:
  • OpenIE#clausesInSentence(SemanticGraph)将根据给定的图生成子句的集合。
  • OpenIE#entailmentsFromClause(SentenceFragment)将为每个子句生成简短的内容。您想将上述函数的每个输出传递给它,并收集所有产生的片段。
  • OpenIE#relationsInFragment(SentenceFragment)将把一个简短的需求细分为一个关系三元组。它返回一个Optional-大多数片段不会分段成任何三元组。您希望将上述调用中收集的每个简短内容传递给此函数,并收集在此函数的输出中定义的三元关系。这些是您的OpenIE三元组。

  • 出于好奇,您到底打算做什么?也许有一种更简单的方法可以实现相同的目标。

    10-01 22:08