在斯坦福CoreNLP管道中输入Penn Treebank组成树

时间:2015-12-08 22:51:11

标签: java nlp stanford-nlp

我正在使用斯坦福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 个答案:

答案 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三元组。

出于好奇,你到底想做什么?也许有一种更容易实现同一目标的方法。