java - 如何使用 stanford-nlp 提供的 OpenIEDemo.java 生成自定义三元组

标签 java python nlp stanford-nlp

我已经训练了自定义 NER 和关系提取模型,并且我已经检查了使用 corenlp 服务器生成三元组,但是当我使用 OpenIEDemo.java 时 为了生成三元组,它生成仅具有关系“has”和“have”的三元组,但不生成我训练关系提取模型所依据的关系。

我在运行相同的脚本时加载自定义 NER 和关系提取模型。这是我的 OpenIEDemo.java 文件...

package edu.stanford.nlp.naturalli;

import edu.stanford.nlp.ie.util.RelationTriple;
import edu.stanford.nlp.io.IOUtils;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.semgraph.SemanticGraph;
import edu.stanford.nlp.semgraph.SemanticGraphCoreAnnotations;
import edu.stanford.nlp.util.CoreMap;
import edu.stanford.nlp.util.PropertiesUtils;

import java.util.Collection;
import java.util.List;
import java.util.Properties;

/**
 * A demo illustrating how to call the OpenIE system programmatically.
 * You can call this code with:
 *
 * <pre>
 *   java -mx1g -cp stanford-openie.jar:stanford-openie-models.jar edu.stanford.nlp.naturalli.OpenIEDemo
 * </pre>
 *
 */
public class OpenIEDemo {

  private OpenIEDemo() {} // static main

  public static void main(String[] args) throws Exception {

    Properties props = new Properties();
    props.setProperty("annotators", "tokenize, ssplit, pos, lemma, depparse, natlog, openie");
    props.setProperty("ner.model", "./ner/ner-model.ser.gz");
    props.setProperty("sup.relation.model", "./relation_extractor/relation_model_pipeline.ser.ser");
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props);

    // Annotate an example document.
    String text;
    if (args.length > 0) {
      text = args[0];
    } else {
      text = "Obama was born in Hawaii. He is our president.";
    }
    Annotation doc = new Annotation(text);
    pipeline.annotate(doc);

    // Loop over sentences in the document
    int sentNo = 0;
    for (CoreMap sentence : doc.get(CoreAnnotations.SentencesAnnotation.class)) {
      System.out.println("Sentence #" + ++sentNo + ": " + sentence.get(CoreAnnotations.TextAnnotation.class));

      // Print SemanticGraph
      System.out.println(sentence.get(SemanticGraphCoreAnnotations.EnhancedDependenciesAnnotation.class).toString(SemanticGraph.OutputFormat.LIST));

      // Get the OpenIE triples for the sentence
      Collection<RelationTriple> triples = sentence.get(NaturalLogicAnnotations.RelationTriplesAnnotation.class);

      // Print the triples
      for (RelationTriple triple : triples) {
        System.out.println(triple.confidence + "\t" +
            triple.subjectLemmaGloss() + "\t" +
            triple.relationLemmaGloss() + "\t" +
            triple.objectLemmaGloss());
      }

      // Alternately, to only run e.g., the clause splitter:
      List<SentenceFragment> clauses = new OpenIE(props).clausesInSentence(sentence);
      for (SentenceFragment clause : clauses) {
        System.out.println(clause.parseTree.toString(SemanticGraph.OutputFormat.LIST));
      }
      System.out.println();
    }
  }
}

提前致谢。

最佳答案

由于 stanfordCoreNLP 的 OpenIE 模块不使用自定义关系模型(不知道为什么),我无法在此代码中使用自定义关系提取模型,而是必须运行 SanfordCoreNLP 管道,在服务器中添加自定义 NER 和关系提取模型的路径.properties 文件并生成三元组。如果有人知道 OpenIE 不使用自定义关系提取模型的原因,请发表评论,这对其他人非常有用。

关于java - 如何使用 stanford-nlp 提供的 OpenIEDemo.java 生成自定义三元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56238567/

相关文章:

java - servlet 不会返回到上一页

java - 使用 JMX 获取远程 JVM 属性

python - Python 的 raw_input() 容易受到缓冲区溢出的影响吗?

machine-learning - NLP-句子切分

machine-learning - 用于文本分类的数据增强

javascript - 匹配大量不同的句子(使用正则表达式模式解析)

用于通过 ZMQ 套接字发送对象的 ZeroMQ 的 Java "Reference"解决方法

java - 在 voltdb 的存储过程中运行选择查询后出现错误

Python line_profiler 安装

python - 在 tf.Estimator 设置中使用 tf.metrics.precision/recall 计算 F1 分数