Stanford Corenlp是斯坦福大学的自然语言处理工具,其中中文分词是基于条件随机场CRF (Conditional Random Field) ,不是基于字典的直接匹配。最近调用Stanford Word Segmenter进行中文分词时,发现一些tokens切割不符合我们的预期,比如“大数据”被切分为“大 / 数据”,“信息安全”切分为“信息 / 安全”, “草泥马”被切分为草 / 泥马。我们希望将某些特定的词作为一个token来处理,因此想通过增加自定义词典(扩展词典)来实现。
一.网络上已有的资源
为了解决Stanford Corenlp中文分词自定义词典问题,前后耗费了大概有2- 3天的时间,几乎查找了内外网所有相关的资源,为了避免后面的童鞋再走弯路,下面归纳分析网络上关于此问题的资源:
1. Stanford Corenlp + IKAnalyzer
https://www.cnblogs.com/whuqin/p/6149742.html (还有一系列雷同文章)
这个方法看起来好像有些可行,模仿ChineseSegmenterAnnotator实现IKSegmentAnnotator,比较了这两个类,主要区别在于这两个方法
IKSegmentAnnotator
private List<String> splitWords(String str) throws Exception{...}
ChineseSegmenterAnnotator
private void splitCharacters(CoreMap annotation) {...}
我认为该方法就是把stanford的分词器(基于CRF)换成了IKAnalyzer的分词器IKSegmenter(基于词典匹配),代码不全,也没有任何注释,还要研究IKAnalyzer指定扩展词典和删除词典。对于仅应用分词而非研究分词的人来说,很难搞清楚,反正我是没运行成功,如果有小伙伴明白这种处理方法,请多多指教。
2. 引入自定义词典
https://blog.csdn.net/dushenzhi/article/details/8734173
下面把这段代码我能看懂的部分进行解释
java -mx1g -cp seg.jar edu.stanford.nlp.ie.crf.CRFClassifier
//-mx1g 指定运行内存
//-cp 或者-classpath也可以,指定jar包路径
/* seg.jar分词jar包,在stanford-segmenter-2018-10-16文件夹下面,我下载下来的分词jar包命名是 stanford-segmenter-3.9.2.jar*/
-sighanCorporaDict data
-loadClassifier data/ctb.gz
-testFile preprocess-$1.txt //测试文件,即要分词的文本
-inputEncoding UTF-8 //urf-8编码
-sighanPostProcessing true
-serDictionary data/dict-chris6.ser.gz,data/cedict.txt,data/ntusd.txt
//分词词典为原词典data/dict-chris6.ser.gz和自定义的词典data/cedict.txt,data/ntusd.txt(自定义词典可以有多个)
-keepAllWhitespaces false >$1_seged.txt
//分词结果