這個,終於到了要解決命名實體識別
的問題,搞自然語言處理,貌似這個繞不開的。crf,傳統的幹這活的利器,聽名字就是高大上。既然繞不開,那就整整吧。
crf是用來標註和劃分序列結構資料的概率化結構模型
。言下之意,就是對於給定的輸出,標識序列y和觀測序列x,條件隨機場通過定義條件概率p(y | x),而不是聯合概率分布p(x, y)來描述模型。
很清楚了,這是個判別模型。
crf也可以看做乙個無向圖模型或者馬爾可夫隨機場。
任何乙個概念,都要從定義著手:
設g = (v, e)為乙個無向圖,v為結點集合,e為無向邊的結合。y = ,即v中的每個結點對應於乙個隨機變數yv,其取值範圍為可能的標記集合。如果以觀察序列x為條件,每乙個隨機變數yv都滿足以下馬爾可夫特性:p(yv | x, yw, w ≠ v) = p(yv | x, yw, w ~ v)
,其中,w ~ v表示兩個結點在圖g中是鄰近結點。那麼(x,y)為乙個條件隨機場。
從定義中能得出啥來呢?
crf考慮一件東西,不但要考慮自身,還要考慮周圍的情況。舉個例子,我們做命名實體識別,例句:「google的總部在矽谷」。我們知道位址是「矽谷」,其他位置的詞對我們識別「矽谷」有啥幫助呢?例如,「矽谷」前面是「在」,是不是這個字後面經常接位址呢?「在」前面的詞是不是應該是名詞?這樣的綜合考慮,就是crf中的特徵選擇或者叫特徵模板。
簡要的說,crf演算法,需要解決三個問題:
1、特徵的選擇
在crf中,很重要的工作就是找特徵函式,然後利用特徵函式來構建特徵方程。在自然語言處理領域,特徵函式主要是指乙個句子 s,詞在句子中的位置 i,當前詞的標籤 l_,前乙個詞的標籤 l_。
2、引數訓練
在每乙個特徵函式之前,都有乙個引數,也就是訓練它們的權重。crf的引數訓練,可以採用梯度下降法。
3、解碼
解碼問題,如果來乙個句子,遍歷所有可能的分割,會導致計算量過大。因此,可以採用類似viterbi這樣的動態規劃演算法,來提高效率。
這裡介紹的比較簡略,我當時看crf的資料,發現國外寫的都比較淺顯易懂,文末放鏈結。
下面介紹crf++的使用。
首先吐槽一下自己的智商,我在linux上安裝好crf++後,因為提示資訊比較奇怪,自己沒見過,所以一直以為沒安裝好,各種google和baidu,結果白花了兩天時間,真是心疼和鬱悶。
我就不貼圖了,這個按照官網的說明,一步步走下去,只要沒出error這樣的資訊,就是成功了。
如果不放心的話,那就按照官網的例子,跑跑證明一下。
我用的版本是crf++-0.58,應該是最新的,很久不更新了。按照說明安裝就好。
根據上面crf的介紹,我們列舉了crf要解決的三個問題:
特徵模板
引數訓練
解碼下面依次介紹crf++如何解決這三個問題。
1、特徵模板:
crf++解決這個問題,是編寫template檔案,資料格式(實體,標註)如下:
input: data
he prp b-np
reckons vbz b-vp
the dt b-np
<< current token
current jj i-np
account nn i-np
以current token
為基準,用%x[0,0]
這些數字組合來表示相應實體位置:
template
expanded feature
%x[0,0]
the%x[0,1]
dt%x[-1,0]
reckons
%x[-2,1]
prp%x[0,0]/%x[0,1]
the/dt
abc%x[0,1]123
abcdt123
模板型別有兩種,比較常用的是unigram template
(單字特徵),以u
開頭。比如,我們使用」u01:%x[0,1]
「為模板,crf++會自動的生成一系列的特徵函式:
func1 = if (output = b-np and feature="u01:dt") return
1else
return
0func2 = if (output = i-np and feature="u01:dt") return
1else
return
0func3 = if (output = o and feature="u01:dt") return
1else
return
0....
funcxx = if (output = b-np and feature="u01:nn") return
1else
return
0funcxy = if (output = o and feature="u01:nn") return
1else
return
0...
看起來好多式子啊,會生成多少個呢?
crf++的原理,就是生成l * n
個式子,l
是輸出的可能個數,n
是相應位置上可能的個數。上面的」u01:%x[0,1]
「,n就是在[0,1]
這個位置上有多少個可能性,再乘以輸出值(例如「b-np
」)的可能性。
這個仔細思考一下就好。
crf++生成所有的特徵函式,而訓練的就是這些特徵函式前面的權重引數。還有乙個模板型別是「
bigram template
」(雙字特徵),以「b
」開頭。和unigram template
的區別在於輸出,unigram template
輸出的是單個輸出標籤,bigram template
輸出的是兩個輸出標籤,則bigram template
的輸出可能性為l*l*n
。這個容易出現計算膨脹,所以,用unigram template
的多。
2、引數訓練
這個問題,crf++封裝的比較好了,直接使用命令:
%crf_learn
template train.data model
3、解碼
% crf_test -m model test.data
剩下的2, 3兩個問題還是比較簡單的了。 條件隨機場CRF
條件隨機場 crf 是給定一組輸入隨機變數x的條件下另一組輸出隨機變數y的條件概率分布模型,其特點是假設輸出隨機變數構成馬爾科夫隨機場。實際上是定義在時序資料上的對數線性模型。條件隨機場屬於判別模型。概率圖模型是由無向圖表示的聯合概率分布,概率無向圖模型的最大特點是易於因子分解。團 無向圖g中任何兩...
CRF條件隨機場
crf即條件隨機場 conditional random fields 是在給定一組輸入隨機變數條件下另外一組輸出隨機變數的條件概率分布模型,它是一種判別式 理解一些和生成模型的區別 的概率無向圖模型,既然是判別式,那就是對條件概率分布建模。一 概率無向圖模型 概率無向圖模型是由無向圖表示的聯合概率...
條件隨機場CRF原理
對於crf一直很嚮往,專門花了一些時間去查詢資料,一步一步弄明白了crf的基本原理,下面把crf部分核心寫了出來,時間倉促,很多細節沒有寫出來,後續會慢慢完善。而且crf需要用到很多的基礎知識,比如無向圖 有向圖,判別式 生成式,最大團等等概念,所以想要徹底的理解crf,必須弄明白這些基礎知識。當然...