CRF++
( 空格分隔): nlp
[TOC]
http://x-algo.cn/index.php/2016/02/29/crf-name-entity-recognition/#i
使用說明
安裝
CRF++官網(wǎng): https://taku910.github.io/crfpp/#tips
注意windows和linux下載的版本不同
example 包含 basenp,chunking珍昨,JapaneseNE争舞,seg辜腺。前兩個是英文數(shù)據(jù),后兩個是日文數(shù)據(jù)邓夕。第一個應(yīng)該是命名實體識別偎快,第二個應(yīng)該是分詞,第三個應(yīng)該是日文命名實體識別恕洲,第四個不清楚。windows: 可以選擇example里的某個例子做測試梅割,比如選chunking霜第。將crf_learn.exe;crf_test.exe户辞;libcrfpp.dll三個文件復(fù)制到到泌类,含有exec.sh;template底燎;test.data刃榨;train.data的文件夾(chunking)里。cmd,cd進入該文件夾
(目的:保持?jǐn)?shù)據(jù)文件和代碼文件處于同一目錄下双仍,減少輸入文件路徑)
使用參考教程:
Windows下CRF++分詞實踐及Python分詞效果評測
命名實體識別參考教程:
[1] http://blog.csdn.net/felomeng/article/details/4367250
[2] 人民日報:http://blog.csdn.net/cuixianpeng/article/details/42171615注意:
務(wù)必記得每行的訓(xùn)練數(shù)據(jù)的標(biāo)注必須要加上開頭的B_枢希、I_等等。
否則sgd在訓(xùn)練過程中殊校,雖然accuracy一直會增長晴玖,但是precision和recall將一直是0.
template
模板說明: http://www.hankcs.com/nlp/the-crf-model-format-description.html
jieba 結(jié)巴分詞和詞性標(biāo)注:
http://www.mamicode.com/info-detail-1889910.html
訓(xùn)練模型
不帶參數(shù):
crf_learn template_file train_file model_file
這個訓(xùn)練過程的時間读存、迭代次數(shù)等信息會輸出到控制臺上如果想保存這些信息为流,我們可以將這些標(biāo)準(zhǔn)輸出流到文件上,命令格式如下:
crf_learn template_file train_file model_file > train_info_file
-
帶參數(shù)
crf_learn -a CRF-L2 -c 4.0 -f 3 -p 4 template train.data model
-a CRF-L2 or CRF-L1 規(guī)范化算法選擇让簿。默認(rèn)是CRF-L2敬察。一般來說L2算法效果要比L1算法稍微好一點,雖然L1算法中非零特征的數(shù)值要比L2中大幅度的小尔当。 -c float 這個參數(shù)設(shè)置CRF的hyper-parameter莲祸。c的數(shù)值越大蹂安,CRF擬合訓(xùn)練數(shù)據(jù)的程度越高。這個參數(shù)可以調(diào)整過度擬合和不擬合之間的平衡度锐帜。這個參數(shù)可以通過交叉驗證等方法尋找較優(yōu)的參數(shù)田盈。 -f NUM 這個參數(shù)設(shè)置特征的cut-off threshold。CRF++使用訓(xùn)練數(shù)據(jù)中至少NUM次出現(xiàn)的特征缴阎。默認(rèn)值為1允瞧。當(dāng)使用CRF++到大規(guī)模數(shù)據(jù)時,只出現(xiàn)一次的特征可能會有幾百萬蛮拔,這個選項就會在這樣的情況下起到作用述暂。 -p NUM 如果電腦有多個CPU,那么那么可以通過多線程提升訓(xùn)練速度建炫。NUM是線程數(shù)量畦韭。 -f, --freq=INT 使用屬性的出現(xiàn)次數(shù)不少于INT(默認(rèn)為1) -m, --maxiter=INT 設(shè)置INT為LBFGS的最大跌代次數(shù)(默認(rèn)10k) -c, --cost=FLOAT 設(shè)置FLOAT為代價參數(shù),過大會過度擬合(默認(rèn)1.0) -e, --eta=FLOAT 設(shè)置終止標(biāo)準(zhǔn)FLOAT(默認(rèn)0.0001) -C, --convert 將文本模式轉(zhuǎn)為二進制模式 -t, --textmodel 為調(diào)試建立文本模型文件 -a, --algorithm=(CRF|MIRA) 選擇訓(xùn)練算法肛跌,CRF-L2 or CRF-L1艺配,默認(rèn)為CRF-L2 -p, --thread=INT 線程數(shù)(默認(rèn)1),利用多個CPU減少訓(xùn)練時間 -H, --shrinking-size=INT 設(shè)置INT為最適宜的跌代變量次數(shù)(默認(rèn)20) -v, --version 顯示版本號并退出 -h, --help 顯示幫助并退出
測試
- 不帶參數(shù):
crf_test -m model_file test_files
與crf_learn類似衍慎,輸出的結(jié)果放到了標(biāo)準(zhǔn)輸出流上 - 而這個輸出結(jié)果是最重要的預(yù)測結(jié)果信息(測試文件的內(nèi)容+預(yù)測標(biāo)注)妒挎,同樣可以使用重定向,將結(jié)果保存下來西饵,命令行如下:
crf_test -m model_file test_files >> result_file
- 帶參數(shù):
crf_test -v1 -m model test.data| head
有兩個參數(shù)-v和-n都是顯示一些信息的酝掩,
-v,可以顯示預(yù)測標(biāo)簽的概率值
-n眷柔,可以顯示不同可能序列的概率值期虾,對于準(zhǔn)確率,召回率驯嘱,運行效率镶苞,沒有影響
評估結(jié)果
安裝 perl strawberry 64bit for windows
下載 conlleval.pl
運行命令:
perl conlleval.pl <result.txt
result.txt是待評估的文件,是crf測試集輸出的結(jié)果注意:
conlleval.pl中代碼my $delimiter = " "; # field delimiter
要求待評估的文件鞠评,必須是以空格作為分隔符茂蚓,否則運行命令出錯:
conlleval: unexpected number of features in line XXX XX XX
參考說明:http://www.52ml.net/2463.html解決方法1:將conlleval.pl中的空格分隔符改為tab,即:
my $delimiter = "[空格]"
替換為my $delimiter = "[tab]"
解決方法2:將result.txt中的tab分隔符改為空格
實驗結(jié)果
Windows 10 , python 2.7
處理步驟:
- 原始語料處理
一句一行
*可選:去除{{time:}}等標(biāo)記- 打標(biāo)簽 BMEUNS
- 切分訓(xùn)練集和測試集
- 調(diào)整crf++的template
- 訓(xùn)練,調(diào)參
- 測試
- 評估
word+POS+Tag(B/M/E/U/NS)
- 去掉了原始語料中的{{time:}}等符號 , pos+tag
娃哈哈 nz B
集團 n E
在 p NS
黔 j U
發(fā)展 vn NS
近十年 l U
剃幌, x NS
見證 v NS
了 ul NS
貴州 ns U
發(fā)展 vn NS
取得 v NS
的 uj NS
巨大 a NS
成績 n NS
聋涨。 x NS
- 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]
U10:%x[-2,1]
U11:%x[-1,1]
U12:%x[0,1]
U13:%x[1,1]
U14:%x[2,1]
U15:%x[-2,1]/%x[-1,1]
U16:%x[-1,1]/%x[0,1]
U17:%x[0,1]/%x[1,1]
U18:%x[1,1]/%x[2,1]
U20:%x[-2,1]/%x[-1,1]/%x[0,1]
U21:%x[-1,1]/%x[0,1]/%x[1,1]
U22:%x[0,1]/%x[1,1]/%x[2,1]
U23:%x[0,1]
# Bigram
B
Done!179.61 s
POS+dictionary
- userDic
浙江在線紹興 100 nr
福美來三代啟停版 100 nr
搜狗 100 nr
岳飛 100 nr
搜狐 100 nr
- 原始語料未作清洗,POS+tag
娃 nz B
哈 nz I
哈 nz I
集 n O
團 n O
} x O
} x O
在 p O
{ x O
{ x O
l eng O
o eng O
c eng O
a eng O
t eng O
i eng O
o eng O
n eng O
: x O
黔 j O
} x O
} x O
發(fā) vn O
展 vn O
- template 同上
Done!70.12 s
分詞沒有添加詞典
template同上
娃 nz B
哈 nz I
哈 nz I
集 n O
團 n O
} x O
} x O
在 p O
{ x O
{ x O
l eng O
o eng O
c eng O
a eng O
t eng O
i eng O
o eng O
n eng O
: x O
黔 j O
} x O
} x O
發(fā) vn O
展 vn O
负乡?牍白??詞性標(biāo)注和前面加載了詞典一樣
Done!88.84 s
強行修改標(biāo)簽
noSeg , 詞性POS
娃 POS B
哈 POS I
哈 POS I
集 POS I
團 POS I
} POS 0
} POS 0
在 POS 0
{ POS 0
{ POS 0
l POS 0
o POS 0
c POS 0
a POS 0
t POS 0
i POS 0
o POS 0
n POS 0
: POS 0
黔 POS B
} POS 0
} POS 0
發(fā) POS 0
展 POS 0
template同上
Done!175.85 s
noPOS+template
娃 B
哈 I
哈 I
集 I
團 I
} 0
} 0
在 0
{ 0
{ 0
l 0
o 0
c 0
a 0
t 0
i 0
o 0
n 0
: 0
黔 B
} 0
} 0
發(fā) 0
展 0
設(shè)置template
# Unigram
U00:%x[-2,0]
U01:%x[-1,0]
U02:%x[0,0]
U03:%x[1,0]
U04:%x[2,0]
U05:%x[-2,0]/%x[-1,0]/%x[0,0]
U06:%x[-1,0]/%x[0,0]/%x[1,0]
U07:%x[0,0]/%x[1,0]/%x[2,0]
U08:%x[-1,0]/%x[0,0]
U09:%x[0,0]/%x[1,0]
# Bigram
B
結(jié)果:
Done!77.47 s
總結(jié)
feature | time | precision | recall | FB1 |
---|---|---|---|---|
c_noPOS-BIO | 175.85s | 86.46% | 82.18% | 84.26 |
c_noPOS+template-BIO | 77.47s | 86.73% | 84.16% | 85.43 |
c_POS(noDic)-BIO | 88.84 | 92.08% | 92.08% | 92.08 |
c_POS+dic-BIO | 70.12s | 98.96% | 98.73% | 98.85 |
w_POS(noDic)-BMEUNs | 179.61s | 99.80% | 99.52% | 99.66 |
c_表示一字一行處理的, w表示一詞一行
疑問
添加詞典與否事實上結(jié)果一樣抖棘,上文的結(jié)果不相同是因為強行對訓(xùn)練集和測試集對的BIO標(biāo)簽進行了修改茂腥,命名實體的完全是BI狸涌。如果自動分詞,粒度較細(xì)最岗,實體標(biāo)簽不一定完全正確帕胆。
- 修改標(biāo)簽以后,92.08
n eng 0
a eng 0
m eng 0
e eng 0
: x 0
浙 nr B
江 nr I
在 nr I
線 nr I
杭 nr I
州 nr I
} x 0
} x 0
- 沒有修改標(biāo)簽般渡,98.85
n eng O
a eng O
m eng O
e eng O
: x O
浙 ns B
江 ns I
在 b O
線 b O
杭 ns B
州 ns I
} x O
} x O
- 預(yù)料中給定的NER是否是NER惶楼?
{{location:河北省邯鄲市火車站過街天橋南約100米}}的路西,十幾個男子圍成一團诊杆,氣氛很是熱烈歼捐。
{{product_name:嘻嘻MACWE書包中學(xué)生女雙肩包男女背包韓版潮學(xué)院風(fēng)旅行包帆布電腦包}}{{product_name:http://t.cn/8sSfk0S}}
嘻嘻{{company_name:MACWE}}書包中學(xué)生女雙肩包男女背包{{location:韓}}版潮學(xué)院風(fēng)旅行包帆布電腦包{{product_name:http://t.cn/8sSfk0S}}