這是另外一套基於CRF的詞法分析系統,相似感知機詞法分析器,提供了完善的訓練與分析接口。前端
CRF的效果比感知機稍好一些,然而訓練速度較慢,也不支持在線學習。java
默認模型訓練自OpenCorpus/pku98/199801.txt,隨hanlp 1.6.2以上版本發佈。緩存
語料格式等與感知機詞法分析器相同,請先閱讀《感知機詞法分析器》。函數
中文分詞學習
訓練.net
CRFSegmenter segmenter = new CRFSegmenter(null);blog
segmenter.train("data/test/pku98/199801.txt", CWS_MODEL_PATH);接口
輸出爲HanLP私有的二進制模型,有興趣的話還能夠經過命令導出爲兼容CRF++的純文本格式。內存
java -cp hanlp.jar com.hankcs.hanlp.model.crf.crfpp.crf_learn -T cws.bin cws.txtget
與CRF++兼容
因爲C++的運行效率和內存效率優於Java,因此推薦直接利用CRF++執行大規模訓練。
首先將人民日報語料轉換爲CRF++格式:
CRFSegmenter segmenter = new CRFSegmenter(null);
segmenter.convertCorpus("data/test/pku98/199801.txt", "data/test/crf/cws-corpus.tsv");
而後準備一份特徵模板,或者直接用HanLP默認的:
segmenter.dumpTemplate("data/test/crf/cws-template.txt");
接着用CRF++的crf_learn執行訓練:
crf_learn cws-template.txt cws-corpus.tsv cws -t
·此處必須使用-t命令CRF++輸出文本格式的模型cws.txt
·HanLP只兼容CRF++的文本模型,不兼容二進制
將cws.txt格式的模型傳入CRFSegmenter或CRFLexicalAnalyzer的構造函數便可建立分詞器,同時HanLP會自動建立二進制緩存.txt.bin,下次加載耗時將控制在數百毫秒內。
預測
可經過以下方式加載:
CRFSegmenter segmenter = new CRFSegmenter(CWS_MODEL_PATH);
List<String> wordList = segmenter.segment("商品和服務");
System.out.println(wordList);
不傳入模型路徑時將默認加載配置文件指定的模型。
詞性標註
CRF詞性標註器的訓練與加載與中文分詞相似,對應CRFPOSTagger。
命名實體識別
CRF命名實體識別也是相似的用法,對應CRFNERecognizer。
CRF詞法分析器
訓練了1至3個模型後,能夠構造CRF詞法分析器:
/**
* 構造CRF詞法分析器
*
* @param cwsModelPath CRF分詞器模型路徑
* @param posModelPath CRF詞性標註器模型路徑
* @param nerModelPath CRF命名實體識別器模型路徑
*/
public CRFLexicalAnalyzer(String cwsModelPath, String posModelPath, String nerModelPath) throws IOException
/**
* 加載配置文件指定的模型
*
* @throws IOException
*/
public CRFLexicalAnalyzer() throws IOException
構造後能夠調用analyze接口或與舊接口兼容的seg:
CRFLexicalAnalyzer analyzer = new CRFLexicalAnalyzer();
String[] tests = new String[]{
"商品和服務",
"上海華安工業(集團)公司董事長譚旭光和祕書胡花蕊來到美國紐約現代藝術博物館參觀",
"微軟公司於1975年由比爾·蓋茲和保羅·艾倫創立,18年啟動以智慧雲端、前端為導向的大改組。" // 支持繁體中文
};
for (String sentence : tests)
{
System.out.println(analyzer.analyze(sentence));
System.out.println(analyzer.seg(sentence));
}
在1.6.2以上版本中,全部的詞法分析接口都同時支持簡繁。