三個月之前 NLP 課程結課,我們做的是命名實體識別的實驗。在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標注集。
以句子為單位,將一個含有 $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