IK分詞器實現原理
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:{的,確實,在理}1*1+2*2+3*2=11
L32:{的確,實,在理} 1*2+2*1+3*2=10
L33:{的確,實在,理} 1*2+2*2+3*1=9
最後的分詞結果:張三,說,的,確實,在理