如果你只是想要簡單的如何使用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。