轉自一個很不錯的博客,結合自己的理解,記錄一下。作者:zhbzz2007 出處:http://www.cnblogs.com/zhbzz2007 歡迎轉載,也請保留這段聲明。謝謝!
https://www.cnblogs.com/zhbzz2007/p/6076246.html?utm_source=itdadao&utm_medium=referral
結巴分詞的原理,結合一個面試題:有一個詞典,詞典里面有每個詞對應的權重,有一句話,用這個詞典進行分詞,要求分完之后的每個詞都必須在這個詞典中出現過,目標是讓這句話的權重最大。
涉及算法:
- 基於前綴詞典實現詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖(DAG),采用動態規划查找最大概率路徑,找出基於詞頻的最大切分組合;
- 對於未登錄詞,采用了基於漢字成詞能力的 HMM模型,采用Viterbi算法進行計算;
- 基於Viterbi算法的詞性標注;
- 分別基於tfidf和textrank模型抽取關鍵詞;
基於前綴詞典及動態規划實現分詞
http://www.cnblogs.com/zhbzz2007/p/6084196.html
jieba分詞主要是基於統計詞典,構造一個前綴詞典;然后利用前綴詞典對輸入句子進行切分,得到所有的切分可能,根據切分位置,構造一個有向無環圖;通過動態規划算法,計算得到最大概率路徑,也就得到了最終的切分形式。
1.前綴詞典構建:如統計詞典中的詞“北京大學”的前綴分別是“北”、“北京”、“北京大”;詞“大學”的前綴是“大”。
2.有向無環圖構建:然后基於前綴詞典,對輸入文本進行切分,對於“去”,沒有前綴,那么就只有一種划分方式;對於“北”,則有“北”、“北京”、“北京大學”三種划分方式;對於“京”,也只有一種划分方式;對於“大”,則有“大”、“大學”兩種划分方式,依次類推,可以得到每個字開始的前綴詞的划分方式。
3.最大概率路徑計算:
在得到所有可能的切分方式構成的有向無環圖后,我們發現從起點到終點存在多條路徑,多條路徑也就意味着存在多種分詞結果。因此,我們需要計算最大概率路徑,也即按照這種方式切分后的分詞結果的概率最大。在采用動態規划計算最大概率路徑時,每到達一個節點,它前面的節點到終點的最大路徑概率已經計算出來。
有向無環圖DAG的每個節點,都是帶權的,對於在前綴詞典里面的詞語,其權重就是它的詞頻;我們想要求得route = (w1,w2,w3,...,wn),使得 ∑weight(wi) 最大。
如果需要使用動態規划求解,需要滿足兩個條件,
- 重復子問題
- 最優子結構
我們來分析一下最大概率路徑問題,是否滿足動態規划的兩個條件。
基於漢字成詞能力的HMM模型識別未登錄詞
利用HMM模型進行分詞,主要是將分詞問題視為一個序列標注(sequence labeling)問題,其中,句子為觀測序列,分詞結果為狀態序列。首先通過語料訓練出HMM相關的模型,然后利用Viterbi算法進行求解,最終得到最優的狀態序列,然后再根據狀態序列,輸出分詞結果。
HMM的兩個基本假設:
1.齊次馬爾科夫性假設,即假設隱藏的馬爾科夫鏈在任意時刻t的狀態只依賴於其前一時刻的狀態,與其它時刻的狀態及觀測無關,也與時刻t無關;
2.觀測獨立性假設,即假設任意時刻的觀測只依賴於該時刻的馬爾科夫鏈的狀態,與其它觀測和狀態無關。
HMM模型的三個基本問題:
Viterbi算法
Viterbi算法實際上是用動態規划求解HMM模型預測問題,即用動態規划求概率路徑最大(最優路徑)。這時候,一條路徑對應着一個狀態序列。