BiLSTM+CNN+CRF 實(shí)現(xiàn)命名體識別

轉(zhuǎn)載自http://www.cnblogs.com/Determined22/

小白一枚,簡單介紹一下模型和實(shí)驗(yàn)結(jié)果,BiLSTM-CRF 模型的數(shù)據(jù)和代碼在GitHub上。

命名實(shí)體識別(Named Entity Recognition)

? ? ? 命名實(shí)體識別(Named Entity Recognition, NER)是 NLP 里的一項(xiàng)很基礎(chǔ)的任務(wù),就是指從文本中識別出命名性指稱項(xiàng),為關(guān)系抽取等任務(wù)做鋪墊。狹義上,是識別出人名、地名和組織機(jī)構(gòu)名這三類命名實(shí)體(時(shí)間、貨幣名稱等構(gòu)成規(guī)律明顯的實(shí)體類型可以用正則等方式識別)。當(dāng)然,在特定領(lǐng)域中,會相應(yīng)地定義領(lǐng)域內(nèi)的各種實(shí)體類型。

? ? ??漢語作為象形文字,相比于英文等拼音文字來說,針對中文的NER任務(wù)來說往往要更有挑戰(zhàn)性,下面列舉幾點(diǎn):

? ? ? (1) 中文文本里不像英文那樣有空格作為詞語的界限標(biāo)志,而且“詞”在中文里本來就是一個(gè)很模糊的概念,中文也不具備英文中的字母大小寫等形態(tài)指示

?(2) 中文的用字靈活多變,有些詞語在脫離上下文語境的情況下無法判斷是否是命名實(shí)體,而且就算是命名實(shí)體,當(dāng)其處在不同的上下文語境下也可能是不同的實(shí)體類型

? ? ? (3)?命名實(shí)體存在嵌套現(xiàn)象,如“北京大學(xué)第三醫(yī)院”這一組織機(jī)構(gòu)名中還嵌套著同樣可以作為組織機(jī)構(gòu)名的“北京大學(xué)”,而且這種現(xiàn)象在組織機(jī)構(gòu)名中尤其嚴(yán)重

? ? ? (4)?中文里廣泛存在簡化表達(dá)現(xiàn)象,如“北醫(yī)三院”、“國科大”,乃至簡化表達(dá)構(gòu)成的命名實(shí)體,如“國科大橋”。

? ? ? 專著 [1] 里比較詳細(xì)地介紹了 NER 的各種方法(由于出版年限較早,未涵蓋神經(jīng)網(wǎng)絡(luò)方法),這里籠統(tǒng)地摘取三類方法:

?1. 基于規(guī)則的方法:利用手工編寫的規(guī)則,將文本與規(guī)則進(jìn)行匹配來識別出命名實(shí)體。例如,對于中文來說,“說”、“老師”等詞語可作為人名的下文,“大學(xué)”、“醫(yī)院”等詞語可作為組織機(jī)構(gòu)名的結(jié)尾,還可以利用到詞性、句法信息。在構(gòu)建規(guī)則的過程中往往需要大量的語言學(xué)知識,不同語言的識別規(guī)則不盡相同,而且需要謹(jǐn)慎處理規(guī)則之間的沖突問題;此外,構(gòu)建規(guī)則的過程費(fèi)時(shí)費(fèi)力、可移植性不好。

?2. 基于特征模板的方法

? ? ? 統(tǒng)計(jì)機(jī)器學(xué)習(xí)方法將 NER 視作序列標(biāo)注任務(wù),利用大規(guī)模語料來學(xué)習(xí)出標(biāo)注模型,從而對句子的各個(gè)位置進(jìn)行標(biāo)注。常用的應(yīng)用到 NER 任務(wù)中的模型包括生成式模型HMM、判別式模型CRF等。比較流行的方法是特征模板 + CRF的方案:特征模板通常是人工定義的一些二值特征函數(shù),試圖挖掘命名實(shí)體內(nèi)部以及上下文的構(gòu)成特點(diǎn)。對于句子中的給定位置來說,提特征的位置是一個(gè)窗口,即上下文位置。而且,不同的特征模板之間可以進(jìn)行組合來形成一個(gè)新的特征模板。CRF的優(yōu)點(diǎn)在于其為一個(gè)位置進(jìn)行標(biāo)注的過程中可以利用到此前已經(jīng)標(biāo)注的信息,利用Viterbi解碼來得到最優(yōu)序列。對句子中的各個(gè)位置提取特征時(shí),滿足條件的特征取值為1,不滿足條件的特征取值為0;然后把特征喂給CRF,training階段建模標(biāo)簽的轉(zhuǎn)移,進(jìn)而在inference階段為測試句子的各個(gè)位置做標(biāo)注。關(guān)于這種方法可以參閱文獻(xiàn) [2] 和 [3]。

?3. 基于神經(jīng)網(wǎng)絡(luò)的方法

? ? ??近年來,隨著硬件能力的發(fā)展以及詞的分布式表示(word embedding)的出現(xiàn),神經(jīng)網(wǎng)絡(luò)成為可以有效處理許多NLP任務(wù)的模型。這類方法對于序列標(biāo)注任務(wù)(如CWS、POS、NER)的處理方式是類似的,將token從離散one-hot表示映射到低維空間中成為稠密的embedding,隨后將句子的embedding序列輸入到RNN中,用神經(jīng)網(wǎng)絡(luò)自動(dòng)提取特征,Softmax來預(yù)測每個(gè)token的標(biāo)簽。這種方法使得模型的訓(xùn)練成為一個(gè)端到端的整體過程,而非傳統(tǒng)的pipeline,不依賴特征工程,是一種數(shù)據(jù)驅(qū)動(dòng)的方法;但網(wǎng)絡(luò)變種多、對參數(shù)設(shè)置依賴大,模型可解釋性差。此外,這種方法的一個(gè)缺點(diǎn)是對每個(gè)token打標(biāo)簽的過程中是獨(dú)立的分類,不能直接利用上文已經(jīng)預(yù)測的標(biāo)簽(只能靠隱狀態(tài)傳遞上文信息),進(jìn)而導(dǎo)致預(yù)測出的標(biāo)簽序列可能是非法的,例如標(biāo)簽B-PER后面是不可能緊跟著I-LOC的,但Softmax不會利用到這個(gè)信息。

? ? ? 學(xué)界提出了 LSTM-CRF 模型做序列標(biāo)注。文獻(xiàn)[4][5]在LSTM層后接入CRF層來做句子級別的標(biāo)簽預(yù)測,使得標(biāo)注過程不再是對各個(gè)token獨(dú)立分類。引入CRF這個(gè)idea最早其實(shí)可以追溯到文獻(xiàn)[6]中。文獻(xiàn)[5]還提出在英文NER任務(wù)中先使用LSTM來為每個(gè)單詞由字母構(gòu)造詞并拼接到詞向量后再輸入到LSTM中,以捕捉單詞的前后綴等字母形態(tài)特征。文獻(xiàn)[8]將這個(gè)套路用在了中文NER任務(wù)中,用偏旁部首來構(gòu)造漢字。關(guān)于神經(jīng)網(wǎng)絡(luò)方法做NER,可以看博客[9] ,介紹的非常詳細(xì)~

基于字的BiLSTM-CRF模型

? ? ? 這段講得比較啰嗦,大概看看就好。?

使用基于字的BiLSTM-CRF,主要參考的是文獻(xiàn)[4][5]。使用Bakeoff-3評測中所采用的的BIO標(biāo)注集,即B-PER、I-PER代表人名首字、人名非首字,B-LOC、I-LOC代表地名首字、地名非首字,B-ORG、I-ORG代表組織機(jī)構(gòu)名首字、組織機(jī)構(gòu)名非首字,O代表該字不屬于命名實(shí)體的一部分。如:

這里當(dāng)然也可以采用更復(fù)雜的BIOSE標(biāo)注集。

? ? ??以句子為單位,將一個(gè)含有?nn?個(gè)字的句子(字的序列)記作

x=(x1,x2,...,xn)x=(x1,x2,...,xn)

其中?xixi?表示句子的第?ii?個(gè)字在字典中的id,進(jìn)而可以得到每個(gè)字的one-hot向量,維數(shù)是字典大小。

模型的第一層是 look-up 層,利用預(yù)訓(xùn)練或隨機(jī)初始化的embedding矩陣將句子中的每個(gè)字?xixi?由one-hot向量映射為低維稠密的字向量(character embedding)xi∈Rdxi∈Rd?,dd?是embedding的維度。在輸入下一層之前,設(shè)置dropout以緩解過擬合。

模型的第二層是雙向LSTM層,自動(dòng)提取句子特征。將一個(gè)句子的各個(gè)字的char embedding序列?(x1,x2,...,xn)(x1,x2,...,xn)?作為雙向LSTM各個(gè)時(shí)間步的輸入,再將正向LSTM輸出的隱狀態(tài)序列?(h1?,h2?,...,hn?)(h1?,h2?,...,hn?)?與反向LSTM的?(h1?,h2?,...,hn?)(h1?,h2?,...,hn?)?在各個(gè)位置輸出的隱狀態(tài)進(jìn)行按位置拼接?ht=[ht?;ht?]∈Rmht=[ht?;ht?]∈Rm?,得到完整的隱狀態(tài)序列

(h1,h2,...,hn)∈Rn×m(h1,h2,...,hn)∈Rn×m

在設(shè)置dropout后,接入一個(gè)線性層,將隱狀態(tài)向量從?mm?維映射到?kk?維,kk?是標(biāo)注集的標(biāo)簽數(shù),從而得到自動(dòng)提取的句子特征,記作矩陣?P=(p1,p2,...,pn)∈Rn×kP=(p1,p2,...,pn)∈Rn×k???梢园?pi∈Rkpi∈Rk的每一維?pijpij?都視作將字?xixi?分類到第?jj?個(gè)標(biāo)簽的打分值,如果再對?PP?進(jìn)行Softmax的話,就相當(dāng)于對各個(gè)位置獨(dú)立進(jìn)行?kk?類分類。但是這樣對各個(gè)位置進(jìn)行標(biāo)注時(shí)無法利用已經(jīng)標(biāo)注過的信息,所以接下來將接入一個(gè)CRF層來進(jìn)行標(biāo)注。

模型的第三層是CRF層,進(jìn)行句子級的序列標(biāo)注。CRF層的參數(shù)是一個(gè)?(k+2)×(k+2)(k+2)×(k+2)的矩陣?AA?,AijAij?表示的是從第?ii?個(gè)標(biāo)簽到第?jj?個(gè)標(biāo)簽的轉(zhuǎn)移得分,進(jìn)而在為一個(gè)位置進(jìn)行標(biāo)注的時(shí)候可以利用此前已經(jīng)標(biāo)注過的標(biāo)簽,之所以要加2是因?yàn)橐獮榫渥邮撞刻砑右粋€(gè)起始狀態(tài)以及為句子尾部添加一個(gè)終止?fàn)顟B(tài)。如果記一個(gè)長度等于句子長度的標(biāo)簽序列?y=(y1,y2,...,yn)y=(y1,y2,...,yn)?,那么模型對于句子?xx?的標(biāo)簽等于?yy?的打分為

score(x,y)=∑i=1nPi,yi+∑i=1n+1Ayi?1,yiscore(x,y)=∑i=1nPi,yi+∑i=1n+1Ayi?1,yi

可以看出整個(gè)序列的打分等于各個(gè)位置的打分之和,而每個(gè)位置的打分由兩部分得到,一部分是由LSTM輸出的?pipi?決定,另一部分則由CRF的轉(zhuǎn)移矩陣?AA?決定。進(jìn)而可以利用Softmax得到歸一化后的概率:

P(y|x)=exp(score(x,y))∑y′exp(score(x,y′))P(y|x)=exp?(score(x,y))∑y′exp?(score(x,y′))

模型訓(xùn)練時(shí)通過最大化對數(shù)似然函數(shù),下式給出了對一個(gè)訓(xùn)練樣本?(x,yx)(x,yx)?的對數(shù)似然:

logP(yx|x)=score(x,yx)?log(∑y′exp(score(x,y′)))log?P(yx|x)=score(x,yx)?log?(∑y′exp?(score(x,y′)))

如果這個(gè)算法要自己實(shí)現(xiàn)的話,需要注意的是指數(shù)的和的對數(shù)要轉(zhuǎn)換成?log∑iexp(xi)=a+log∑iexp(xi?a)log?∑iexp?(xi)=a+log?∑iexp?(xi?a)(TensorFlow有現(xiàn)成的CRF,PyTorch就要自己寫了),在CRF中上式的第二項(xiàng)使用前向后向算法來高效計(jì)算。

? ? ? 模型在預(yù)測過程(解碼)時(shí)使用動(dòng)態(tài)規(guī)劃的Viterbi算法來求解最優(yōu)路徑:

y?=argmaxy′score(x,y′)y?=arg?maxy′score(x,y′)

? ? ? 整個(gè)模型的結(jié)構(gòu)如下圖所示:

實(shí)驗(yàn)結(jié)果

? ? ? 關(guān)于CRF模型的特征模板就不細(xì)講了,是參考 [3] 來做的。提好特征之后用CRF++工具包即可,這部分是小伙伴做的~

? ? ? 實(shí)驗(yàn)結(jié)果如下表:

? ? ? 下面開始一本正經(jīng)地胡說八道: ? ? ?

? ? ? 1. 總的來說,經(jīng)過仔細(xì)選擇特征模板的CRF模型在人名上的識別效果要優(yōu)于BiLSTM-CRF,但后者在地名、組織機(jī)構(gòu)名上展現(xiàn)了更好的性能。究其原因,可能是因?yàn)椋?/p>

? ? ? (1) 人名用字較靈活且長度比較短,用特征模板在窗口內(nèi)所提取的特征要比神經(jīng)網(wǎng)絡(luò)自動(dòng)學(xué)習(xí)的特征更有效、干擾更少

? ? ? (2) 地名、組織機(jī)構(gòu)名的構(gòu)成復(fù)雜、長度較長,使用雙向LSTM能夠更好地利用句子級的語義特征,而特征模板只能在窗口內(nèi)進(jìn)行提取,無法利用整句話的語義。

? ? ? 2. 對于CRF模型來說,使用 {字符,詞性,詞邊界,實(shí)體列表} 這一組合模板的效果在CRF模型系列中表現(xiàn)最好(各個(gè)單一模板以及其他組合模板的結(jié)果未列出)。

? ? ? 3. 對于BiLSTM-CRF模型來說,這里在每一層的處理都是比較簡單的,還有可以提高的空間。例如字向量embedding的初始化方式,這里只是用了最簡單的隨機(jī)初始化,然而由于語料規(guī)模比較小,所以不太合適。可以考慮對句子做分詞,然后將字向量初始化為該字所在詞的詞向量(可以用在別的大型語料上的預(yù)訓(xùn)練值)。此外,還可以嘗試文獻(xiàn)[5][7][8]的思路,將low-level的特征經(jīng)過一個(gè)RNN或CNN,進(jìn)而通過“組合”的方式來得到字級別的embedding(英文是用字母構(gòu)造單詞,中文是用偏旁部首構(gòu)造漢字),將其與隨機(jī)初始化的字向量拼接在一起。

? ? ? 另外要提的一點(diǎn)是BiLSTM-CRF在這應(yīng)該是過擬合了,迭代輪數(shù)(120輪)給大了,測試集指標(biāo)在大約60輪之后已經(jīng)開始下降。應(yīng)該劃個(gè)驗(yàn)證集做early stopping。

BiLSTM-CRF模型的代碼在GitHub上,README.md里介紹了如何訓(xùn)練、測試。我是用筆記本的顯卡訓(xùn)練的,batch_size 取64,Adam優(yōu)化器訓(xùn)練120個(gè)epoch,大概用了4個(gè)多小時(shí)。如果機(jī)器條件允許,不妨試試?batch_size 直接取1,優(yōu)化器用 SGD+Momentum 。





參考:

[1] 《統(tǒng)計(jì)自然語言處理》

[2] 向曉雯. 基于條件隨機(jī)場的中文命名實(shí)體識別[D]. , 2006.

[3] 張祝玉, 任飛亮, 朱靖波. 基于條件隨機(jī)場的中文命名實(shí)體識別特征比較研究[C]//第 4 屆全國信息檢索與內(nèi)容安全學(xué)術(shù)會議論文集. 2008.

[4] Huang Z, Xu W, Yu K. Bidirectional LSTM-CRF models for sequence tagging[J]. arXiv preprint arXiv:1508.01991, 2015.

[5] Lample G, Ballesteros M, Subramanian S, et al. Neural Architectures for Named Entity Recognition[C]//Proceedings of NAACL-HLT. 2016: 260-270.

[6] Collobert R, Weston J, Bottou L, et al. Natural language processing (almost) from scratch[J]. Journal of Machine Learning Research, 2011, 12(Aug): 2493-2537.

[7] Ma X, Hovy E. End-to-end sequence labeling via bi-directional lstm-cnns-crf[J]. arXiv preprint arXiv:1603.01354, 2016.

[8] Dong C, Zhang J, Zong C, et al. Character-Based LSTM-CRF with Radical-Level Features for Chinese Named Entity Recognition[C]//International Conference on Computer Processing of Oriental Languages. Springer International Publishing, 2016: 239-250.

[9]?http://www.cnblogs.com/robert-dlut/p/6847401.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容