与corenlp相关的共识解决方案可怕

时间:2016-04-21 14:54:06

标签: java stanford-nlp

我遇到了问题,我想解决文档的共指问题,我正在尝试运行以下link提供的示例

import edu.stanford.nlp.hcoref.CorefCoreAnnotations;
import edu.stanford.nlp.hcoref.data.CorefChain;
import edu.stanford.nlp.hcoref.data.Mention;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.util.CoreMap;

import java.util.Properties;

public class CorefExample {

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

    Annotation document = new Annotation("Barack Obama was born in Hawaii.  He is the president.  Obama was elected in 2008.");
    Properties props = new Properties();
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,mention,coref");
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
    pipeline.annotate(document);
    System.out.println("---");
    System.out.println("coref chains");
    for (CorefChain cc : document.get(CorefCoreAnnotations.CorefChainAnnotation.class).values()) {
      System.out.println("\t"+cc);
    }
    for (CoreMap sentence : document.get(CoreAnnotations.SentencesAnnotation.class)) {
      System.out.println("---");
      System.out.println("mentions");
      for (Mention m : sentence.get(CorefCoreAnnotations.CorefMentionsAnnotation.class)) {
        System.out.println("\t"+m);
       }
    }
  }
}

只有一个句子要解决,这是我的程序运行大约一个小时。这是正常的吗? 得到结果花了我一个小时

我使用此选项运行程序:-Xmx4g

2 个答案:

答案 0 :(得分:0)

您是否尝试使用6GB内存?在documentation中,他们提到CoreNLP的新版本正在使用神经网络进行共参考分辨率,因此它比基于规则的算法要慢,而且需要更多的RAM。在我的情况下,它很慢,内存耗尽了两个句子和4 GB RAM。

英文神经系统的示例命令使用5GB作为3.7.0 CoreNLP版本:

java -Xmx5g -cp stanford-corenlp-3.7.0.jar:stanford-corenlp-models-3.7.0.jar:* edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,parse,mention,coref -coref.algorithm neural -file example_file.txt

您也可以尝试使用参数指定您喜欢的算法:

coref.algorithm

例如,

PropertiesUtils.asProperties("annotators", "your annotators","coref.algorithm","neural");

有三种可供选择的方法。

basic示例代码中,他们使用“ dcoref ”而不是“ coref ”作为共参考分辨率注释器,这是确定性方法,这更快,更准确。

答案 1 :(得分:0)

我没有遇到这个特殊问题,但也使用 CoreNLP 和 coref 作为注释器属性耗尽了堆空间。问题是我多次创建 new StanfordCoreNLP(props),而不是使用同一个对象。