CRF++ for NER

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

  • linux: https://flystarhe.github.io/2016/07/13/crfpp/

  • 注意:

  • 務(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
處理步驟:

  1. 原始語料處理
    一句一行
    *可選:去除{{time:}}等標(biāo)記
  2. 打標(biāo)簽 BMEUNS
  3. 切分訓(xùn)練集和測試集
  4. 調(diào)整crf++的template
  5. 訓(xùn)練,調(diào)參
  6. 測試
  7. 評估

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

image.png

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

image.png

分詞沒有添加詞典

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

image.png

強行修改標(biāo)簽


image.png

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


image.png

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


image.png

總結(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}}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晨汹,隨后出現(xiàn)的幾起案子豹储,更是在濱河造成了極大的恐慌,老刑警劉巖淘这,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剥扣,死亡現(xiàn)場離奇詭異,居然都是意外死亡铝穷,警方通過查閱死者的電腦和手機钠怯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曙聂,“玉大人晦炊,你說我怎么就攤上這事∧梗” “怎么了断国?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長榆苞。 經(jīng)常有香客問我稳衬,道長,這世上最難降的妖魔是什么坐漏? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任薄疚,我火速辦了婚禮,結(jié)果婚禮上赊琳,老公的妹妹穿的比我還像新娘街夭。我一直安慰自己,他們只是感情好慨畸,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布莱坎。 她就那樣靜靜地躺著,像睡著了一般寸士。 火紅的嫁衣襯著肌膚如雪檐什。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天弱卡,我揣著相機與錄音乃正,去河邊找鬼。 笑死婶博,一個胖子當(dāng)著我的面吹牛瓮具,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凡人,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼名党,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挠轴?” 一聲冷哼從身側(cè)響起传睹,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岸晦,沒想到半個月后欧啤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡启上,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年邢隧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冈在。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡倒慧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出包券,到底是詐尸還是另有隱情迫靖,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布兴使,位于F島的核電站系宜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏发魄。R本人自食惡果不足惜盹牧,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望励幼。 院中可真熱鬧汰寓,春花似錦、人聲如沸苹粟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嵌削。三九已至毛好,卻和暖如春望艺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肌访。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工找默, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吼驶。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓惩激,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蟹演。 傳聞我的和親對象是個殘疾皇子风钻,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容