CRF詳解

如果你只是想要簡單的如何使用CRF++, 建議閱讀

 http://blog.csdn.net/Felomeng/article/details/4288492 。

這裏以一個具體的例子介紹CRF++的一些思想和代碼的實現過程。就加入我們想利用CRF++來進行分詞。

一. 數據及其格式介紹

Train.data

中 F1 B-NP
華 F2 I-NP
人 F3 B-NP
民 F4 I-NP
共 F5 B-NP
和 F6 M-NP
國 F7 I-NP
國 F8 B-NP
家 F9 I-NP
主 F10 B-NP
席 F11 I-NP

 

Template:

# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-1,0]/%x[0,0]
U06:%x[0,0]/%x[1,0]

U12:%x[0,1]

# Bigram
B

根據給定的template 和訓練數據,需要得到一個CRF模型。

這裏先對數據進行一個簡單的介紹,

Train.data:

中 F1 B-NP
華 F2 I-NP
人 F3 B-NP
對於輸入的一句話,最基本的單元是一個個的字。所以我們處理的單元是字。我們的任務是判斷每個字到底是詞首,詞中還是詞尾。在訓練數據中,我們用B-NP, M_NP,I_NP分別表示詞首,詞中,詞尾。  訓練數據的最後一列表示訓練集中每個字屬於哪一類。而F1, F2, F3.....則是表示每個字的其他特徵,比如詞性,頻率等。爲了方便,這裏假設這一列是詞性列。你可以爲它任意添加新的特徵,這也是CRF的優勢之一。但是一般來說,你如果在訓練集中定義了新特徵,那麼你在template 中必須想辦法用上。

Template:

U00:%x[-2,0]
U01:%x[-1,0]

U12:%x[0,1]

表示什麼意思,U00代表模板的名字, -2代表當行,意思是和當前字的位置,-2表示當前字的前面第2個字,比如,當前是“人”,-2代表是“中”。 注:如果當前是第一個字,如“中”,則-1用B-1,-2用B-2  代替。  第二個數字0 代表訓練數據中第幾個特徵,如這裏0代表第一列漢字,1代表 F1,F2,F3這一詞性列。則U00:%x[-2,0]的意思是當前字的前面第二個漢字是什麼? U12:%x[0,1]代表當前字的詞性是什麼?

# Bigram
B

表示的是bigram,這裏只有一個,表示只計算相鄰的字之間的bigram。

 

二. 數據在CRF++中的組織結構

中 F1 B-NP
華 F2 I-NP
人 F3 B-NP
民 F4 I-NP
共 F5 B-NP
和 F6 M-NP
國 F7 I-NP
國 F8 B-NP
家 F9 I-NP
主 F10 B-NP
席 F11 I-NP

開始,我們介紹幾個概念,

1. 所有漢字的可能類別

這裏就是指訓練數據中最後一列中的所有的可能值。這裏只有3個可能,B-NP, M-NP, I-NP。

2. unigram, bigram

 unigram :指的是template中的由Unigram定義的若干template.

bigram: 指的是template中由Bigram定義的若干template,這裏只有一個。 

3. 構建如下搜索矩陣

           
   I-NP((Template(1,2,...9)))  I-NP(Template(1,2,...9))  I-NP...  I-NP...  
   M-NP((Template(1,2,...9)))  M-NP(Template(1,2,...9))  M-NP...  M-NP...  
   B-NP(Template(1,2,...9))  B-NP(Template(1,2,...9)) B-NP...  B-NP...   
  中  華   人 民   

 

 我們的目標是構建一個模型,利用它解碼出來的路徑(模型期望)和數據庫中標註的期望(經驗期望)的差別小於某一個閾值。

4. node 和 path的概念

 如上面表格所示,每一個字 底下對應3個node, 如“中”,對應它屬於B-NP, M_NP,I_NP三個node.每個node對應有9個template(根據template模板定義)。計算該node的概率需要用到這些template的值。兩個相鄰列之間的node之間可以相互轉移,這條轉移的路徑就是path. 比如從“中”的3個node都可以轉移到“華”的I-NP節點,既有3條路徑可以從前面轉移到“華”的I-NP節點。 當然這中間有個轉移概率,這個轉移概率也主要通過template中的bigram來約束。某個node的概率可以由以下公式計算:

S_ij=log[Σlnode=1:3exp(αi-1+aij)]

 αi-1就是nodecost, aij就是transitioncost。



來源:http://blog.sina.com.cn/s/blog_790a12750100z32l.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章