CRF 及CRF++ 安装与解释
CRF簡介
ConditionalRandomField:條件隨機場,一種機器學習技術(模型)
CRF由John Lafferty最早用于NLP技術領域,其在NLP技術領域中主要用于文本標注,并有多種應用場景,例如:
分詞(標注字的詞位信息,由字構詞)
詞性標注(標注分詞的詞性,例如:名詞,動詞,助詞)
命名實體識別(識別人名,地名,機構名,商品名等具有一定內在規律的實體名詞)
本文主要描述如何使用CRF技術來進行中文分詞。
CRFVS 詞典統計分詞
基于詞典的分詞過度依賴詞典和規則庫,因此對于歧義詞和未登錄詞的識別能力較低;其優點是速度快,效率高
CRF代表了新一代的機器學習技術分詞,其基本思路是對漢字進行標注即由字構詞(組詞),不僅考慮了文字詞語出現的頻率信息,同時考慮上下文語境,具備較好的學習能力,因此其對歧義詞和未登錄詞的識別都具有良好的效果;其不足之處是訓練周期較長,運營時計算量較大,性能不如詞典分詞
CRF VS HMM,MEMM
首先,CRF,HMM(隱馬模型),MEMM(最大熵隱馬模型)都常用來做序列標注的建模,像分詞、詞性標注,以及命名實體標注
隱馬模型一個最大的缺點就是由于其輸出獨立性假設,導致其不能考慮上下文的特征,限制了特征的選擇
最大熵隱馬模型則解決了隱馬的問題,可以任意選擇特征,但由于其在每一節點都要進行歸一化,所以只能找到局部的最優值,同時也帶來了標記偏見的問題,即凡是訓練語料中未出現的情況全都忽略掉
條件隨機場則很好的解決了這一問題,他并不在每一個節點進行歸一化,而是所有特征進行全局歸一化,因此可以求得全局的最優值。
CRF分詞原理
1. CRF把分詞當做字的詞位分類問題,通常定義字的詞位信息如下:
詞首,常用B表示
詞中,常用M表示
詞尾,常用E表示
單子詞,常用S表示
2. CRF分詞的過程就是對詞位標注后,將B和E之間的字,以及S單字構成分詞
3. CRF分詞實例:
原始例句:我愛北京天安門
CRF標注后:我/S 愛/S 北/B 京/E 天/B 安/M 門/E
分詞結果:我/愛/北京/天安門
CRF分詞工具包
上面介紹了CRF技術思想以及如何用于分詞,下面將介紹如何在實際開發中使用CRF進行分詞工作。目前常見的CRF工具包有pocket crf, flexcrf 車crf++,目前網上也有一些它們3者之間的對比報告,個人感覺crf++在易用性,穩定性和準確性等綜合方面的表現最好,同時在公司的項目開發中也一 直在使用,因此下面將概述一下crf++的使用方法(具體細節可以到crf++官方主頁去查 閱,http://crfpp.sourceforge.net/),下載地址http://download.csdn.NET/detail/u013378306/9740556
1.安裝
編譯器要求:C++編譯器(gcc 3.0或更高)
命令:
% ./configure
% make
% su
# make install
注:只有擁有root帳號的用戶才能成功安裝。
2.使用
2.1訓練和測試文件的格式
訓練和測試文件必須包含多個tokens,每個token包含多個列。token的定義可根據具體的任務,如詞、詞性等。每個token必須寫在一行,且各列之間用空格或制表格間隔。一個token的序列可構成一個sentence,sentence之間用一個空行間隔。
最后一列是CRF用于訓練的正確的標注形式。
例如:
iphone ASCII S
是 CN S
一 CN S>> 當前token
款 CN S
不 CN B
錯 CN E
的 CN S
手 CN B
機 CN E
, PUNC S
還 CN S
能 CN S
聽 CN B
歌 CN E
。PUCN S
我上面的例子每個token包含3列,分別為字本身、字類型(英文數字,漢字,標點等)和詞位標記。
注意:如果每一個token的列數不一致,系統將不能正確運行。
2.2準備特征模板
使用CRF++的用戶必須自己確定特征模板。
1)基本模板和宏
模板文件中的每一行代表一個template。每一個template中,專門的宏%x[row,col]用于確定輸入數據中的一個token。row用于確定與當前的token的相對行數。col用于確定絕對行數。
如已知下面的輸入數據:
iphone ASCII S
是 CN S
一 CN S>> 當前token
款 CN S
不 CN B
錯 CN E
的 CN S
手 CN B
機 CN E
特征模板形式為:
# 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]
U07:%x[-1,0]/%x[1,0]
U08:%x[0,1]
U09:%x[-1,1]/%x[0,1]
# Bigram
B
2)模板類型
有兩種模板類型,它們可由template的第一個字符確定。
第一種是Unigram template:第一個字符是U
這是用于描述unigram feature的模板。當你給出一個模板"U02:%x[0,0]",CRF會自動的生成一個特征函數集合(func1 ... funcN),如:
func1 = if (output = B and feature="U02:一") return 1 else return 0
func2 = if (output = M and feature="U02:一") return 1 else return 0
func3 = if (output = E and feature="U02:一") return 1else return 0
func4 = if (output = S and feature="U02:一") return 1else return 0
...
funcX = if (output = B and feature="U02:的") return 1else return 0
funcY = if (output = S and feature="U02:的") return 1else return 0
...
一個模型生成的特征函數的個數總數為L*N,其中L是輸出的類別數,N是根據給定的template擴展出的unique string的數目。
第二種類型Bigram template:第一個字符是B
這 個模板用于描述bigram features。使用這個模板,系統將自動產生當前輸出token與前一個輸出token(bigram)的組合。產生的可區分的特征的總數是 L*L*N,其中L是輸出類別數,N是這個模板產生的unique features數。當類別數很大的時候,這種類型會產生許多可區分的特征,這將會導致訓練和測試的效率都很低下。
3)使用標識符區分相對位置
如果用戶需要區分token的相對位置時,可以使用標識符。
比如在下面的例子中,宏"%x[-2,0]"和"%x[1,0]"都代表“北”,但是它們又是不同的“北“。
北 CN B
京 CN E
的 CN S>> 當前token
北 CN S
部 CN S
為了區分它們,可以在模型中加入一個唯一的標識符(U00: 或 U03:),即:
U00:%x[-2,0]
U03:%x[1,0]
在這樣的條件下,兩種模型將被認為是不同的,因為他們將被擴展為”U00:北“和”U03:北”。只要你喜歡,你可以使用任何標識符,但是使用數字序號區分更很有用,因為它們只需簡單的與特征數相對應。
3.訓練(編碼)
使用crf_learn 命令:
% crf_learn template_file train_file model_file
其中,template_file和train_file需由使用者事先準備好。crf_learn將生成訓練后的模型并存放在model_file中。
一般的,crf_learn將在STDOUT上輸出下面的信息。還會輸出其他的和LBFGS迭代相關的信息。
% crf_learn template_file train_file model_file
CRF++: Yet Another CRF Tool Kit
Copyright (C) 2005 Taku Kudo, All rights reserved.
reading training data:
Done! 0.32 s
Number of sentences:77
Number of features:32856
Freq:1
eta:0.0001
C(sigma^2):10
iter=0 terr=0.7494725738 serr=1 obj=2082.968899 diff=1
iter=1 terr=0.1671940928 serr=0.8831168831 obj=1406.329356 diff=0.3248438053
iter=2 terr=0.1503164557 serr=0.8831168831 obj=626.9159973 diff=0.5542182244
其中:
iter:迭代次數
terr:和tags相關的錯誤率(錯誤的tag數/所有的tag數)
serr:與sentence相關的錯誤率(錯誤的sentence數/所有的sentence數)
obj:當前對象的值。當這個值收斂到一個確定的值是,CRF模型將停止迭代
diff:與上一個對象值之間的相對差
有兩個主要的參數用于控制訓練條件:
-c float:使用這個選項,你可以改變CRF的hyper-parameter。當取一個極大的C值,CRF將可能對訓練數據產生過擬合 (overfitting)現象。這個參數將會調節overfitting和underfitting之間的平衡。結果將會對參數帶來有意義的影響。使用 者可以通過使用held-out data或者更多的通用模型的選擇方法如十字交叉驗證法(cross validation)獲得最有的值。
-f NUM:這個參數用于設置特征的cut-off閾值。CRF++訓練時只使用出現次數不少于NUM次數的特征進行訓練。默認值為1。當使用CRF++訓練大規模數據時,單一特征的數量將達到數百萬,此時選擇這個參數很有用。
這里有一個使用這兩個參數的例子:
% crf_learn -f 3 -c 1.5 template_file train_file model_file
4.測試(解碼)
使用crf_test 命令:
% crf_test -m model_file test_files ...
其中,model_file是crf_learn創建的。在測試過程中,使用者不需要指定template file,因為,mode file已經有了template的信息。test_file是你想要標注序列標記的測試語料。這個文件的書寫格式應該與訓練文件一致。
下面是一個crf_test輸出的例子:
% crf_test -m model test.data
RockwellNNPBB
InternationalNNPII
Corp.NNPII
'sPOSBB
TulsaNNPII
unitNNII
..
其中,最后一列是模型估計的tag。如果第三列是標準的tag,則可以通過簡單的比較第三列和第四列之間的差別計算出準確率。
詳細的層次(verbose level)
-v選項:將設置verbose level。默認值為0。通過增加層次,你可以從CRF++獲得額外的信息。
層次1:
你 可以對每個tag使用邊緣概率(marginal probabilities)(這是一種對輸出tag的confidence measure),對輸出使用條件概率(conditional probably)(針對整個輸出的confidence measure)。
例如:
% crf_test -v1 -m model test.data| head
# 0.478113
RockwellNNPBB/0.992465
InternationalNNPII/0.979089
Corp.NNPII/0.954883
'sPOSBB/0.986396
TulsaNNPII/0.991966
...
其中,第一行的"# 0.478113"即是輸出的條件概率,而且每一個輸出tag各自含有一個概率,表示形式如“B/0.992465”。
層次2:
你可以對所有的其他候選求邊緣概率。
例如:
% crf_test -v2 -m model test.data
# 0.478113
RockwellNNPBB/0.992465B/0.992465I/0.00144946O/0.00608594
InternationalNNPII/0.979089B/0.0105273I/0.979089O/0.0103833
Corp.NNPII/0.954883B/0.00477976I/0.954883O/0.040337
'sPOSBB/0.986396B/0.986396I/0.00655976O/0.00704426
TulsaNNPII/0.991966B/0.00787494I/0.991966O/0.00015949
unitNNII/0.996169B/0.00283111I/0.996169O/0.000999975
..
N-best outputs
-n選項:使用這個選項將獲得N-best結果,它根據CRF計算出的條件概率排序得到。當選擇了N-best結果,CRF++會自動添加一行,形式為“# N prob”,其中N是排序后的輸出結果,從0開始。prob表示output的條件概率。
需要注意的是,如果CRF++不能找到足夠的N條路徑是,它將放棄列舉N-best結果。這種情況在所給的句子很短的情況下常出現。
CRF++使用前向Viterbi和后向A*搜索相結合的方法。這種結合適應了n-best結果的需求。
下面是一個N-best結果的例子:
% crf_test -n 20 -m model test.data
# 0 0.478113
RockwellNNPBB
InternationalNNPII
Corp.NNPII
'sPOSBB
...
# 1 0.194335
RockwellNNPBB
InternationalNNPII
from:https://blog.csdn.net/u013378306/article/details/54603926
總結
以上是生活随笔為你收集整理的CRF 及CRF++ 安装与解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火车头采集器采集文章使用教程实例
- 下一篇: 削足适履什么意思(削足适履也不合适怎么办