作者:肖波
個人部落格:http://blog.csdn.net/eaglet
2007/5 南京
這段時間通過研究目前在互連網上可以搜尋到的中文分詞演算法,感覺很難找到既快又準的分詞方法,通過幾天時間的研究,我終於找到了一種快速且較準確的中文分詞方法。現在回過頭來想想,覺得其實問題並不很複雜,對於一般應用,我覺得這個演算法應該基本夠用了,當然目前沒有一種方法可以達到100%的分詞準確度,這個演算法也是一樣。對於實際應用往往需要在效率和準確度上做個折中,當然對技術的追求是無止境的,我也將繼續努力,爭取在後續版本中進一步提高準確度,並維持現有效率。
基本技術指標
分詞準確度:90%以上(只是自己統計了一下,有待專家的權威評測)
處理速度: 600KBytes/s (P4 3.0G)
和互連網上幾個比較流行的中文分詞方法的比較和SharpICTCLAS的比較
提到中文分詞,就不能不提到計算所開發的ICTCLAS 中文分詞系統,這個系統採用一些語義分析的方法以提高分詞的準確度。看了它的演算法,感覺確實有很多值得學習的地方,只是演算法相對複雜,維護時除了要維護詞表還要維護詞的關係,當然複雜也有複雜的好處,對於如下句子:“請把手抬高一點兒”,比較互連網上我所找到的幾個演算法(包括我的演算法),只有ICTCLAS可以正確分詞。
分詞速度:
ICTCLAS 的分詞速度為31.5Kbytes/s 由於沒有實際去測,只能引用其代碼中寫的資料。這個速度比我的演算法慢將近20倍。
我用了河北理工大學經管學院呂震宇老師的SharpICTCLAS V1.0進行了對比,可能是呂震宇老師還沒有來得及對效率進行最佳化,這個版本的分詞效率較底,每秒鐘大概在4000-6000位元組,比我的演算法要慢100多倍。相信SharpICTCLAS 的後續版本效率會有提高。
準確度:
用SharpICTCLAS V1.0 版本對一些有歧異的句子進行分詞,發現有的句子我的演算法可以較好的處理,但SharpICTCLAS不能得到正確的結果。如“長春市長春節致詞”我的演算法分析為:長春/市長/春節/致詞, SharpICTCLAS分析為:長春市/長/春節/致詞/,這個錯誤可能並不是SharpICTCLAS的演算法缺陷,可能只是V1.0版本提供的訓練集不充分造成的,是不是演算法目前我還沒有仔細研究。
SharpICTCLAS 對於一些需要根據語義來分析的語句如上面提到的“請把手抬高一點兒”分析效果很好,可以把“把手”分解為把/手 而我的演算法則分解為 把手。
未登入詞識別能力:
感覺SharpICTCLAS對於未登入詞的識別能力並不象代碼注釋中寫的那麼高,比如下面句子:
“新浪體育訊 英超賽季結束後,曼城隊一直處在各種動蕩之中”,SharpICTCLAS分詞的結果是 “新/浪/體育/訊/英/超/賽季/結束/後/,/曼/城/隊/一直/處在/各種/動蕩/之中/ ”
我的演算法分詞結果是 “新浪/體育/訊/英超/賽季/結束/後/,/曼城隊/一直/處在/各種/動蕩/之中/”
總結:
SharpICTCLAS V1.0 和我的演算法比較,效率明顯偏低,每秒6000位元組的效率是很難滿足搜尋引擎等大數量應用要求的,但對於有些短文本的分詞,效率並不是一個重點需要考慮的問題。
分詞準確度方面:基於目前SharpICTCLAS提供的訓練集比較,我認為各有千秋,在網上找了幾篇文章,整篇文章分詞進行比較,感覺我的演算法總體上比SharpICTCLAS好像還要準確一些。
和雨痕中英文分片語件的比較
雨痕中英文分片語件 (http://www.rainsts.net) 的專業版不是免費的,所以只使用了其免費的示範版本進行了比較。
分詞速度:
雨痕的分詞速度大概在每秒4000位元組左右,這個和SharpICTCLAS差不多,比我的演算法慢100倍左右。
準確度:
雨痕的分詞準確度還是比較高的,但和我的演算法一樣存在演算法的先天缺陷,對於必須通過語義才能判斷的句子,無法準確分詞。對於其他類型的有歧異的句子,分詞能力還是不錯的,我只發現類似下面的句子“於北京時間1月1日舉行運動會”我的演算法比雨痕要準確,雨痕
分詞結果是“於北京/ 時間/ 1月1日/ 舉行/ 運動會”,我對演算法分詞結果是“於/北京時間/1月/1日/舉行/運動會/”,如果北京時間這個詞在雨痕的分片語件中有的話,我覺得雨痕的演算法可能有需要改進的地方。
未登入詞識別能力:
還是對比如下面句子分詞:
“新浪體育訊 英超賽季結束後,曼城隊一直處在各種動蕩之中”,雨痕分詞的結果是 “新浪/ 體育/ 訊/ / 英超/ 賽季/ 結束/ 後/ ,/ 曼/ 城/ 隊/ 一直/ 處在/ 各種/ 動蕩/ 之中”,這個結果比SharpICTCLAS還是要準確一些,但“曼城隊”被分成了三個詞,這方面我的演算法要稍微好一些。
總結:
雨痕中英文分片語件的效率較低,很難滿足搜尋引擎等大數量應用要求的。準確度方面還是比較高的,和我的演算法的準確度相比基本差不多。
和 ShootSearch 分片語件的比較
ShootSearch (http://www.shootsoft.net)分片語件是一個開源的分片語件,其分詞效率很高,和我的演算法速度不相上下,但ShootSearch只採用了簡單的最大匹配演算法,分詞準確度很低,前面舉的幾個例子都不能很好的分詞,由於準確度太低,這裡就不重點分析了。
KTDictSeg 分詞演算法介紹
我把組件名名為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。
未登入詞識別
KTDictSeg 對未登入詞的識別採用一個簡單判定,即把未在字典中找到的連續的字組成一個詞,這種判斷是基於分詞演算法比較準確且詞庫中的詞足夠多的假設下做出的,由於KTDictSeg的分詞演算法相對比較準確且附帶的詞庫收錄了20多萬條詞,所以KTDictSeg對未登入詞的識別也相對比較準確。
優點
KTDictSeg 的 優點是分詞速度非常快,且分詞準確度相對簡單的最大匹配演算法有很大提高,所以可以應用於一些對分詞準確度要求不是非常苛刻,但對分詞效率要求較高的應用環境中,比如大多數的中小型中文搜尋引擎都可以使用這個分片語件。
KTDictSeg 還有一個優點就是簡單,使用者只需維護一個漢語詞庫就可以達到比較準確的分詞效果,減少了使用者維護的工作量和對系統的開銷。
缺點
KTDictSeg 的致命缺點是無法對語義進行判斷,對於一些語義相關的句子不能夠做到100%識別出來,而且無論怎樣調整詞庫,理論上都無法達到100%匹配。
開原始碼
KTDictSeg 下載位置
最新動向
KTDictSeg 1.2 版本發布及演算法簡介
KTDictSeg 分片語件1.3版本 新增功能列表及下載位置