DL4NLP —— 序列標註:BiLSTM-CRF模型作基於字的中文命名實體識別

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

      小白一枚,簡單介紹一下模型和實驗結果,BiLSTM-CRF 模型的數據和代碼在GitHub上。git

命名實體識別(Named Entity Recognition)github

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

      漢語做爲象形文字,相比於英文等拼音文字來講,針對中文的NER任務來講每每要更有挑戰性,下面列舉幾點:安全

      (1) 中文文本里不像英文那樣有空格做爲詞語的界限標誌,並且「詞」在中文裏原本就是一個很模糊的概念,中文也不具有英文中的字母大小寫等形態指示網絡

      (2) 中文的用字靈活多變,有些詞語在脫離上下文語境的狀況下沒法判斷是不是命名實體,並且就算是命名實體,當其處在不一樣的上下文語境下也多是不一樣的實體類型機器學習

      (3) 命名實體存在嵌套現象,如「北京大學第三醫院」這一組織機構名中還嵌套着一樣能夠做爲組織機構名的「北京大學」,並且這種現象在組織機構名中尤爲嚴重分佈式

      (4) 中文裏普遍存在簡化表達現象,如「北醫三院」、「國科大」,乃至簡化表達構成的命名實體,如「國科大橋」。ide

      專著 [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標註集。

      以句子爲單位,將一個含有 $n$ 個字的句子(字的序列)記做

$$x=(x_{1},x_{2},...,x_{n})$$

其中 $x_{i}$ 表示句子的第 $i$ 個字在字典中的id,進而能夠獲得每一個字的one-hot向量,維數是字典大小。

      模型的第一層是 look-up 層,利用預訓練或隨機初始化的embedding矩陣將句子中的每一個字 $x_{i}$ 由one-hot向量映射爲低維稠密的字向量(character embedding)$\boldsymbol x_{i}\in\mathbb R^{d}$ ,$d$ 是embedding的維度。在輸入下一層以前,設置dropout以緩解過擬合。

      模型的第二層是雙向LSTM層,自動提取句子特徵。將一個句子的各個字的char embedding序列 $(\boldsymbol x_{1},\boldsymbol x_{2},...,\boldsymbol x_{n})$ 做爲雙向LSTM各個時間步的輸入,再將正向LSTM輸出的隱狀態序列 $(\overset{\longrightarrow}{\boldsymbol h_1},\overset{\longrightarrow}{\boldsymbol h_2},...,\overset{\longrightarrow}{\boldsymbol h_n})$ 與反向LSTM的 $(\overset{\longleftarrow}{\boldsymbol h_1},\overset{\longleftarrow}{\boldsymbol h_2},...,\overset{\longleftarrow}{\boldsymbol h_n})$ 在各個位置輸出的隱狀態進行按位置拼接 $\boldsymbol h_{t}=[\overset{\longrightarrow}{\boldsymbol h_t};\overset{\longleftarrow}{\boldsymbol h_t}]\in\mathbb R^{m}$ ,獲得完整的隱狀態序列

$$({\boldsymbol h_1},{\boldsymbol h_2},...,{\boldsymbol h_n})\in\mathbb R^{n\times m}$$

在設置dropout後,接入一個線性層,將隱狀態向量從 $m$ 維映射到 $k$ 維,$k$ 是標註集的標籤數,從而獲得自動提取的句子特徵,記做矩陣 $P=({\boldsymbol p_1},{\boldsymbol p_2},...,{\boldsymbol p_n})\in\mathbb R^{n\times k}$ 。能夠把 $\boldsymbol p_i\in\mathbb R^{k}$ 的每一維 $p_{ij}$ 都視做將字 $x_{i}$ 分類到第 $j$ 個標籤的打分值,若是再對 $P$ 進行Softmax的話,就至關於對各個位置獨立進行 $k$ 類分類。可是這樣對各個位置進行標註時沒法利用已經標註過的信息,因此接下來將接入一個CRF層來進行標註。

      模型的第三層是CRF層,進行句子級的序列標註。CRF層的參數是一個 $(k+2)\times (k+2)$ 的矩陣 $A$ ,$A_{ij}$ 表示的是從第 $i$ 個標籤到第 $j$ 個標籤的轉移得分,進而在爲一個位置進行標註的時候能夠利用此前已經標註過的標籤,之因此要加2是由於要爲句子首部添加一個起始狀態以及爲句子尾部添加一個終止狀態。若是記一個長度等於句子長度的標籤序列 $y=(y_1,y_2,...,y_n)$ ,那麼模型對於句子 $x$ 的標籤等於 $y$ 的打分爲

$$score(x,y)=\sum_{i=1}^{n}P_{i,y_{i}}+\sum_{i=1}^{n+1}A_{y_{i-1},y_{i}}$$

能夠看出整個序列的打分等於各個位置的打分之和,而每一個位置的打分由兩部分獲得,一部分是由LSTM輸出的 $\boldsymbol p_i$ 決定,另外一部分則由CRF的轉移矩陣 $A$ 決定。進而能夠利用Softmax獲得歸一化後的機率:

$$P(y|x)=\frac{\exp(score(x,y))}{\sum_{y'}\exp(score(x,y'))}$$

      模型訓練時經過最大化對數似然函數,下式給出了對一個訓練樣本 $(x,y^{x})$ 的對數似然:

$$\log P(y^{x}|x)=score(x,y^{x})-\log(\sum_{y'}\exp(score(x,y')))$$

若是這個算法要本身實現的話,須要注意的是指數的和的對數要轉換成 $\log\sum_i\exp(x_i) = a + \log\sum_i\exp(x_i - a)$(TensorFlow有現成的CRF,PyTorch就要本身寫了),在CRF中上式的第二項使用前向後向算法來高效計算。

      模型在預測過程(解碼)時使用動態規劃的Viterbi算法來求解最優路徑:
$$y^{*}=\arg\max_{y'}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

相關文章
相關標籤/搜索