转自:https://blog.csdn.net/lala12d/article/details/82776571
仅供学习
1、IK分词器也是基于正向匹配的分词算法。
2、IK分词器,基本可分为两种模式,一种为smart模式,一种为非smart模式
3、非smart模式所做的就是将能够分出来的词全部输出;smart模式下,IK分词器则会根据内在方法输出一个认为最合理的分词结果,这就涉及到了歧义判断
4、Lexeme 词元,compareTo(Lexeme other)这个方法决定了词元在链路中的位置
5、LexemePath词元链,分词的一种结果,根据前后顺序组成一个链式结构,其实就是由交叉的Lexeme 组成的有序集合QuickSortSet。LexemePath也是实现Comparable接口的,用于歧义分析
实例:张三说的确实在理
根据正向匹配可能的词元链:
L1:{张三,张,三}
L2:{说}
L3:{的确,的,确实,确,实在,实,在理,在,理}
LexemePath之间是不交叉的,LexemePath内部的词元间是交叉的
下面是核心代码
public intcompareTo(Lexemeother) {
//起始位置优先
if(this.begin< other.getBegin()){
return -1;
}elseif(this.begin== other.getBegin()){
//词元长度优先
if(this.length> other.getLength()){
return-1;
}elseif(this.length== other.getLength()){
return0;
}else{//this.length< other.getLength()
return1;
}
}else{//this.begin> other.getBegin()
return1;
}
}
如果是非smart模式,分词到词结束,把所有的词元全部返回即可
在smart模式下需进行消除岐义.
消除岐义的算法和步骤如下
取LexemePath中不交叉词元组成新的LexemePath
L1对应的词元链如下:
L11:{张三}
L12:{张}
L13:{三}
L3对应的词元链如下
L31:{的,确实,在理}
L32:{的确,实,在理}
L33:{的确,实在,理}
L34:{的确,实在}
L35:{确实,在理}
L36:{确实}
…
smart模式岐义消除算法:
public intcompareTo(LexemePatho) {
规则1:比较有效文本长度
L31:{的,确实,在理}
L32:{的确,实,在理}
L33:{的确,实在,理}
规则2: //比较词元个数,越少越好
规则3: //路径跨度越大越好
规则4: //根据统计学结论,逆向切分概率高于正向切分,因此位置越靠后的优先(从代码中看来
没有发现其具体实际意义)
规则5: //词长越平均越好(词元长度相乘)
规则6: //词元位置权重比较(词元长度积),含义是选取长的词元位置在后的集合
L31:{的,确实,在理}11+22+3*2=11
L32:{的确,实,在理} 12+21+3*2=10
L33:{的确,实在,理} 12+22+3*1=9
最后的分词结果:张三,说,的,确实,在理
————————————————
原文链接:https://blog.csdn.net/lala12d/article/details/82776571