目錄html
經過前面幾篇系列文章,咱們從分詞中最基本的問題開始,並分別利用了1-gram和HMM的方法實現了分詞demo。本篇博文在此基礎上,重點介紹利用CRF來實現分詞的方法,這也是一種基於字的分詞方法,在將句子轉換爲序列標註問題以後,不使用HMM的生成模型方式,而是使用條件機率模型進行建模,即判別模型CRF。以後咱們對CRF與HMM進行對比,一樣的咱們最終也會附上CRF分詞的實現代碼。python
淺談分詞算法(1)分詞中的基本問題
淺談分詞算法(2)基於詞典的分詞方法
淺談分詞算法(3)基於字的分詞方法(HMM)
淺談分詞算法(4)基於字的分詞方法(CRF)
淺談分詞算法(5)基於字的分詞方法(LSTM)git
爲了說清楚CRF在分詞上的應用,咱們須要簡單介紹下條件隨機場CRF,咱們不去長篇大論的展開論述,只討論幾個核心的點,並重點闡述下線性鏈條件隨機場,也是咱們在序列標註問題中常常遇到的,如分詞、詞性標註、韻律標註等等。github
在上一篇博文中,咱們簡單介紹了HMM模型,是一個五元組,它的核心圍繞的是一個關於序列\(X\)和\(Y\)的聯合機率分佈\(P(X,Y)\),而在條件隨機場的核心圍繞的是條件機率分佈模型\(P(Y|X)\),它是一種馬爾可夫隨機場,知足馬爾科夫性(這裏咱們就不展開闡述了,具體可參考[3])。咱們這裏必須搬出一張經典的圖片,你們可能在網上的無數博文中也都看到過,其來源與[4]:
從圖中咱們能夠看出模型之間的演化過程以及模型之間的區別,對於用在分類問題中的邏輯迴歸與CRF其實都同屬於對數線性模型,這裏直觀的咱們也很好理解,當用CRF模型對\(X\)和\(Y\)序列建模時,咱們須要判斷\(x_i\)對應的標籤\(y_i\)時其實能夠看作一次邏輯迴歸分類問題,只不過這個分類問題考慮了上下文的序列信息,也就是說單純的迴歸分類會損失上下文的序列信息如:有一系列連續拍攝的照片,如今想在照片上打上表示照片裏的活動內容的標記,固然能夠將每張照片單獨作分類,可是會損失信息,例如當有一張照片上是一張嘴,應該分類到「吃飯」仍是分類到「唱K」呢?若是這張照片的上一張照片內容是吃飯或者作飯,那麼這張照片表示「吃飯」的可能性就大一些,若是上一張照片的內容是跳舞,那這張照片就更有可能在講唱K的事情。算法
設有聯合機率分佈\(P(Y)\),由無向圖\(G=(V,E)\)表示,在圖\(G\)中,結點表示隨機變量,邊表示隨機變量之間的依賴關係,若是聯合機率分佈\(P(Y)\)知足成對、局部或全局馬爾可夫性,就稱此聯合機率分佈爲馬爾可夫隨機場(Markov random filed)也稱機率無向圖模型(probablistic undirected graphical model):macos
下面咱們具體闡述下一種特殊也經常使用的線性鏈條件隨機場。ubuntu
給定一個線性鏈條件隨機場\(P(Y|X)\),當觀測序列爲\(x=x_1x_2...\)時,狀態序列爲 \(y=y_1y_2...\)的機率可寫爲(實際上應該寫爲\(P(Y=y|x;θ)\),參數被省略了)api
\(Z(x)\)做爲規範化因子,是對\(y\)的全部可能取值求和。咱們能夠用下圖來理解:
dom
對於線性鏈CRF,特徵函數是個很是重要的概念(很容易聯想到HMM的轉移機率和發射機率):函數
通常來講,特徵函數的取值爲 1 或 0 ,當知足規定好的特徵條件時取值爲 1 ,不然爲 0 。
對於轉移特徵這一項:
能夠看出外面那個求和號是套着裏面的求和號的,這種雙重求和就代表了對於同一個特徵\(k\),在各個位置\(i\)上都有定義。
基於此,很直覺的想法就是把同一個特徵在各個位置\(i\)求和,造成一個全局的特徵函數,也就是說讓裏面那一層求和號消失。在此以前,爲了把加號的兩項合併成一項,首先將各個特徵函數\(t\)(設其共有\(K_1\)個)、\(s\)(設共\(K_2\)個)都換成統一的記號\(f\) :
相應的權重同理:
那麼就能夠記爲:
而後就能夠把特徵在各個位置\(i\)求和,即
其中\(K=K_1+K_2\)。進而能夠獲得簡化表示形式:
這個形式咱們在下一節介紹CRF分詞的時候會使用。
對於一個句子的分詞問題咱們在前面的系列博文中已經闡述,輸入的句子\(S\)至關於序列\(X\),輸出的標籤序列L至關於序列\(Y\),咱們要訓練一個模型,使得在給定\(S\)的前提下,找到其最優對應的\(L\)。
訓練該模型的關鍵點就是特徵函數\(F\)的選取以及每一個特徵函數權重\(W\)的肯定,而對於每一個特徵函數而言,其輸入有以下四個要素:
它的輸出值是0或者1,0表示要評分的標註序列不符合這個特徵,1表示要評分的標註序列符合這個特徵。咱們發現這裏的特徵函數在選取當前\(s_i\)的對應標籤\(l_i\)時,只考慮了其前一個標籤\(l_{i-1}\),這就是使用了咱們上一節闡述的線性鏈條件隨機場,而公式中的f就是咱們這裏的特徵函數。
Note:在實際的應用時,除了單一的特徵選取,咱們一般會經過構造複合特徵的方式,考慮更多的上下文信息。
在上一篇博文中咱們介紹了HMM在分詞中的使用,那麼讀者確定會問既然HMM已經能完成任務,爲何還須要CRF來從新搞一波,緣由就是CRF比HMM更強大。
對於序列\(L\)和\(S\),根據以前的介紹咱們易知以下公式:
其中\(w_i\)爲\(S\)中第\(i\)個詞,\(l_i\)爲第\(i\)個詞的標籤,公式中前半部分爲狀態轉移機率,後半部分爲發射機率。咱們用對數形式表示該式:
把這個式子與CRF的簡化形式比較,不難發現,若是咱們把第一個HMM式子中的log形式的機率看作是第二個CRF式子中的特徵函數的權重的話,咱們會發現,CRF和HMM具備相同的形式。因此能夠說:每個HMM模型都等價於某個CRF。
總結下二者的區別:
Note:其實在HMM和CRF之間還有一個MEMM,即最大熵馬爾科夫模型,MEMM模型是對轉移機率和表現機率創建聯合機率,統計時統計的是條件機率,但MEMM容易陷入局部最優,是由於MEMM只在局部作歸一化(標記偏置問題),不過通常用的很少咱們就不過多介紹,可參考[5]
下面咱們利用wapiti來實現一個簡單的CRF分詞器。相關說明:
https://github.com/xlturing/machine-learning-journey/tree/master/seg_crf
你們能夠直接看下源代碼
這個訓練集和測試集都相對較小,效果還不錯,讀者在真正上線使用時還須要依賴詞典等諸多與場景對應的分詞特性,本文更加關注原理和理解。