斯坦福CoreNLP中文共指解决方案

时间:2017-10-29 03:18:14

标签: stanford-nlp

我想使用stanford coreNLP处理一些中文Coreference解析。我的代码如下:

import java.util.Properties;
import edu.stanford.nlp.coref.CorefCoreAnnotations;
import edu.stanford.nlp.coref.data.CorefChain;
import edu.stanford.nlp.coref.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;

public class CorefTest {
  public static void main(String[] args) throws Exception {
    StanfordCoreNLP pipline = new StanfordCoreNLP("StanfordCoreNLP-chinese.properties");
    Annotation document = new Annotation("奥巴马出生在夏威夷,他是美国总统,他在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);
       }
    }
  }
}

它给出了结果:

---
coref chains
---
mentions
    奥巴马出生在夏威夷 , 他是美国总统 , 他在2008年当选

在coref链中没有任何内容,我确实设置了正确的环境,它确实支持中文,但我怎样才能使coref链正确?

1 个答案:

答案 0 :(得分:0)

您在代码中创建了两次管道。

注意:请务必将其添加到您的代码中:

import edu.stanford.nlp.util.StringUtils;

你的代码应该是这样的:

Properties props = StringUtils.argsToProperties("-props", "StanfordCoreNLP-chinese.properties");
props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,mention,coref");
StanfordCoreNLP pipeline = new StanfordCoreNLP(props);