1. 程式人生 > >NLP之jieba分詞原理簡析

NLP之jieba分詞原理簡析

一、jieba介紹

jieba庫是一個簡單實用的中文自然語言處理分詞庫。

jieba分詞屬於概率語言模型分詞。概率語言模型分詞的任務是:在全切分所得的所有結果中求某個切分方案S,使得P(S)最大。

jieba支援三種分詞模式:

  • 全模式,把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
  • 精確模式,試圖將句子最精確地切開,適合文字分析;
  • 搜尋引擎模式,在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜尋引擎分詞。

接下來我們針對此進行切分演算法原理分析。

二、jieba分詞原理

1.基於字首詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG)

 1. 根據dict.txt生成trie樹,字典在生成trie樹的同時, 把每個詞的出現次數轉換為頻率(jieba自帶一個dict.txt的詞典, 裡面有2萬多條詞, 包含了詞條出現的次數和詞性(作者基於人民日報語料等資源訓練得出來)。trie樹結構的詞圖掃描, 說的就是把這2萬多條詞語, 放到一個trie樹中, trie樹是有名的字首樹, 也就是說一個詞語的前面幾個字一樣, 就表示他們具有相同的字首, 就可以使用trie樹來儲存, 具有查詢速度快的優勢)。

2.對待分詞句子, 根據dict.txt生成的trie樹, 生成DAG, 通俗的講, 就是將句子根據給定的詞典進行查詞典操作, 生成所有

可能的句子切分。jieba在DAG中記錄的是句子中某個詞的開始位置, 從0到n-1(n為句子的長度), 每個開始位置作為字典的鍵, value是個list, 其中儲存了可能的詞語的結束位置(通過查字典得到詞, 開始位置+詞語的長度得到結束位置)

2.動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合

1.查詢待分詞句子中已經切分好的詞語(全模式下的分詞list), 得出查詢該詞語出現的頻率(次數/總數), 如果沒有該詞(基於詞典一般都是有的), 就把詞典中出現頻率最小的那個詞語的頻率作為該詞的頻率。

2.根據動態規劃查詢最大概率路徑的方法, 對句子從右往左反向計算最大概率(這裡反向是因為漢語句子的重心經常落在後面(右邊), 因為通常情況下形容詞太多, 後面的才是主幹。因此, 從右往左計算, 正確率要高於從左往右計算, 這裡類似於逆向最大匹配), P(NodeN)=1.0, P(NodeN-1)=P(NodeN)*Max(P(倒數第一個詞))…依次類推, 最後得到最大概率路徑, 得到最大概率的切分組合。

3.對於未登入詞,採用了基於漢字成詞能力的 HMM 模型,使用了 Viterbi 演算法

1.利用HMM模型將中文詞彙按照BEMS四個狀態來標記, B是開始begin位置, E是end結束位置, M是middle中間位置, S是singgle單獨成詞的位置。jieba採用(B,E,M,S)這四種狀態來標記中文詞語, 比如北京可以標註為 BE, 即 北/B 京/E, 表示北是開始位置, 京是結束位置, 中華民族可以標註為BMME, 就是開始, 中間, 中間, 結束.

2.作者利用大量語料進行訓練, 得到了三個概率表。分別是1)位置轉換概率,即B(開頭),M(中間),E(結尾),S(獨立成詞)四種狀態的轉移概率,P(E|B) = 0.851, P(M|B) = 0.149,說明當我們處於一個詞的開頭時,下一個字是結尾的概率要遠高於下一個字是中間字的概率,符合我們的直覺,因為二個字的詞比多個字的詞更常見。2)位置到單字的發射概率,比如P(“和”|M)表示一個詞的中間出現”和”這個字的概率;3) 詞語以某種狀態開頭的概率,其實只有兩種,要麼是B,要麼是S。這個就是起始向量, 就是HMM系統的最初模型狀態。實際上, BEMS之間的轉換有點類似於2元模型, 就是2個詞之間的轉移。二元模型考慮一個單詞後出現另外一個單詞的概率,是N元模型中的一種。
給定一個待分詞的句子, 就是觀察序列, 對HMM(BEMS)四種狀態的模型來說, 就是為了找到一個最佳的BEMS序列, 這個就需要使用viterbi演算法來得到這個最佳的隱藏狀態序列。通過訓練得到的概率表和viterbi演算法, 就可以得到一個概率最大的BEMS序列, 按照B打頭, E結尾的方式, 對待分詞的句子重新組合, 就得到了分詞結果. 比如 對待分詞的句子 ‘全世界都在學中國話’ 得到一個BEMS序列 [S,B,E,S,S,S,B,E,S], 通過把連續的BE湊合到一起得到一個詞, 單獨的S放單, 就得到一個分詞結果了。

三、jieba分詞過程

1. 載入字典, 生成trie樹。

2. 給定待分詞的句子, 使用正則獲取連續的 中文字元和英文字元, 切分成 短語列表, 對每個短語使用DAG(查字典)和動態規劃, 得到最大概率路徑, 對DAG中那些沒有在字典中查到的字, 組合成一個新的片段短語, 使用HMM模型進行分詞, 也就是作者說的識別未登入詞。

3. 使用python的yield 語法生成一個詞語生成器, 逐詞語返回。

四、jieba分詞的不足

1.dict.txt字典佔用的記憶體為140多M, 佔用記憶體過多。jieba中詞典的使用是為了彌補HMM在識別多字詞方面能力欠佳的問題, 所以詞典中儲存的是3 ,4 個字的詞語。專業化的詞典生成不方便,怎麼訓練自己的專用概率表沒有提供工具。

2.HMM識別新詞在時效性上是不足的, 並且只能識別2個字的詞, 對於3個字的新詞, 相對能力有限。

3.詞性標註效果不夠好,句法分析, 語義分析也都是沒有的。

4.命名實體識別效果不夠好。

參考文章

jieba分詞的原理

對Python中文分詞模組結巴分詞演算法過程的理解和分析

jieba官方文件