在斯坦福CoreNLP管道中输入宾州树库成分树。

3
我正在使用斯坦福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成分树作为输入,而不是纯文本,然后仅使用depparsenatlogopenie注释器来获取从句。
我知道可以将PTB树作为输入传递给斯坦福解析器(如此处所述),但尚未找出如何将其集成到流水线中。
1个回答

2

我认为这其实不是一个简单的问题。如果有人了解如何在管道中干净地完成此操作,请加入讨论!但是,如果我要做到这一点,我可能会手动调用组件代码。具体步骤如下:

  • 从组成树的GrammaticalStructure创建一个SemanticGraph对象。

  • 为语义图中的每个IndexedWord添加词形标注。可以通过对每个令牌调用Morphology#lemma(word, posTag)来完成此操作,并将LemmaAnnotation设置为该值。

  • 运行自然逻辑标注器可能很棘手。其中一种选项是模拟一个注释对象并将其推送到通常的annotate()方法中。但是,如果您不太关心OpenIE系统是否能够识别否定,那么您可以通过将值Polarity#DEFAULT添加到SemanticGraph上的每个令牌的PolarityAnnotation键来跳过此注释器。

  • 现在,您的依赖树应该已经准备好通过OpenIE标注器。您需要进行三次调用:

    • OpenIE#clausesInSentence(SemanticGraph)将从给定图形生成一组子句。
    • OpenIE#entailmentsFromClause(SentenceFragment)将从每个子句中生成简短的蕴含。您需要将上述函数的每个输出传递到此函数中,并收集所有结果片段。
    • OpenIE#relationsInFragment(SentenceFragment)将把短蕴含分割成三元组关系。它返回一个Optional——大多数片段不会分割成任何三元组。您需要将上述调用收集的每个短蕴含传递到此函数中,并收集在该函数的输出中定义的关系三元组。这些就是OpenIE三元组。

出于好奇,您最终想要做什么?也许有一种更简单的方法可以实现相同的目标。


我正在尝试从PTB语料库中获取从句,以将它们用作微观规划任务的输入。我只需要从句而不是三元组。我该如何模拟一个注释对象以便能够调用annotate()方法? - VictorC
好的,那么您可以跳过自然逻辑注释--只需将默认极性添加到每个标记中即可。您也可以跳过OpenIE中的最后两个调用,只需调用OpenIE#clausesInSentence(SemanticGraph)即可。但是您仍然需要引用词形变化。另一个选择是直接使用Penn Treebank中的痕迹--这正是从句分裂器训练的内容。 - Gabor Angeli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接