KTDictSeg 一種簡單快速準確的中文分詞方法

2021-04-13 01:18:34 字數 4143 閱讀 7827

個人部落格:

2007/5 南京

基本技術指標

分詞準確度

: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 v1.0 和我的演算法比較,效率明顯偏低,每秒6000位元組的效率是很難滿足搜尋引擎等大數量應用要求的,但對於有些短文本的分詞,效率並不是乙個重點需要考慮的問題。

和雨痕中英文分詞元件的比較

雨痕中英文分詞元件 (

http://www.rainsts.net) 的專業版不是免費的,所以只使用了其免費的演示版本進行了比較。

分詞速度:

雨痕的分詞速度大概在每秒4000位元組左右,這個和sharpictclas差不多,比我的演算法慢100倍左右。

準確度:

雨痕的分詞準確度還是比較高的,但和我的演算法一樣存在演算法的先天缺陷,對於必須通過語義才能判斷的句子,無法準確分詞。對於其他型別的有歧異的句子,分詞能力還是不錯的,我只發現類似下面的句子「

於北京時間1月1日舉行運動會」我的演算法比雨痕要準確,雨痕

分詞結果是「於北京

/ 時間

/ 1月1日/

舉行/

運動會」,我對演算法分詞結果是「於

/北京時間/1月

/1日/舉行

/運動會

/」,如果北京時間這個詞在雨痕的分詞元件中有的話,我覺得雨痕的演算法可能有需要改進的地方。

未登入詞識別能力:

還是對比如下面句子分詞:

總結:

雨痕中英文分詞元件的效率較低,很難滿足搜尋引擎等大數量應用要求的。準確度方面還是比較高的,和我的演算法的準確度相比基本差不多。

和 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 1.2 版本發布及演算法簡介

快速排序的一種較簡單寫法

文中的快速排序實際上是快速找到首位元素的實際位置並放置,接著通過二分法,進行遞迴查詢放置,完成排序。void quicksort int a,int low,int high int i low,j high if i temp i首先我們拿到一組資料a,找到a的最低位下標和最高位下標。接著使用哨兵...

一種快速排序演算法

using system class program for int l 0 l src.length l src count temp l i 3 0xff temp l static void main string args watch.stop console.writeline quick...

比較簡單的一種快速排序方法

def quicksort head,tail head1 head tail1 tail tmp arr head 儲存臨時元素 如果頭指標小於尾指標一直迴圈,直到相等找到元素的正確索引跳出迴圈 while head tail 尾部資料大於臨時元素,尾指標前移 while arr tail tmp...