1. 程式人生 > >BiLSTM-CRF模型做基於字的中文命名實體識別

BiLSTM-CRF模型做基於字的中文命名實體識別

      在MSRA的簡體中文NER語料(我是從這裡下載的,非官方出品,可能不是SIGHAN 2006 Bakeoff-3評測所使用的原版語料)上訓練NER模型,識別人名、地名和組織機構名。嘗試了兩種模型:一種是手工定義特徵模板後再用CRF++開源包訓練CRF模型;另一種是最近兩年學術界比較流行的 BiLSTM-CRF 模型。

      小白一枚,簡單介紹一下模型和實驗結果,BiLSTM-CRF 模型的資料和程式碼在GitHub上。

命名實體識別(Named Entity Recognition)

      命名實體識別(Named Entity Recognition, NER)是 NLP 裡的一項很基礎的任務,就是指從文字中識別出命名性指稱項,為關係抽取等任務做鋪墊。狹義上,是識別出人名、地名和組織機構名這三類命名實體(時間、貨幣名稱等構成規律明顯的實體型別可以用正則等方式識別)。當然,在特定領域中,會相應地定義領域內的各種實體型別。

      漢語作為象形文字,相比於英文等拼音文字來說,針對中文的NER任務來說往往要更有挑戰性,下面列舉幾點:

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

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

      (3) 命名實體存在巢狀現象,如“北京大學第三醫院”這一組織機構名中還巢狀著同樣可以作為組織機構名的“北京大學”,而且這種現象在組織機構名中尤其嚴重

      (4) 中文裡廣泛存在簡化表達現象,如“北醫三院”、“國科大”,乃至簡化表達構成的命名實體,如“國科大橋”。

      專著 [1] 裡比較詳細地介紹了 NER 的各種方法(由於出版年限較早,未涵蓋神經網路方法),這裡籠統地摘取三類方法:

      1. 基於規則的方法:利用手工編寫的規則,將文字與規則進行匹配來識別出命名實體。例如,對於中文來說,“說”、“老師”等詞語可作為人名的下文,“大學”、“醫院”等詞語可作為組織機構名的結尾,還可以利用到詞性、句法資訊。在構建規則的過程中往往需要大量的語言學知識,不同語言的識別規則不盡相同,而且需要謹慎處理規則之間的衝突問題;此外,構建規則的過程費時費力、可移植性不好。

      2. 基於特徵模板的方法: 

      統計機器學習方法將 NER 視作序列標註任務,利用大規模語料來學習出標註模型,從而對句子的各個位置進行標註。常用的應用到 NER 任務中的模型包括生成式模型HMM、判別式模型CRF等。比較流行的方法是特徵模板 + CRF的方案:特徵模板通常是人工定義的一些二值特徵函式,試圖挖掘命名實體內部以及上下文的構成特點。對於句子中的給定位置來說,提特徵的位置是一個視窗,即上下文位置。而且,不同的特徵模板之間可以進行組合來形成一個新的特徵模板。CRF的優點在於其為一個位置進行標註的過程中可以利用到此前已經標註的資訊,利用Viterbi解碼來得到最優序列。對句子中的各個位置提取特徵時,滿足條件的特徵取值為1,不滿足條件的特徵取值為0;然後把特徵餵給CRF,training階段建模標籤的轉移,進而在inference階段為測試句子的各個位置做標註。關於這種方法可以參閱文獻 [2] 和 [3]。

      3. 基於神經網路的方法

      近年來,隨著硬體能力的發展以及詞的分散式表示(word embedding)的出現,神經網路成為可以有效處理許多NLP任務的模型。這類方法對於序列標註任務(如CWS、POS、NER)的處理方式是類似的,將token從離散one-hot表示對映到低維空間中成為稠密的embedding,隨後將句子的embedding序列輸入到RNN中,用神經網路自動提取特徵,Softmax來預測每個token的標籤。這種方法使得模型的訓練成為一個端到端的整體過程,而非傳統的pipeline,不依賴特徵工程,是一種資料驅動的方法;但網路變種多、對引數設定依賴大,模型可解釋性差。此外,這種方法的一個缺點是對每個token打標籤的過程中是獨立的分類,不能直接利用上文已經預測的標籤(只能靠隱狀態傳遞上文資訊),進而導致預測出的標籤序列可能是非法的,例如標籤B-PER後面是不可能緊跟著I-LOC的,但Softmax不會利用到這個資訊。

      學界提出了 LSTM-CRF 模型做序列標註。文獻[4][5]在LSTM層後接入CRF層來做句子級別的標籤預測,使得標註過程不再是對各個token獨立分類。引入CRF這個idea最早其實可以追溯到文獻[6]中。文獻[5]還提出在英文NER任務中先使用LSTM來為每個單詞由字母構造詞並拼接到詞向量後再輸入到LSTM中,以捕捉單詞的前後綴等字母形態特徵。文獻[8]將這個套路用在了中文NER任務中,用偏旁部首來構造漢字。關於神經網路方法做NER,可以看部落格[9] ,介紹的非常詳細~

基於字的BiLSTM-CRF模型

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

      使用基於字的BiLSTM-CRF,主要參考的是文獻[4][5]。使用Bakeoff-3評測中所採用的的BIO標註集,即B-PER、I-PER代表人名首字、人名非首字,B-LOC、I-LOC代表地名首字、地名非首字,B-ORG、I-ORG代表組織機構名首字、組織機構名非首字,O代表該字不屬於命名實體的一部分。如:

      

這裡當然也可以採用更復雜的BIOSE標註集。

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

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

其中 xixi 表示句子的第 ii 個字在字典中的id,進而可以得到每個字的one-hot向量,維數是字典大小。

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

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

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

在設定dropout後,接入一個線性層,將隱狀態向量從 mm 維對映到 kk 維,kk 是標註集的標籤數,從而得到自動提取的句子特徵,記作矩陣 P=(p1,p2,...,pn)∈Rn×kP=(p1,p2,...,pn)∈Rn×k 。可以把 pi∈Rkpi∈Rk的每一維 pijpij 都視作將字 xixi 分類到第 jj 個標籤的打分值,如果再對 PP 進行Softmax的話,就相當於對各個位置獨立進行 kk 類分類。但是這樣對各個位置進行標註時無法利用已經標註過的資訊,所以接下來將接入一個CRF層來進行標註。

      模型的第三層是CRF層,進行句子級的序列標註。CRF層的引數是一個 (k+2)×(k+2)(k+2)×(k+2)的矩陣 AA ,AijAij 表示的是從第 ii 個標籤到第 jj 個標籤的轉移得分,進而在為一個位置進行標註的時候可以利用此前已經標註過的標籤,之所以要加2是因為要為句子首部新增一個起始狀態以及為句子尾部新增一個終止狀態。如果記一個長度等於句子長度的標籤序列 y=(y1,y2,...,yn)y=(y1,y2,...,yn) ,那麼模型對於句子 xx 的標籤等於 yy 的打分為

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

可以看出整個序列的打分等於各個位置的打分之和,而每個位置的打分由兩部分得到,一部分是由LSTM輸出的 pipi 決定,另一部分則由CRF的轉移矩陣 AA 決定。進而可以利用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,yx)(x,yx) 的對數似然:

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′)))

如果這個演算法要自己實現的話,需要注意的是指數的和的對數要轉換成 log∑iexp(xi)=a+log∑iexp(xi−a)log⁡∑iexp⁡(xi)=a+log⁡∑iexp⁡(xi−a)(TensorFlow有現成的CRF,PyTorch就要自己寫了),在CRF中上式的第二項使用前向後向演算法來高效計算。

      模型在預測過程(解碼)時使用動態規劃的Viterbi演算法來求解最優路徑:

                                                          y∗=argmaxy′score(x,y′)

整個模型的結構如下圖所示:

實驗結果

      關於CRF模型的特徵模板就不細講了,是參考 [3] 來做的。提好特徵之後用CRF++工具包即可,這部分是小夥伴做的~

      實驗結果如下表:

下面開始一本正經地胡說八道:      

      1. 總的來說,經過仔細選擇特徵模板的CRF模型在人名上的識別效果要優於BiLSTM-CRF,但後者在地名、組織機構名上展現了更好的效能。究其原因,可能是因為:       (1) 人名用字較靈活且長度比較短,用特徵模板在視窗內所提取的特徵要比神經網路自動學習的特徵更有效、干擾更少       (2) 地名、組織機構名的構成複雜、長度較長,使用雙向LSTM能夠更好地利用句子級的語義特徵,而特徵模板只能在視窗內進行提取,無法利用整句話的語義。

      2. 對於CRF模型來說,使用 {字元,詞性,詞邊界,實體列表} 這一組合模板的效果在CRF模型系列中表現最好(各個單一模板以及其他組合模板的結果未列出)。

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

      另外要提的一點是BiLSTM-CRF在這應該是過擬合了,迭代輪數(120輪)給大了,測試集指標在大約60輪之後已經開始下降。應該劃個驗證集做early stopping。

      BiLSTM-CRF模型的程式碼在GitHub上,README.md裡介紹瞭如何訓練、測試。我是用筆記本的顯示卡訓練的,batch_size 取64,Adam優化器訓練120個epoch,大概用了4個多小時。如果機器條件允許,不妨試試 batch_size 直接取1,優化器用 SGD+Momentum 。

參考:

[1] 《統計自然語言處理》

[2] 向曉雯. 基於條件隨機場的中文命名實體識別[D]. , 2006.

[3] 張祝玉, 任飛亮, 朱靖波. 基於條件隨機場的中文命名實體識別特徵比較研究[C]//第 4 屆全國資訊檢索與內容安全學術會議論文集. 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

對於原創博文:如需轉載請註明出處http://www.cnblogs.com/Determined22/