jieba分詞用到了DAG分詞法。在此介紹其原理:
第一步:分句
通過正則表達式,將文章內(nèi)容切分,形成一個句子數(shù)組,這個比較好理解
第二步:構建DAG詞圖
下述程序其實是找以每個字為開頭的成詞位置,即構造出句子的有向無環(huán)圖(DAG),就是一個字典。
對句子中的每個字進行分析,從該字右邊一位開始,看sentence[k:i+1]這個詞語是否在預設的字典中,這個字典保存了常用的詞語(和詞語的一部分,但權重為0)和其權重。如果有,并且如果字典中的這個詞的權值不等于0,那么就將i放到tmplist里,然后i+=1,繼續(xù)往右看一個字。如果沒有這個詞,那就停下來,然后移動k,讓k=k+1,找下一個字的成詞位置。
比如有這樣一個句::'我從海淀區(qū)搬到了朝陽區(qū)'。一共11個字,通過上面的計算,得到一個字典:<class 'dict'>::{0: [0], 1: [1], 2: [2, 3, 4], 3: [3, 4], 4: [4], 5: [5, 6], 6: [6], 7: [7], 8: [8, 9, 10], 9: [9], 10: [10]}。這個字典就是DAG。字典的key代表每個字在字符串中的位置,比如,0代表'我',1代表'從',value為從字開始能在FREQ中的匹配到的詞末尾位置所在的list,比如2對應[2,3,4],這個表示:'海'(2)/'海淀'(2-3)/'海淀區(qū)'(2-4),這三個字符串可以成為詞語,我們就得到了所有可以成詞的位置了。
第三步:計算全局概率Route ,基于詞頻最大切分組合
下述程序,對于句子中的每一個字,計算候選位置中,哪個成詞概率最大。
動態(tài)規(guī)劃查找最大概率路徑。注意的是動態(tài)規(guī)劃的方向是從后往前。
比如2:[2,3,4],分別對位置2/3/4進行計算,計算公式:log(詞的概率) - 常數(shù) + 下一個字的成詞概率
詞的概率計算:還是用之前保存了所有常用詞的字典(也可以自己定義字典)。
下一個字的成詞概率:上一個循環(huán)計算出來的,我們要從末尾開始計算,得到的結果作為下一個循環(huán)的參數(shù),這樣我們就找到了最大成詞概率的切分位置。
為什么要加上下一個字的成詞概率的呢:因為下一個詞的成詞概率高的話,我們做出的切分就越正確,越有可能切成兩個正確的詞語,而不是左邊的詞語概率高,而右邊根本不是一個正確的詞語。
如上圖,藍色圈中的部分,括號右邊代表了成詞的位置,括號左邊代表當前字到括號右邊的字之間組成一個詞的概率,比如2,看括號的內(nèi)容,代表2-4的成詞概率是-45,所以'海淀區(qū)'切成一個詞。
第四步:切分
從頭開始,尋找每個位置對應的成詞位置,取出來,跳到成詞位置的下一個位置。循環(huán)。
這樣,我們就能得到:0/1/2-4/5/6/7/8-10
具體為:我/從/海淀區(qū)/搬/到/了/朝陽區(qū)