前段时间做Lucene相关的搜索引擎,它自带的中文分词工具不是很好,所以用到了IKAnalyzer,IKAnalyzer是林良益前辈开发的中文分词工具,它是基于词典的分词器,我花了一些时间看源码,简单总结一下流程:
1:加载词典
IKAnalyzer中主要包括3个词典:主词典,量词词典和停词词典
字典是以字典树(前缀树)存储的,当子节点树<3时,用数组存储(二分查找),节约存储空间,当子节点数>3时,用hashmap存储(直接存储),保证匹配效率
2:预处理
输入读到缓冲区,移动缓冲区指针,对指针所指字符串进行处理,规格化,全角转半角,大写转小写,类型判断(字符类型)
3:交由子分词器处理
有3个子分词器,LetterSegmenter(英文,阿拉伯字母),CN_QuantifierSegmenter(中文数词,量词),
CJK_Segmenter(中日韩文子分词器)
这3个处理流程都差不多,以CJK_Segmenter为例,它分smart和非smart模式,smart模式就是细粒度切分,根据词典,把能分出来的都分出来。非smart模式是对smart模式的一种后续处理,是对细粒度的一种过滤。
这3个分词器相互独立,各自生成各自的分词结果,放到分词候选集里,最后进行歧义处理,歧义处理中有一些定死的原则,比如:匹配长度越长越好,词的数量越少越好,路径跨度越长越好
4:后续处理
处理遗漏的中文字符,处理数量词
若中文量词刚好出现在中文数词的后面或者中文量词刚好出现在阿拉伯数字的后面,则把数词和量词合并,比如 九寸,十二亩