Jieba分詞介紹


概述

    結巴分詞是一款非常流行中文開源分詞包,具有高性能、准確率、可擴展性等特點,目前主要支持python,其它語言也有相關版本,好像維護不是很實時。

分詞功能介紹

    這里只介紹他的主要功能:分詞,他還提供了關鍵詞抽取的功能。

  • 精確模式

    默認模式。句子精確地切開,每個字符只會出席在一個詞中,適合文本分析;

Print "/".join(jieba.cut("我來到北京清華大學")) 
我/來到/北京/清華大學
  • 全模式

    把句子中所有詞都掃描出來, 速度非常快,有可能一個字同時分在多個詞

print "/".join(jieba.cut("我來到北京清華大學", cut_all=True)) 
我/來到/北京/清華/清華大學/華大/大學 
  • 搜索引擎模式

    在精確模式的基礎上,對長度大於2的詞再次切分,召回當中長度為2或者3的詞,從而提高召回率,常用於搜索引擎。

print "/".join(jieba.cut_for_search("小明碩士畢業於中國科學院計算所,后在日本京都大學深造")) 
小明/碩士/畢業/於/中國/科學/學院/科學院/中國科學院/計算/計算所/,/后/在/日本/京都/大學/日本京都大學/深造
  • 詞性分詞

    只支持精確模式分詞,同時給出詞的詞性

for w, f in pseg.cut("我叫李小明, 我來到北京清華大學"): 
print u"{}_{}".format(w, f), 
我_r 叫_v 李小明_nr ,_x _x 我_r 來到_v 北京_ns 清華大學_nt 
  • 新詞發現

    Jieba默認會對連續的單個字符使用HMM進行新詞識別

print "/".join(jieba.cut("我是李華,我來到北京清華大學")) 
print "/".join(jieba.cut("我是李華,我來到北京清華大學", HMM=False)) 
我|是|李華|,|我|來到|北京|清華大學 
我|是|李|華|,|我|來到|北京|清華大學 

自定義詞表

    個人認為,自定義詞表是結巴最大的優勢,提高准確率,方便后續擴展,常見模型分詞做不到這點。

print "/".join(jieba.cut("大家好,我是春雨醫生")) 
jieba.add_word(u"春雨醫生") # 添加自定義詞
print "/".join(jieba.cut("大家好,我是春雨醫生")) 
大家/好/,/我/是/春雨/醫生 
大家/好/,/我/是/春雨醫生 

    當然你也可以直接添加一個詞典文件
   用法: jieba.load_userdict(file_name)
   詞典格式和 dict.txt 一樣,一個詞占一行;每一行分三部分:詞語、詞頻(可省略)、詞性(可省略),用空格隔開。
   詞頻省略時使用自動計算的能保證分出該詞的詞頻。
  例如:

創新辦 3 i
雲計算 5
凱特琳 nz
台中

 刪除詞:del_word(word)

jieba分詞原理說明

    結巴分詞其實就是通過詞典分詞,然后對不在詞典的詞使用HMM算法識別新詞。

  • 基於詞典分詞

   屬於分詞中的詞表分詞。結巴主要基於有向無環圖的查找算法,通過動態規划,從后至前使得詞的切割組合聯合概率最大。下面以“春雨醫生你好全身紅疹子”為例

   假設我們的詞典如下

春雨 100 n
醫生 100 n
春雨醫生 100 n
你好 100 n
全身 100 n
紅疹 100 n
疹子 100 n

 從而有向無環圖如下:

   

     每個詞都會有一個連接的有向邊,字本身都會有一個自我連接的邊。用索引位置代表字符,鄰接鏈表存取表示如下。0:[0, 1, 3]代表春可以組成詞[春, 春雨, 春雨醫生]

     {0: [0, 1, 3], 1: [1], 2: [2, 3], 3: [3], 4: [4, 5], 5: [5]}
    如果我們給每條路徑加上權重,從而我們的分詞轉換成了求最大路徑,將最大路徑轉換成分詞的目標函數就是最大聯合概率(路徑相乘)。我們先看春雨醫生四個字,這四個字沒有與其他字的路徑,也就是說這四個字的分詞是獨立,他們的最大路徑必定也是整個句子的最大路徑的子路徑。春雨醫生四個字總共存在四條路徑:[春,雨,醫,生]、[春雨,醫,生]、[春雨,醫生]、[春雨醫生]。每條邊的權重即這個詞的概率為:p=freq/total,freq代表這個詞的頻數,也就是我們在詞表里面設定的100,total為所有詞頻數之和,由於freq小於total,那么p是小於1的。簡單計算:p[春,雨,醫,生]<p[春雨,醫,生]<p[春雨,醫生]<p[春雨醫生],我們會發現jieba傾向於分出更長的詞,這是因為詞權重小於1,相乘越多越小。權重在在分詞中到底是做什么的?消歧,當某個字屬於多個互不包含的詞時,例如我的紅疹與疹子兩個詞中診應該和誰集合,這時就是權重起作用的時候。如果freq(紅疹)*freq(子)>=freq(紅)*freq(疹子)就分為紅+疹子。整個句子的計算其實就是一個簡單動態規划。從后至前,后面某個階段的最大分詞結果作為前面的結果,例如計算身位置后的路徑總權重時,只需要將紅疹子的最大權重賦給身就行了。計算參考jieba/__init__.py中的calc方法:

def calc(self, sentence, DAG, route): 
    N = len(sentence) 
    route[N] = (0, 0) 
    logtotal = log(self.total) 
    for idx in xrange(N - 1, -1, -1): 
        route[idx] = max((log(self.FREQ.get(sentence[idx:x + 1]) or 1) - logtotal + route[x + 1][0], x) for x in DAG[idx]) 
  • 基於HMM的新詞識別

    有時候我們的詞表並不能覆蓋所有的詞,如果不加處理就會被識別為單個字符,jieba是使用HMM來進行二次分詞,即新詞的識別。HMM屬於分詞中的序列標注,使用模型識別詞每個位置的狀態值。
    HMM的原理我不詳細介紹,有興趣的可以查看其它資料。

    

 

    HMM主要由兩部分組成觀察序列X與隱藏序列Y,隱藏序列是我們要預測的序列。和傳統預測模型不一樣,HMM還考慮被預測值的前后關系,以前面的天氣預測為例,如果去預測明天,那么我們就可以用今天的觀測值濕度等特征以及今天的隱藏值天氣情況去預測明天。

    在分詞中,觀察序列即輸入的字符,輸出數列用“BEMS”代表。其中,B代表該字是詞語中的起始字,M代表是詞語中的中間字,E代表是詞語中的結束字,S則代表是單字成詞。“春雨醫生/你好/全身/紅疹/子”就可以表示為BMME/BE/BE/BE/S,由此可見HMM分詞就是要預測所有字符的BEMS值。
    在分詞中我們常用Viterbi算法來計算HMM。它主要訓練以下三張表:狀態的初始概率表π,輸出序列直接轉移關系表A,觀察序列到輸出序列的轉移概率表B,詳細實例請參考

其它分詞

 

    目前比較常見的分詞都是基於序列標注的方法,即用更加復雜的模型來代替HMM,然后來預測字符的“BEMS”值。比較常見的模型主要為CRF和深度學習。

  • 基於CRF的分詞方法

      

 

     HMM是生成模型它是通過查表尋找聯合概率最大的組合,而CRF是判別模型,它是通過構造一個預測輸出序列類別概率(字符在BEMS類別的概率)的目標函數。其實CRF是HMM隨機場的更一般形式,HMM假設隨機場中某一個位置的賦值僅僅與和它相鄰的位置的賦值有關,和與其不相鄰的位置的賦值無關。HMM中使用兩個轉移矩陣的聯合概率表示輸出變量Y,而CRF是用一個特征函 表示觀測變量與輸出變量的關聯關系,其中X表示輸入變量,i為當前位置,y表示輸出狀態值。f_k其實是節點特征函數與局部特征函數的統一表示。在分詞中構建出聯合概率函數就可以求解出每個位置的“BEMS”值了。

  • 基於深度學習的分詞方法

    目前比較成熟的方法主要使用雙向LSTM+CRF實現,其本質也輸入序列標注,所以具有通用性,命名實體識別等都可以使用該模型(把詞的類別BEMS換成相應的實體類別)。

      

                                   圖:LSTM+CRF框架 

    

                                圖:實體識別

    從上圖可以看出BiLSTM-CRF主要有三層,輸入層:詞的embedding;中間層:雙向LSTM網絡,得到一個序列特征向量;目標層:LSTM的輸出向量為特征,預測類別為目標,CRF為損失函數。該模型目前已有開源的方法FoolNLTK,當然你也可以用目前最火的BERT模型替換LSTM,我相信效果會比較好。
    模型分詞相對於jieba會慢很多,他還有一個比較嚴重的缺陷就是不能引入詞表,特別對於一些新詞,模型很難學出該部分特征,往往無法識別。FoolNLTK雖然可以加入詞表,但是他是在模型分完詞的結果上進行的調整。我覺得可以嘗試在深度學習里面加入更多的特征滿足該需求。


參考資料
分詞簡介: https://zhuanlan.zhihu.com/p/33261835
結巴分詞: https://github.com/fxsjy/jieba
HMM介紹: https://www.leiphone.com/news/201704/nT29tSWJlJ0WsWL7.html
CRF: https://cedar.buffalo.edu//~srihari/CSE574/Chap13/Ch13.5-ConditionalRandomFields.pdf
CRF:https://zhuanlan.zhihu.com/p/29989121
Bi-LSTM+CRF: https://www.unclewang.info/learn/machine-learning/756/
Fool分詞:https://github.com/rockyzhengwu/FoolNLTK


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM