有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

斯坦福CoreNLP管道中的java输入Penn树库组成树

我正在使用斯坦福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树作为斯坦福解析器的输入(如here所述),但还没有弄清楚如何将其集成到管道中


共 (1) 个答案

  1. # 1 楼答案

    我觉得这其实很平常。如果有人有一个干净的方法来做这件事在管道中,插嘴!但是,如果我要这么做,我可能会手动调用代码的组件位。这意味着:

    • 从选区树中的GrammaticalStructure创建一个SemanticGraph对象

    • 向语义图中的每个IndexedWord添加引理注释。这可以通过在每个令牌上调用Morphology#lemma(word, posTag),并将LemmaAnnotation设置为该值来实现

    • 运行自然逻辑注释器将是一件棘手的事情。一个选项是模拟注释对象,并通过通常的annotate()方法推送它。但是,如果您不太关心OpenIE系统识别否定,您可以通过向PolarityAnnotation键上的SemanticGraph中的每个标记添加值Polarity#DEFAULT来跳过这个注释器

    • 现在,依赖关系树应该可以通过OpenIE注释器了。你想在这里打三个电话:

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

    出于好奇,你到底想做什么?也许有更简单的方法来实现同样的目标