文章来源:http://blog.sina.com.cn/s/blog_700848850101gvt5.html
IK正向迭代最细粒度切分算法流程
一、 IK分词初始化
初始化最主要的工作就是读入词典,并将这些词放入内存字典树
1.main2012.dic(关键词)2.quantifier.dic(量词)3.stopword.dic(停用词)4.ext.dic(扩展词,可选)
二、 匹配
1.
主要的就是ik.next()方法:
1)
2)
3)
——子分词器
4)
——歧义处理
5)
其功能是根据分词候选集和歧义处理策略,生成最后的分词结果
2.
子分词器才是真正的分词类,IK里面有三个子分词器
i.
ii.
iii.LetterSegmenter(字母分词)。
主分词器IKSegmentation遍历这三个分词器对文本输入流进行的分词处理。每种分词器的分词方法是独立的,
生成自己的分词结果,放到分词候选集里
这三个分词器的代码很类似,思路都是一样的,采用字典树(CJK使用)或其他简单数据结构(CN_QuantifierSegmenter和LetterSegmenter)匹配文本中的当前字符,将匹配到的字符加入到分词候选集
其他两个词典与其主要区别如下:
1. CN_QuantifierSegmenter的词典来源两个地方:1.quantifier.dic文件,包含量词 2.数词直接写到ChnNumberChars类中了,内容如下:"一二两三四五六七八九十零壹贰叁肆伍陆柒捌玖拾百千万亿拾佰仟萬億兆卅廿"
2. LetterSegmenter分别有三个类似的处理器:字母、数字、字母和数字的组合。
处理的基本思路就是匹配连续的相同类型字符,直到出现不同类型字符为止,切出一个词,比如LetterSegmenter对字串"中文abc英文"的处理方式就是匹配出连续的字母子串abc,切为一个词,切词结果为中文 abc 英文
三、对相交词进行歧义处理(judge方法)
四、其他
处理无法切分的非词典中词语,以及停用词
——http://blog.chinaunix.net/uid-20761674-id-3423941.html
这里有详细的流程图和url图
http://blog.163.com/liaoxiangui@126/blog/static/7956964020130299518177/
以下是局部关注的部分
- Thread1——main(String[])
- Thread2——IKSegmenter.next()
- 测试类中IKSegmenter ik=new IKSegmenter(sr, false);
//true代表调用IKSegmenter()构造函数时使用智能分词 调用IKSegmenter - IKSegmenter.next()主流程最主要的就是.next()方法:
- //遍历子分词器
for(ISegmenter segmenter : segmenters){ segmenter.analyze(context);} - 子分词器for的第一次循环:处理英文,字母,阿拉伯字母,混合字母的analyze()
- 子分词器for的第二次循环:处理中文数词,中文量词的analyze()
- Thread3——CJKSegmenter.analyze(AnalyzeContext)
- 子分词器for的第三次循环:中文-日韩文子分词器的analyze()
- 重置子分词器for(ISegmenter segmenter : segmenters){ segmenter.reset();}
- 歧义处理this.arbitrator.process(context, this.cfg.useSmart());
Thread3:线程3的详细代码以及综合的注释
public voidanalyze(AnalyzeContext context) {
在此发现IK中的userSmart配置 在solr4.0中不生效
由于版本而导致的问题
首先是中文分词器。中文分词库注定悲剧的地方在于总要跟着国外开源软件的更新走,一旦lucene,solr更新了,某些基础类改变或者接口变 动,分词器可能就不再支持了。IKTokenizerFactory继承自solr的BaseTokenizerFactory,但是 BaseTokenizerFactory在solr3.6之后版本已经不存在了,如果你按照以前的配置方式在scheme里配置:
- <fieldType
name="text" class="solr.TextField" > -
<analyzer type="index"> -
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" useSmart ="false"/> -
</analyzer> -
<analyzer type="query"> <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" useSmart ="false"/> -
</analyzer> - </fieldType>
http://blog.csdn.net/pelick/article/details/8469442
解决办法:
https://code.google.com/p/ik-analyzer/issues/detail?id=125
https://code.google.com/p/ik-analyzer/issues/detail?id=91
<fieldType name="text_ika" class="solr.TextField" >