我把組件名名為KTDictSeg,它是由KaiToo搜索開發的壹款基於字典的簡單中英文分詞組件。
分詞算法
談到分詞算法,目前有很多。比較常用的是正向最大匹配和反向最大匹配算法。但這兩種算法對於壹些存在多元歧異的句子缺乏較好的支持。以“長春市長春節致詞”和“長春市長春藥店”這個兩個句子為例:
“長春市長春節致詞”可以依次拆分為 長春、長春市、市長、長春、春節、致詞 這幾個詞,按照正向最大匹配算法,分詞結果是長春市/長/春節/致詞,按照反向最大匹配算法,分詞結果是長春/市長/春節/致詞。
“長春市長春藥店”可以依次拆分為長春、長春市、市長、長春、春藥、春藥店、藥店 這幾個詞,按照正向最大匹配算法,分詞結果是 長春市/長春/藥店,按照反向最大匹配算法,分詞結果是“長春/市長/春藥店”。
可見無論是正向還是反向最大匹配,都存在產生歧異的情況。
KTDictSeg 的算法在正向匹配算法的基礎上做了壹些改進,用壹句話描述就是找到句子中第壹個未被匹配的字數最少的單詞組合,如果多個組合未被匹配的字數都是最少則找到其中匹配的單詞個數最少的組合。匹配順序是從左至右。還是以上面兩個句子為例:
“長春市長春節致詞” 按正向最大匹配掃描順序可以出現如下匹配的單詞組合:
1) 長春/市長/春節/致詞 匹配單詞數4,未匹配字數0
2) 長春市/長春/致詞 匹配單詞數3,未匹配字數0
不難看出,第壹中組合未匹配的字數最少,所以取組合1。
“長春市長春藥店”按正向最大匹配掃描順序可以出現如下匹配的單詞組合:
1) 長春市/長春/藥店 匹配單詞數3,未匹配字數0
2) 長春市/春藥店 匹配單詞數2,未匹配字數1
3) 長春市/春藥 匹配單詞數2,未匹配字數2
4) 長春市/藥店 匹配單詞數2,未匹配字數2
5) 長春/市長/春藥店 匹配單詞數3,未匹配字數0
6) 長春/市長/春藥 匹配單詞數3,未匹配字數1
7) 長春/市長/藥店 匹配單詞數3,未匹配字數1
8) 長春/市長/藥店 匹配單詞數3,未匹配字數1
9) 長春/長春/藥店 匹配單詞數3,未匹配字數1
可見組合1和組合5 未匹配數最小,匹配單詞數相等,但組合1匹配順序靠前,所以取組合1。
源碼下載 /projects/ktdictseg/?source=typ_redirect