最近看了下mmseg分詞演算法,覺得這個演算法簡單高效,而且還非常準確 作者聲稱這個規則達到了99.69%的準確率並且93.21%的歧義能被這個規則消除。
核心思想是抽取3個可能的詞(存在多個組合),然後根據4個消歧義規則確定到底選擇那個組合
1. 組合長度最大
2. 組合中平均詞語長度最大
3. 詞語長度的變化率最小
4. 計算組合中所有單字詞詞頻的自然對數,然後將得到的值相加,取總和最大的片語
下面分別舉例說明
1.組合長度最大
比如長春市長**店
,這個會有如下幾種組合
長春市_長春_藥店_
長春市_長_**_
長春_市長_**_
長春_市_長春_
長_春_市長_
第一種組合長度最長,所以就以第一種方式分詞, 實際效果看起來也合理
2.組合中平均詞語長度最大
比如國際化
,這個會有如下幾種組合
國際化_
國際_化_
國_際_化_
顯然規則1無法過濾,長度都是3 經過規則2,之後發現第乙個組合平均長度為3/1=3
,第二個是3/2=1.5
,第三個3/3=1
第乙個平均長度最大,所以勝出
這個規則和規則1看上去沒啥區別,但因為有的時候句子不夠被分成3個詞的組合,有可能只夠分2個詞 上面就是個例子,國際化
被分別分成了1個詞的組合/2個詞的組合/3個詞的組合,優選詞個數最少的組合
3.詞語長度的變化率最小
比如北京大學生
,這個會有如下幾種集合
北京大學_生_
北京_大學生_
北京_大學_生_
北京_大_學生_
北_京_大學生_
顯然規則1無法過濾,長度都是5
在經過規則2之後剩下
北京大學_生_
北京_大學生_
因為上面2個組合的平均長度為5/2=2.5,其他為5/3=1.66
經過規則3之後剩下
北京_大學生_
這是我們想要的,因為第一條是變化是sqrt(((4-2.5)^2+(1-2.5)^2))/2)=1.5
,
後面是sqrt(((3-2.5)^2+(2-2.5)^2))/2)=0.5
,第二條變化小,所以後面勝出
4.單字詞詞頻自然對數累加計算
比如設施和服務
,這個會有如下幾種組合
設施_和服_務_
設施_和_服務_
設_施_和服_
經過規則1過濾得到
設施_和服_務_
設施_和_服務_
規則2和規則3都無法確定誰勝出,只能走最後乙個規則 第一條中的務
和第二條中的和
,從直**,顯然是和
的詞頻在日常場景下要高,這依賴乙個詞頻字典和
的詞頻決定了最後的分詞是設施_和_服務_
為什麼要取自然對數之和而不是簡單的求和? 比如某個組合有兩個單字,詞頻為3
和7
,另乙個為5
和5
3+7=5+5
,但ln3+ln7
從4個規則來看,演算法處處強調長度和均衡
1.3個詞的組合要盡可能長這還是比較符合日常的語言習慣的,只是不太明白為什麼選3個詞作為乙個組合,為啥不是4?5?2.每個詞也要盡可能長
3.每個詞要盡可能長度接近
4.單個詞的詞頻也要較為接近
想到的反例把手抬起來
正確的分詞是把_手_抬起_來
,但經過本演算法的規則過濾為把手_抬起_來
出自:
mmseg分詞演算法
不想為了面試而面試,找實習的事還是順其自然,每天刷刷題就行,這樣整天都在看水題效率極低,也水不了幾題。還是得學點有用的東西 9 8日目標 搞清楚mmseg演算法,分別用python和c 實現。mmseg演算法簡介 其關鍵是 1.匹配3個詞得到的片語長度盡量要長 2.每個詞也要盡可能長 3.每個詞要盡...
Mmseg中文分詞演算法解析
mmseg中文分詞演算法解析 author linjiexing 開發中文搜尋和中文詞庫語義自動識別的時候,我採用都是基於mmseg 中文分詞演算法開發的 jcseg 開源工程。使用場景涉及搜尋索引建立時的中文分詞 新詞發現的中文分詞 語義詞向量空間構建過程的中文分詞和文章特徵向量提取前的中文分詞等...
為coreseek新增mmseg分詞
1.準備好需要新增的詞表,一般都是每行一詞,注意要儲存為utf 8 例如 林書豪 2.利用ultraedit的查詢替換功能,使詞 式符合mmseg的要求 例如 開啟ultraedit的正則替換功能,將 p 替換為 t1 px 1 p 結果是 林書豪 tab 1 x 1 其他的也行 3.將生成的符合格...