mmseg中文分詞演算法解析
@author linjiexing
開發中文搜尋和中文詞庫語義自動識別的時候,我採用都是基於mmseg
中文分詞演算法開發的
jcseg
開源工程。使用場景涉及搜尋索引建立時的中文分詞、新詞發現的中文分詞、語義詞向量空間構建過程的中文分詞和文章特徵向量提取前的中文分詞等,總體使用下來,感覺
jcseg
是乙個很優秀的開源中文分詞工具,而且可配置和開源的情況下,可以滿足很多場景的中文分詞邏輯。本文先把
jcseg
使用到最基本的
mmseg
演算法解析一下。
1. 中文分詞演算法之爭
在分析mmseg
演算法前,先講述一段中文分詞的基本歷史,在吳軍著的《數學之美》中有詳述,我主要聊聊我的想法。演算法開發的思維流程其實和這段歷史基本上是吻合的。我們的直觀思維很容易受限於我們的知識儲備和經驗,比如我們在設計出飛機之前,想到是仿生的方式去模擬鳥兒的扇動翅膀姿勢,直到後來空氣動力學發現飛翔的本質是扇動翅膀可以產生空氣渦流而給以上公升驅動力,由螺旋槳推公升比空氣質素高的物體,飛機由此發明。
在中文分詞的道路上,也曾走過這樣一段類似的探索之路。一開始,為了實現合理的中文分詞,我們能想到的是使用語言學家已經歸納的語法規則,根據傳統的「句讀」分割,給語句分詞。但是,我們知道,很多出名的詩句或文學語句都不是來自於正常的語法,甚至有些口語化的語句也不滿足語法規則,但是並不影響人的識別,而且可能還是流傳千古的創新之作。所以,直覺的有限定義並不能滿足千變萬化的語言環境。在ibm
花費很多時間和人力之後,發現走傳統思維是行不通的,轉而走向現在流行的統計學語言模型。我個人是這麼理解統計學模型的,本質上語言學家的語法規則也是來自於大量語料的統計和歸納,並加以個人或專家團隊的約束,組織成有限的語法規則,但是這個語法規則被約束成有限的,從而不滿足人類的無線創作的可能性——用概率學的角度看,語法規則可能可以覆蓋到乙個標準差內的可能發生的事件(事實上,並沒有到這個覆蓋率),但是其它小概率事件並沒有覆蓋,甚至隨著時間的演變,語料庫的迅速增加,長尾效應和創新效應的存在,覆蓋率更快的降低。使用有限非完備的方式,是很難應對無限擴充套件的方式。這個時候,就是基於統計學的機器學習佔了實踐的上風。
發展到現在,有很多基於統計理論的中文分詞演算法,也有很多成熟的產品。他們在實踐中雖然並非達到百分百正確率,但是在很多應用場景已經可以滿足要求,適定性比基於語法的方式要優越很多。當然,但凡基於統計學的模型,其探索之路就意味著永無止境。
不同的演算法模型也有不同的適定場景,各位可以自己嘗試。我所使用到的場景使用mmseg
演算法就可以有很好的效果,所以沒有深入查閱其它演算法的原理,暫時無法給出比較客觀的比較。
2. mmseg演算法原理
如上所述,mmseg
演算法是基於統計模型的,所以演算法的規則也是來自於對語料庫的分析和歸納,作者根據語料庫總結出分詞的規則,分為四個步驟,演算法原文為
。具體規則如下:
① 規則1
,最大匹配:如果詞語可以找到乙個簡單的詞匹配,則認為該詞即為該詞語的分詞
類似,詞語「國際化」,通過詞典分詞,可以有如下分詞結果
1. 國_際_化
2. 國際_化
3. 國際化
1. c1_c2_c3
2. c1c2_c3
3. c1_c2c3
4. c1c2c3
可見「國際化」有完全對應的詞,則認為這個詞語即是乙個詞。規則總結如下:
選取c1c2c3模式
② 規則2
,最大平均詞彙長度。如果詞語分詞不滿足規則
1,則使用規則2:
類似,詞語「南京市長江大橋」,分詞結果可能如下
1. 南京市_長江大橋 —— 平均詞長度為7/2=3.5
2. 南京_市長_江大橋 —— 平均詞長度為7/3=2.3
歸納該規則為則選取第一種分詞方式,可見這個規則是相容第乙個規則的
1. c1c2_c3c4c5c6
2. c1c2_c3c4_c5c6
③ 規則3
,最小詞長方差。如果規則②不成立,則進行規則三。這個規則和我們平時用語有關,一般我們在組織語句時,為了朗朗上口,往往使用的詞彙組成長度比較一致。比如,「幸福
_快樂」,「人之初
_性本善」,「君子一言,駟馬難追」。
類似,詞語「研究生命科學」
1. 研究生_命_科學 ——詞長方差0.82
2. 研究_生命_科學 ——詞長方差0
上述平均詞長都是2
,但是詞長方差不一致。根據規則③,選擇第二種分詞方式,這種規則可以歸納為
1. _c1c2_c3c4_c5c6_
2. _c1c2c3_c4_c5c6_
④ 規則4
,最大單字自由度。所謂單字自由度,可以簡單的理解為這個字作為單獨出現的語境次數,比如「的」經常作為定語修飾字,經常出現在各種語境,但是「的」偶爾也會和其他字詞組成成語,比如「目的」等,這種組合會影響改字的自由度。有關自由度和凝固度,回頭在《新詞發現》中討論。這種判斷主要是使用在單字存在的場景。
在規則③不成立的情況下,進行規則④的判斷。
1. 化妝_和(10)_服裝
2. 化妝_和服_裝(3)
總結該規則為(備註,上面自由度屬於個人瞎編
)平均詞長和詞長方差是一致的,但是單字的自由度不同,選擇第一種分詞方式
1. _c1c2_c3_c4c5_
2. _c1c2_c3c4_c5_
compare the freedom(c3) to freedom(c5)
3. 該演算法的錯誤情況
該演算法的錯誤案例可以詳見原**的example of errors小節。個別錯誤是可以避免的,尤其是單字自由度,主要是語料庫的訓練問題,有些問題可以通過新詞發現解決。檢視該約束,可以判斷是否滿足自己的應用場景。
4. 小結
能感覺這篇演算法闡述還是非常精煉漂亮的,在很多場景適定性也很強。後續將對基於mmseg
演算法開源的
jcseg
做個分析。
mmseg分詞演算法
不想為了面試而面試,找實習的事還是順其自然,每天刷刷題就行,這樣整天都在看水題效率極低,也水不了幾題。還是得學點有用的東西 9 8日目標 搞清楚mmseg演算法,分別用python和c 實現。mmseg演算法簡介 其關鍵是 1.匹配3個詞得到的片語長度盡量要長 2.每個詞也要盡可能長 3.每個詞要盡...
MMSEG分詞演算法
最近看了下mmseg分詞演算法,覺得這個演算法簡單高效,而且還非常準確 作者聲稱這個規則達到了99.69 的準確率並且93.21 的歧義能被這個規則消除。核心思想是抽取3個可能的詞 存在多個組合 然後根據4個消歧義規則確定到底選擇那個組合 1.組合長度最大 2.組合中平均詞語長度最大 3.詞語長度的...
mmseg 中文分詞核心配置
原文 coreseek 3.2.13相容sphinx 0.9.9的配置,可以不經修改,即可直接使用。不過,為了更好的針對中文進行檢索,則需要使用coreseek新增的配置引數,設定中文分詞。以下是中文分詞的核心配置,請仔細閱讀,應用到自己的配置之中 source 資料來源名稱a index 索引名稱...