1. 程式人生 > >使用Java呼叫Stanford CoreNLP 進行中文分詞

使用Java呼叫Stanford CoreNLP 進行中文分詞

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