深度學習--biLSTM_CRF 命名實體識別

前文

中文分詞映企、詞性標注、命名實體識別是自然語言理解中怎抛,基礎性的工作卑吭,同時也是非常重要的工作芽淡。在很多NLP的項目中马绝,工作開始之前都要經(jīng)過這三者中的一到多項工作的處理。在深度學習中挣菲,有一種模型可以同時勝任這三種工作富稻,而且效果還很不錯--那就是biLSTM_CRF。

biLSTM白胀,指的是雙向LSTM椭赋;CRF指的是條件隨機場。
biLSTM詞性標注
本文是以字為單位進行處理或杠。從下往上看哪怔,w0,w1...表示句子里面的字,經(jīng)過biLSTM處理,輸出每個字對應每個標簽的分數(shù)认境,我們將最大數(shù)值表示對該字預測的標簽胚委。既然,biLSTM已經(jīng)能夠進行滿足詞性標注叉信,那為什么還要再最后加上CRF層呢亩冬?
biLSTM詞性標注

從這幅圖中,可以看出硼身,預測結果明顯是錯的硅急,那為什么會出現(xiàn)這種錯誤呢,因為biLSTM只能夠預測文本序列與標簽的關系佳遂,而不能預測標簽與標簽之間的關系营袜,標簽之間的相互關系就是CRF中的轉(zhuǎn)移矩陣。
biLSTM_CRF詞性標注
這就是完整的biLSTM_CRF的模型圖丑罪,文本序列經(jīng)過biLSTM模型處理连茧,輸出結果傳入CRF層,最后輸出預測結果巍糯。
下面啸驯,進入正題,biLSTM_CRF模型在tensorflow中的實現(xiàn)祟峦。

運行環(huán)境

python 3.6
tensorflow 1.2
本文GITHUB 歡迎Star和Fork罚斗。
使用同樣方法,構造的中文分詞宅楞。中文分詞GITHUB

正文

1.數(shù)據(jù)預處理
2.模型構建
3.模型訓練與測試
4.模型驗證
5.總結

1.數(shù)據(jù)預處理

首先是將預測數(shù)據(jù)進行處理针姿,轉(zhuǎn)成模型能夠識別的數(shù)字。
數(shù)據(jù)原格式

數(shù)據(jù)是以列形式存儲厌衙,截圖翻轉(zhuǎn)了一下距淫。

我從訓練文本中,抽取頻數(shù)在前5000的字婶希,實際只抽取到了4830左右個字榕暇。加入'<PAD>','<UNK>','<NUM>',分別表示填充字符喻杈,未知字符彤枢,數(shù)字字符。一起存入字典筒饰。
字典
標簽同樣也有對應的字典缴啡。
# 將tag轉(zhuǎn)換成數(shù)字
tag2label = {"O": 0, "B-PER": 1, "I-PER": 2, "B-LOC": 3, "I-LOC": 4, "B-ORG": 5, "I-ORG": 6}

依據(jù)字典與標簽字典,將文字與標簽分別轉(zhuǎn)成數(shù)字瓷们。第一行是文本业栅,第二行是標簽秒咐。
文本與標簽

下一步是生成batch的操作。
生成batch后碘裕,需要對batch內(nèi)句子padding到統(tǒng)一的長度反镇,并計算每句的真實長度堰汉。

2.模型構建

采用雙向LSTM對序列進行處理买乃,將輸出結果進行拼接。輸入shape[batch,seq_Length,hidden_dim]种吸,輸出shape[batch,seq_length,2*hidden_dim]你弦。

        with tf.name_scope('biLSTM'):
            cell_fw = tf.nn.rnn_cell.LSTMCell(pm.hidden_dim)
            cell_bw = tf.nn.rnn_cell.LSTMCell(pm.hidden_dim)
            outputs, outstates = tf.nn.bidirectional_dynamic_rnn(cell_fw=cell_fw, cell_bw=cell_bw,inputs=self.embedding,
                                                                 sequence_length=self.seq_length, dtype=tf.float32)
            outputs = tf.concat(outputs, 2)#將雙向RNN的結果進行拼接
            #outputs三維張量惊豺,[batchsize,seq_length,2*hidden_dim]

我們從本文的第一幅圖中,可以看出禽作,整個biLSTM完整的輸出格式是[batch,seq_length,num_tag]尸昧。num_tag是標簽的數(shù)量,本實驗中是標簽數(shù)量是7旷偿。所以我們需要一個全連接層烹俗,將輸出格式處理一下。

        with tf.name_scope('output'):
            s = tf.shape(outputs)
            output = tf.reshape(outputs, [-1, 2*pm.hidden_dim])
            output = tf.layers.dense(output, pm.num_tags)
            output = tf.contrib.layers.dropout(output, pm.keep_pro)
            self.logits = tf.reshape(output, [-1, s[1], pm.num_tags])

self.logits就是需要輸入CRF層中的數(shù)據(jù)萍程。代碼的第三行幢妄,對output的變形,表示將[batch,seq_length,2hidden_dim]變成[batchseq_length,2*hidden_dim]茫负,最后處理時再變形為[batch,seq_length,num_tag]蕉鸳。
下面就是CRF層的處理:

        with tf.name_scope('crf'):
            log_likelihood, self.transition_params = crf_log_likelihood(inputs=self.logits, tag_indices=self.input_y, sequence_lengths=self.seq_length)
            # log_likelihood是對數(shù)似然函數(shù),transition_params是轉(zhuǎn)移概率矩陣
            #crf_log_likelihood{inputs:[batch_size,max_seq_length,num_tags],
                                #tag_indices:[batchsize,max_seq_length],
                                #sequence_lengths:[real_seq_length]
            #transition_params: A [num_tags, num_tags] transition matrix
            #log_likelihood: A scalar containing the log-likelihood of the given sequence of tag indices.

這一步忍法,是調(diào)用from tensorflow.contrib.crf import crf_log_likelihood函數(shù)潮尝,求最大似然函數(shù),以及求轉(zhuǎn)移矩陣饿序。最大似然函數(shù)前加上"-"勉失,可以用梯度下降法求最小值;

        with tf.name_scope('loss'):
            self.loss = tf.reduce_mean(-log_likelihood) #最大似然取負原探,使用梯度下降

轉(zhuǎn)移矩陣可以幫助維特比算法來求解最優(yōu)標注序列乱凿。

    def predict(self, sess, seqs):
        seq_pad, seq_length = process_seq(seqs)
        logits, transition_params = sess.run([self.logits, self.transition_params], feed_dict={self.input_x: seq_pad,
                                                                                               self.seq_length: seq_length,
                                                                                               self.keep_pro: 1.0})
        label_ = []
        for logit, length in zip(logits, seq_length):
            #logit 每個子句的輸出值,length子句的真實長度踢匣,logit[:length]的真實輸出值
            # 調(diào)用維特比算法求最優(yōu)標注序列
            viterbi_seq, _ = viterbi_decode(logit[:length], transition_params)
            label_.append(viterbi_seq)
        return label_

3.模型訓練與測試

訓練時告匠,共進行12次迭代,每迭代4次离唬,將訓練得到的結果,保存到checkpoints划鸽;loss的情況输莺,保留到tensorboard中戚哎;每100個batch,輸出此時的訓練結果與測試結果。
模型訓練

模型的loss由最初在訓練集54.93降到2.29嫂用,在測試集上由47.45降到1.73型凳。我們看下,保存的模型在驗證集上的效果嘱函。

4.模型驗證

我從1998年的人民網(wǎng)的新聞素材中甘畅,隨機抽取了幾條語句。
模型驗證

ORG表示組織名詞往弓,LOC表示地理名詞,PER表示人名疏唾。從驗證結果上看,模型在命名實體識別上函似,效果還可以槐脏。

5.總結

模型訓練數(shù)據(jù)從github上獲取的,在訓練時使用未訓練的字向量撇寞,不知道使用預訓練字向量是否可以提高準確率顿天。受限于電腦的性能,訓練數(shù)據(jù)僅使用50000條蔑担;提高機器性能牌废,加大訓練數(shù)據(jù)的量,準確性應該可以進一步提高啤握。寫這篇博客畔规,主要是介紹實驗過程,希望能夠給需要的人帶來幫助恨统。

參考

https://zhuanlan.zhihu.com/p/44042528

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叁扫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子畜埋,更是在濱河造成了極大的恐慌莫绣,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悠鞍,死亡現(xiàn)場離奇詭異对室,居然都是意外死亡,警方通過查閱死者的電腦和手機咖祭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門掩宜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人么翰,你說我怎么就攤上這事牺汤。” “怎么了浩嫌?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵檐迟,是天一觀的道長补胚。 經(jīng)常有香客問我,道長追迟,這世上最難降的妖魔是什么溶其? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮敦间,結果婚禮上瓶逃,老公的妹妹穿的比我還像新娘。我一直安慰自己廓块,他們只是感情好厢绝,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剿骨,像睡著了一般代芜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上浓利,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天挤庇,我揣著相機與錄音,去河邊找鬼贷掖。 笑死嫡秕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的苹威。 我是一名探鬼主播昆咽,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牙甫!你這毒婦竟也來了掷酗?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤窟哺,失蹤者是張志新(化名)和其女友劉穎泻轰,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體且轨,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡浮声,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旋奢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泳挥。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖至朗,靈堂內(nèi)的尸體忽然破棺而出屉符,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布筑煮,位于F島的核電站辛蚊,受9級特大地震影響粤蝎,放射性物質(zhì)發(fā)生泄漏真仲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一初澎、第九天 我趴在偏房一處隱蔽的房頂上張望秸应。 院中可真熱鬧,春花似錦碑宴、人聲如沸软啼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祸挪。三九已至,卻和暖如春贞间,著一層夾襖步出監(jiān)牢的瞬間贿条,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工增热, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留整以,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓峻仇,卻偏偏與公主長得像公黑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子摄咆,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容