1. 程式人生 > >IK分詞器實現原理

IK分詞器實現原理

1、IK分詞器也是基於正向匹配的分詞演算法。

2、IK分詞器,基本可分為兩種模式,一種為smart模式,一種為非smart模式

3、非smart模式所做的就是將能夠分出來的詞全部輸出;smart模式下,IK分詞器則會根據內在方法輸出一個認為最合理的分詞結果,這就涉及到了歧義判斷

4、Lexeme 詞元,compareTo(Lexeme other)這個方法決定了詞元在鏈路中的位置

5LexemePath詞元鏈,分詞的一種結果,根據前後順序組成一個鏈式結構,其實就是由交叉的Lexeme 組成的有序集合QuickSortSet

。LexemePath也是實現Comparable介面的,用於歧義分析

例項:張三說的確實在理

根據正向匹配可能的詞元鏈:

L1:{張三,張,三}

L2:{說}

L3:{的確,的,確實,確,實在,實,在理,在,理}

LexemePath之間是不交叉的,LexemePath內部的詞元間是交叉的

下面是核心程式碼

public intcompareTo(Lexemeother) {

//起始位置優先

       if(this.beginother.getBegin()){

            return -1;

       }elseif(this.begin== other.getBegin()){

       //詞元長度優先

       if(this.lengthother.getLength()){

       return-1;

       }elseif(this.length== other.getLength()){

       return0;

       }else{//this.lengthother.getLength()

       return1;

       }

       }else{//this.beginother.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

最後的分詞結果:張三,說,的,確實,在理