1 命名實體識別模型介紹
諸如中文分詞、詞性標(biāo)注、命名實體等問題均屬于序列標(biāo)簽標(biāo)注問題。經(jīng)典的模型有HMM,MEMM,CRF模型,這些都是比較傳統(tǒng)的方法,三種模型各有優(yōu)劣,HMM模型假設(shè)觀測獨(dú)立,不依賴觀測之間的序列特征,MEMM雖然加入了觀測序列之間的跳轉(zhuǎn)特征,但由于采用了局部歸一化引入了標(biāo)記偏置的問題,最后CRF采用全局歸一化從而彌補(bǔ)了HMM和MEMM的缺點(diǎn),但是計算量卻比較大。
隨著深度學(xué)習(xí)的興起,將CNN和RNN模型應(yīng)用到標(biāo)簽標(biāo)注問題上,取得了不俗的結(jié)果。比較各模型的結(jié)果,一般來說, DNN之前,CRF的結(jié)果最好,應(yīng)用中也最為廣泛, DNN這把神器出來后,state-of-the-art的結(jié)果均已被DNN的各種模型占領(lǐng)。DNN重在特征的自學(xué)習(xí),將DNN學(xué)習(xí)到的特征送入到CRF中是一個很自然的思路。下面介紹NeuroCRF命名實體識別模型,望文知義,就是神經(jīng)網(wǎng)絡(luò)+CRF的模型,這里的神經(jīng)網(wǎng)絡(luò)采用的是BI-LSTM網(wǎng)絡(luò),該模型的結(jié)果是我在實際測試中表現(xiàn)最好的。(CNN+CRF模型沒有測試,聽說表現(xiàn)不俗。)NeuroCRF的出處和代碼見底部的鏈接。
1.1 LSTM 與 CRF融合
LSTM與CRF融合時,LSTM層負(fù)責(zé)特征提取(和所有的深度網(wǎng)絡(luò)一樣),但也只是對輸入數(shù)據(jù)X進(jìn)行加工,未對輸入數(shù)據(jù)X對應(yīng)的輸出標(biāo)簽y進(jìn)行加工,因此在LSTM網(wǎng)絡(luò)輸出層追加一層CRF層,通過CRF層對標(biāo)簽之間的跳轉(zhuǎn)特征進(jìn)行加工,這里的CRF模型選用的是線性鏈CRF模型。
結(jié)合圖1的表述來說。首先將輸入數(shù)據(jù)X輸入到Bi-LSMT網(wǎng)絡(luò)中,網(wǎng)絡(luò)的輸出P的一行表示為某個word對應(yīng)的每種tag的分值。將這個P送入到CRF層中,實際上所起的作用就是CRF中的狀態(tài)特征或者發(fā)射特征,通過CRF學(xué)習(xí)的tag之間的跳轉(zhuǎn)特征實際上就是狀態(tài)轉(zhuǎn)移特征。
1.1.1 Bi-LSTM的輸出
直接上代碼,如下
outputs, final_states = tf.nn.bidirectional_dynamic_rnn(lstm_cell["forward"], lstm_cell["backward"], input, dtype=tf.float32, sequence_length=sequence_length, initial_state_fw=initial_state["forward"], initial_state_bw=initial_state["backward"])
Bi-LSTM的輸出包含兩部分,outputs,final_states,其中outputs就是每個時間t時刻的輸出h_t, final_states就是每個時間t時刻的記憶單元cell_t。這里網(wǎng)絡(luò)的輸出矩陣P只用到了outputs. 看了多個版本Bi-lstm的輸出層的實現(xiàn),各有千秋:
版本1
weight, bias = self.weight_and_bias(2 * args.rnn_size, args.class_size) output = tf.reshape(tf.transpose(tf.stack(outputs), perm=[1, 0, 2]), [-1, 2 * args.rnn_size]) prediction = tf.nn.softmax(tf.matmul(outputs, weight) + bias)
版本2
outputs = tf.reshape(outputs, [-1, num_units]) //輸出層的學(xué)習(xí)參數(shù) W = weight_init([num_units, D_label]) b = bias_init([D_label]) output = tf.matmul(outputs, W) + b // 損失 loss=tf.reduce_mean((output-labels)**2)
版本3
outputs = tf.nn.xw_plus_b(token_lstm_output_squeezed, W, b, name="output_before_tanh") outputs = tf.nn.tanh(outputs, name="output_after_tanh") scores = tf.nn.xw_plus_b(outputs, W, b, name="scores")
1.2 模型結(jié)構(gòu)
Figure1描述了BiLSTM+CRF進(jìn)行實體識別的一般網(wǎng)絡(luò)結(jié)構(gòu):首先用word2vec或者Glove與訓(xùn)練好word embeddings 作為輸入向量,送入到Bi-LSTM中,輸出是經(jīng)過Bi-LSTM網(wǎng)絡(luò)編碼后的包含上下文信息的新的詞向量ci,最后將ci 送入到CRF層中,經(jīng)過這一層學(xué)習(xí)到得到的分值為最終為每個word所打的標(biāo)簽對應(yīng)的分值。
Figure2是在Figure1所示的網(wǎng)絡(luò)結(jié)構(gòu)上,對輸入信息又加入一層character embeddings。 對于中文來說,character embeddings 應(yīng)該是分詞后的每個詞包含的字對應(yīng)的embeddings,比如對于“簡書”,其對應(yīng)的character embeddings 就是"簡",“書”對應(yīng)的embeddings。在別的論文中看到有作者進(jìn)一步對單個漢字進(jìn)行拆分,比如"錦",拆分成"钅"和"帛",說是漢字的偏旁也是能夠表達(dá)一些隱含信息的。
1.3 代碼結(jié)構(gòu)
2 數(shù)據(jù)準(zhǔn)備
2.1 數(shù)據(jù)標(biāo)注方式說明
數(shù)據(jù)標(biāo)注方式,對實體進(jìn)行標(biāo)注方式有兩種,BIO和BIEOS。 B表示Beign, I 表示Internal, O表示Other, E表示End,S表示Single.舉個例子,"第八 代 雅閣"的兩種標(biāo)注方式:
第八 B-MODEL
代 I-MODEL
雅閣 I-MODEL
和
第八 B-MODEL
代 I-MODEL
雅閣 E-MODEL
BIEOS的標(biāo)注更為詳細(xì),模型的結(jié)果表現(xiàn)也優(yōu)于BIO方式。
完整的數(shù)據(jù)格式如下,其中每一行是的第一個是要進(jìn)行實體類別標(biāo)注的詞,第二個是詞性,第三個是實體類別標(biāo)注。
EU NNP B-ORG
rejects VBZ O
German JJ B-MISC
call NN O
to TO O
boycott VB O
British JJ B-MISC
lamb NN O
. . O O
2.2 數(shù)據(jù)標(biāo)注
由于沒有專門的人員進(jìn)行實體類別的標(biāo)注,只能依靠自己,通過人工標(biāo)注+程序,反復(fù)的校驗。
實體類別有:汽車品牌(brand),車型(model),產(chǎn)品(product_name),公司(company_name),組織機(jī)構(gòu)名(org_name),地點(diǎn)(location_name),人名(person_name),職位(title_name),其他(misc).
首先借助多個第三方實體識別工具,識別產(chǎn)品、公司、組織機(jī)構(gòu)、地點(diǎn)、人名、職位等實體,在識別出的實體集中通過行業(yè)詞典+word2vec的方式提取出車型和品牌。這一步主要得益于我們長期維護(hù)的一個行業(yè)詞典。數(shù)據(jù)集中的實體及類別基本確定后,對數(shù)據(jù)集進(jìn)行清洗,將數(shù)據(jù)集按照句子拆分,并分析句子中包含的實體個數(shù)和類別分布,去除包含實體少的句子,對數(shù)據(jù)集中的每個類別下的實體進(jìn)行均衡,最后整理出大約10w條富含實體的句子。
3 模型結(jié)果展示和解讀
以下是基于10w條進(jìn)行進(jìn)行訓(xùn)練和測試的結(jié)果。這里僅使用了words-level embeddings。
訓(xùn)練結(jié)果
processed 1306244 tokens with 252442 phrases; found: 252367 phrases; correct: 218323.
accuracy: 94.80%; precision: 86.51%; recall: 86.48%; FB1: 86.50
BRAND: precision: 92.18%; recall: 89.24%; FB1: 90.68 18124
COMPANYNAME: precision: 85.01%; recall: 85.05%; FB1: 85.03 32655
JOBTITLE: precision: 90.20%; recall: 92.82%; FB1: 91.49 18333
LOCATION: precision: 84.62%; recall: 86.69%; FB1: 85.64 33164
MISC: precision: 97.58%; recall: 98.68%; FB1: 98.13 538
MODEL: precision: 82.10%; recall: 88.95%; FB1: 85.39 55556
ORGNAME: precision: 82.72%; recall: 79.73%; FB1: 81.20 11184
PERSONNAME: precision: 86.79%; recall: 86.54%; FB1: 86.66 20972
PRODUCTNAME: precision: 78.30%; recall: 62.89%; FB1: 69.75 20048
TIME: precision: 95.64%; recall: 96.34%; FB1: 95.99 41793
測試結(jié)果
processed 47386 tokens with 9229 phrases; found: 9191 phrases; correct: 7943.
accuracy: 94.62%; precision: 86.42%; recall: 86.07%; FB1: 86.24
BRAND: precision: 90.88%; recall: 89.45%; FB1: 90.16 746
COMPANYNAME: precision: 84.79%; recall: 83.73%; FB1: 84.26 1190
JOBTITLE: precision: 86.72%; recall: 88.57%; FB1: 87.63 670
LOCATION: precision: 84.78%; recall: 86.47%; FB1: 85.62 1183
MISC: precision: 100.00%; recall: 100.00%; FB1: 100.00 23
MODEL: precision: 84.71%; recall: 87.35%; FB1: 86.01 2014
ORGNAME: precision: 78.50%; recall: 75.75%; FB1: 77.10 386
PERSONNAME: precision: 87.12%; recall: 84.87%; FB1: 85.98 792
PRODUCTNAME: precision: 76.44%; recall: 66.75%; FB1: 71.27 662
TIME: precision: 94.69%; recall: 96.07%; FB1: 95.38 1525
從結(jié)果來看,還是不錯的,觀察具體識別的結(jié)果,可以看到模型的學(xué)習(xí)能力還是很強(qiáng)大的,有些label標(biāo)錯了也能正確的識別出來。以下數(shù)據(jù)的第三列是標(biāo)注結(jié)果,第四列是模型預(yù)測結(jié)果。
總結(jié) v O O
: wm O O
近期 t O O
, wd O O
金杯 n B-MODEL B-MODEL
蒂阿茲 nz I-MODEL I-MODEL
、 wn O O
昌河 nz B-MODEL B-MODEL
M70 nx I-MODEL I-MODEL
、 wn O O
獵豹 v B-MODEL B-MODEL
CT7 nx I-MODEL I-MODEL
、 wn O O
長安 nz B-MODEL B-MODEL
CX70T nx I-MODEL I-MODEL
、 wn O O
起亞 nz B-BRAND B-MODEL
混動 n O I-MODEL
Niro nx B-PRODUCTNAME I-MODEL
極睿 nz I-PRODUCTNAME I-MODEL
、 wn O O
濰柴 nz B-MODEL B-MODEL
英致 nz I-MODEL I-MODEL
G3CVT nx I-MODEL I-MODEL
版 n I-MODEL I-MODEL
等 udeng O O
車型 n O O
相繼 d O O
上市 vi O O
。 wj O O
Refs
- Marc-Antoine Rondeau, LSTM-Based NeuroCRFs for Named Entity Recognition
- Guillaume Lample,Neural Architectures for Named Entity Recognition
- Full-Rank Linear-Chain NeuroCRF for Sequence Labeling
- https://github.com/Franck-Dernoncourt/NeuroNER