使用Java调用Stanford CoreNLP 进行中文分词

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34613450/article/details/84317158

Stanford CoreNLP 进行中文分词
中文分词的工具有很多,使用斯坦福的CoreNLP进行分词的教程网上也不少,本篇博客是记录自己在使用Stanford CoreNLP进行中文分词的学习笔记。

1. 工具准备
1.1 下载NLP相关包:
网址: https://stanfordnlp.github.io/CoreNLP/index.html 
需要下载的包看下图: 

è¿éåå¾çæè¿°
1.2 准备jar包
将下载下来的stanford-corenlp-full-2016-10-31解压,在工程中导入以下jar: 
1、stanford-corenlp-full-2016-10-31/ejml-0.23.jar (斜杠前面是目录。。。) 
2、stanford-corenlp-full-2016-10-31/stanford-corenlp-3.7.0.jar 
3、stanford-chinese-corenlp-2016-10-31-models.jar

2.分词
本篇文章仅仅记录分词,其他的功能后续在更新,注意JDK要1.8以上。

package Seg;

import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.util.CoreMap;
import edu.stanford.nlp.util.StringUtils;

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

/**
 * Created by dd on 2017/6/8.
 * 斯坦福NLP 包,中文分词和英文分词
 */
public class Segmentation {

    public void segInCh(String text){
        //载入properties 文件
//        StanfordCoreNLP pipline = new StanfordCoreNLP("StanfordCoreNLP-chinese.properties");

        //1.2 自定义功能 (1)
//        Properties properties = new Properties();
//        properties.setProperty("annotators", "tokenize, ssplit, pos, lemma, ner, parse, dcoref");
//        StanfordCoreNLP pipline = new StanfordCoreNLP(properties);

        //自定义功能(2) 自己在项目中建一个properties 文件,然后在文件中设置模型属性,可以参考1中的配置文件
        String[] args = new String[] {"-props", "properies/CoreNLP-Seg-CH.properties"};
        Properties properties = StringUtils.argsToProperties(args);
        StanfordCoreNLP pipline = new StanfordCoreNLP(properties);

        //自定义功能(3)
        /*
        StanfordCoreNLP pipline = new StanfordCoreNLP(PropertiesUtils.asProperties(
                "annotators", "tokenize,ssplit",
                "ssplit.isOneSentence", "true",
                "tokenize.language", "zh",
                "segment.model", "edu/stanford/nlp/models/segmenter/chinese/ctb.gz",
                "segment.sighanCorporaDict", "edu/stanford/nlp/models/segmenter/chinese",
                "segment.serDictionary", "edu/stanford/nlp/models/segmenter/chinese/dict-chris6.ser.gz",
                "segment.sighanPostProcessing", "true"
        ));
        */
        //创建一个解析器,传入的是需要解析的文本
        Annotation annotation = new Annotation(text);

        //解析
        pipline.annotate(annotation);

        //根据标点符号,进行句子的切分,每一个句子被转化为一个CoreMap的数据结构,保存了句子的信息()
        List<CoreMap> sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class);

        //从CoreMap 中取出CoreLabel List ,打印
        for (CoreMap sentence : sentences){
            for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)){
                String word = token.get(CoreAnnotations.TextAnnotation.class);
                System.out.println(word);
            }
        }
    }
}


2.2 测试

    String shortText = "硕士研究生产";
    @Test
    public void testSegCh(){
        Segmentation segmentation = new Segmentation();
        segmentation.segInCh(shortText);
    }



2.3 运行结果

è¿éåå¾çæè¿°

3.参考:
1: http://blog.csdn.net/churximi/article/details/51219394 
2: https://blog.sectong.com/blog/corenlp_segment.html

展开阅读全文

没有更多推荐了,返回首页