用CRF做命名实体识别——NER系列(三)
在上一篇文章《用隱馬爾可夫模型(HMM)做命名實(shí)體識(shí)別——NER系列(二)》中,我們使用HMM模型來(lái)做命名實(shí)體識(shí)別,將問(wèn)題轉(zhuǎn)化為統(tǒng)計(jì)概率問(wèn)題,進(jìn)行求解。顯然,它的效果是非常有限的。
在深度學(xué)習(xí)技術(shù)火起來(lái)之前,主流的、最有效的方法,就是CRF(條件隨機(jī)場(chǎng))模型。本文不對(duì)CRF模型進(jìn)行展開(kāi)講解,而是結(jié)合我之前參加的CCF BDCI的其中一個(gè)賽題,直接用CRF++工具進(jìn)行實(shí)戰(zhàn)。下面直接進(jìn)入正題。
1.賽題解讀
賽題介紹:https://www.datafountain.cn/competitions/269/details/rule
總結(jié)一下,這個(gè)題目要求我們對(duì)數(shù)據(jù)集中的每條記錄,提取出正文中的主要機(jī)構(gòu)實(shí)體,判斷這些機(jī)構(gòu)的風(fēng)險(xiǎn)等級(jí)(中性,正向或負(fù)向),并為每個(gè)實(shí)體生成相應(yīng)的摘要和關(guān)鍵詞。
我接下來(lái)主要講提取實(shí)體這一部分,用的是CRF模型,訓(xùn)練直接使用CRF++工具(http://taku910.github.io/crfpp/)(似乎被墻了?)。
2.算法流程圖
3.算法說(shuō)明
3.1 定義實(shí)體標(biāo)注集
為了確保最后的機(jī)構(gòu)實(shí)體識(shí)別準(zhǔn)確度,使用BMEWO標(biāo)注集,各個(gè)標(biāo)注的意義如下:
B:實(shí)體的開(kāi)頭
M:實(shí)體的中間部分
E:實(shí)體的結(jié)束
W:單獨(dú)成實(shí)體
O:句子的其它成分
比如下面這個(gè)句子(已做分詞處理):
山西????? 相立????? 山泉????? 飲品????? 開(kāi)發(fā)????? 有限公司???? 生產(chǎn)????? 的桶裝? 飲用水? 檢出????? 銅綠????? 假?? 單胞菌
背后的標(biāo)注為:
山西/B? 相立/M 山泉/M 飲品/M 開(kāi)發(fā)/M 有限公司/E? 生產(chǎn)/O? 的/O 桶裝/O???? 飲用水/O???? 檢出/O? 銅綠/O?? 假/O 單胞菌/O
3.2訓(xùn)練文本、測(cè)試文本預(yù)處理
對(duì)訓(xùn)練文本進(jìn)行中文分詞、去除停用詞的處理,并根據(jù)上述的標(biāo)注集進(jìn)行標(biāo)注。同時(shí),除了詞本身,還引入了4個(gè)特征:
特征①:【詞性】,用jieba分詞識(shí)別出來(lái)的詞性
特征②:【是否是特征詞】,該詞是特征詞,標(biāo)記1;不是特征詞,標(biāo)記0。這里的特征詞是指“實(shí)體通常的結(jié)尾詞”,比如“有限公司”,“藥監(jiān)局”,“超市”等等,這些特征詞來(lái)源于兩個(gè)地方:
特征③:【是否是地點(diǎn)】,該詞是地點(diǎn),標(biāo)記為isloc;該詞不是地點(diǎn),標(biāo)記為notloc。這里的地點(diǎn)信息我們是從jieba的分詞詞性標(biāo)注功能中得到的,詞性標(biāo)注為ns的一般是地點(diǎn)。
特征④:【是否是句子結(jié)束】,該詞是這個(gè)句子的結(jié)束詞,標(biāo)記為isend;否則標(biāo)記為notend。
訓(xùn)練文本在經(jīng)過(guò)預(yù)處理之后,格式如下:
寧夏????? ns?? 0???? isloc????? notend B
物美????? nz?? 0???? notloc? notend M
超市????? v???? 1???? notloc? notend M
有限公司??? n???? 1???? notloc? notend M
森林公園??? n???? 0???? notloc? notend M
店?? n???? 1???? notloc? isend??? E
其中,第一列為詞本身,第二列為特征①,第三列為特征②,第四列為特征③,第五列為特征④,第六列列為正確標(biāo)注。
測(cè)試文本的預(yù)處理和上面的基本一樣,區(qū)別在于,測(cè)試文本沒(méi)有正確的實(shí)體標(biāo)注,所以測(cè)試文本的預(yù)處理文件只有五列。最后我們要用CRF模型預(yù)測(cè)的是第六列—標(biāo)注。
3.3訓(xùn)練CRF模型
CRF模型的訓(xùn)練,需要一個(gè)特征模板,以便能夠自動(dòng)在訓(xùn)練文本中提取特征函數(shù),特征模板的定義直接決定了最后的識(shí)別效果。
針對(duì)此次的機(jī)構(gòu)實(shí)體,我們定義了幾種特征模板,最終選擇了以下模板:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | # Unigram ? U01:%x[-2,0] ? U02:%x[-1,0] ? U03:%x[0,0] ? U04:%x[1,0] ? U05:%x[2,0] ? U06:%x[-2,0]/%x[-1,0]/%x[0,0] ? U07:%x[-1,0]/%x[0,0]/%x[1,0] ? U08:%x[0,0]/%x[1,0]/%x[2,0] ? U09:%x[-1,0]/%x[0,0] ? U10:%x[0,0]/%x[1,0] ? U11:%x[-1,1]/%x[0,1]/%x[1,1] ? U12:%x[-1,1]/%x[0,1] ? U13:%x[0,1]/%x[1,1] ? U14:%x[0,1]/%x[0,2] ? U15:%x[-1,1]/%x[0,2] ? U16:%x[-2,1]/%x[-1,1]/%x[0,2] ? U17:%x[-1,1]/%x[0,2]/%x[1,1] ? U18:%x[0,2]/%x[1,1]/%x[2,1] ? U19:%x[0,0]/%x[0,2] ? U20:%x[-1,0]/%x[0,2] ? U21:%x[-2,0]/%x[-1,0]/%x[0,2] ? U22:%x[-1,0]/%x[0,2]/%x[1,0] ? U23:%x[0,2]/%x[1,0]/%x[2,0] ? # Bigram ? B |
下面解釋一下上述特征模板:
①Unigram類(lèi)型
每一行%x[#,#]生成一個(gè)CRFs中的點(diǎn)(state)函數(shù): f(s, o), 其中s為t時(shí)刻的標(biāo)簽(output),o為t時(shí)刻的上下文以及特征信息。
比如:U06:%x[-2,0]/%x[-1,0]/%x[0,0]
U06是指這個(gè)特征模板的編號(hào),對(duì)于%x[-2,0]而言,%x是指找到的字符;[-2,0]是定位信息,其中中括號(hào)里面的-2是指當(dāng)前詞的前兩個(gè)詞,0是指第0列。后面用/連接的是多個(gè)特征的組合。
對(duì)于以下的訓(xùn)練文本:
寧夏???? ns?? 0???? isloc????? notend B
物美???? nz?? 0???? notloc? notend M
超市???? v???? 1???? notloc? notend M
有限公司?? n???? 1???? notloc? notend M
森林公園?? n???? 0???? notloc? notend M
店? n???? 1???? notloc? isend??? E
假如當(dāng)前識(shí)別到第三行,則U06:%x[-2,0]/%x[-1,0]/%x[0,0]對(duì)應(yīng)識(shí)別出來(lái)的文本為寧夏/物美/超市。
這就相當(dāng)于我們?cè)谖谋局姓业降囊粭l特征。
②Bigram類(lèi)型
每一行%x[#,#]生成一個(gè)CRFs中的邊(Edge)函數(shù):f(s’, s, o), 其中s’為t – 1時(shí)刻的標(biāo)簽.也就是說(shuō),Bigram類(lèi)型與Unigram大致機(jī)同,只是還要考慮到t – 1時(shí)刻的標(biāo)簽.這里只寫(xiě)一個(gè)B,默認(rèn)生成f(s’, s).
有了特征模板以及訓(xùn)練文本文件,就可以進(jìn)行CRF模型訓(xùn)練了,我們采用了CRF++這個(gè)開(kāi)源工具包進(jìn)行訓(xùn)練,使用默認(rèn)參數(shù),最終模型識(shí)別出來(lái)的特征有11616755條。
3.4預(yù)測(cè)、生成實(shí)體
有了上述預(yù)處理測(cè)試文本和訓(xùn)練生成的CRF模型,我們可以進(jìn)行測(cè)試文本的標(biāo)簽預(yù)測(cè),生成crf_test_output.txt。
由于crf_test_output.txt里面預(yù)測(cè)的是每個(gè)詞背后的標(biāo)注,我們還要做一個(gè)后處理工作才能把真正的實(shí)體提取出來(lái)。
用正則表達(dá)式B+M*E+或者W匹配文本,然后將其背后的文字提取出來(lái),就是識(shí)別出來(lái)的機(jī)構(gòu)實(shí)體。
3.4效果和缺點(diǎn)
在使用CRF模型之后,我們得到了不錯(cuò)的效果。線下訓(xùn)練文本的實(shí)體召回率可以達(dá)到91.3%,另外,識(shí)別出來(lái)的無(wú)效實(shí)體也少了很多。
和基于規(guī)則的實(shí)體識(shí)別相比,它有著以下優(yōu)點(diǎn):
- 通過(guò)特征模板,能夠最大限度的挖掘文本的特征,而不需要人工提取。
- 能夠考慮大量的上下文信息、特征。
- 考慮了相鄰詞的標(biāo)注信息,這是傳統(tǒng)的最大熵算法所不具備的。
- 和神經(jīng)網(wǎng)絡(luò)模型相比,CRF模型的可解釋性強(qiáng),具體到每一個(gè)特征都有可以解釋的意義。因此調(diào)整起來(lái)比較容易。
當(dāng)然,這個(gè)模型也不是完美的,比如,我們訓(xùn)練的這個(gè)模型就比較“看重”機(jī)構(gòu)特征詞。舉個(gè)例子,如果“下屬公司”單獨(dú)出現(xiàn),則它也可能會(huì)被識(shí)別為機(jī)構(gòu)名,需要我們?nèi)斯ざx一些規(guī)則將其去除。
CRF++工具的使用就沒(méi)有介紹了,訓(xùn)練的過(guò)程只需要預(yù)處理語(yǔ)料以及模板文件,預(yù)處理語(yǔ)料格式和模板文件,在上文已經(jīng)體現(xiàn)出來(lái)了,感興趣的朋友,缺少語(yǔ)料或者工具,可以找我要。
代碼和語(yǔ)料:
https://www.lookfor404.com/命名實(shí)體識(shí)別的語(yǔ)料和代碼/
?
https://www.lookfor404.com/%e7%94%a8crf%e5%81%9a%e5%91%bd%e5%90%8d%e5%ae%9e%e4%bd%93%e8%af%86%e5%88%ab-ner%e7%b3%bb%e5%88%97%ef%bc%88%e4%b8%89%ef%bc%89/
總結(jié)
以上是生活随笔為你收集整理的用CRF做命名实体识别——NER系列(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PHP服务Fcgi进程及PHP解析优化
- 下一篇: 【译】深入理解LSTM网络