NLP(二十五)實現(xiàn)ALBERT+Bi-LSTM+CRF模型

??在文章NLP(二十四)利用ALBERT實現(xiàn)命名實體識別中,筆者介紹了ALBERT+Bi-LSTM模型在命名實體識別方面的應(yīng)用。
??在本文中,筆者將介紹如何實現(xiàn)ALBERT+Bi-LSTM+CRF模型,以及在人民日報NER數(shù)據(jù)集和CLUENER數(shù)據(jù)集上的表現(xiàn)。
??功能項目方面的介紹里面不再多介紹,筆者只介紹模型訓(xùn)練和模型預(yù)測部分的代碼。項目方面的代碼可以參考文章NLP(二十四)利用ALBERT實現(xiàn)命名實體識別,模型為ALBERT+Bi-LSTM+CRF,結(jié)構(gòu)圖如下:

ALBERT+Bi-LSTM+CRF模型結(jié)構(gòu)圖

模型訓(xùn)練的代碼(albert_model_train.py)中新增導(dǎo)入keras-contrib模塊中的CRF層:

from keras_contrib.layers import CRF
from keras_contrib.losses import crf_loss
from keras_contrib.metrics import crf_accuracy, crf_viterbi_accuracy

模型方面的代碼如下:

# Build model
def build_model(max_para_length, n_tags):
    # Bert Embeddings
    bert_output = Input(shape=(max_para_length, 312, ), name="bert_output")
    # LSTM model
    lstm = Bidirectional(LSTM(units=128, return_sequences=True), name="bi_lstm")(bert_output)
    drop = Dropout(0.1, name="dropout")(lstm)
    dense = TimeDistributed(Dense(n_tags, activation="softmax"), name="time_distributed")(drop)
    crf = CRF(n_tags)
    out = crf(dense)
    model = Model(inputs=bert_output, outputs=out)
    # model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    model.compile(loss=crf.loss_function, optimizer='adam', metrics=[crf.accuracy])

    # 模型結(jié)構(gòu)總結(jié)
    model.summary()
    plot_model(model, to_file="albert_bi_lstm.png", show_shapes=True)

    return model

設(shè)置文本的最大長度MAX_SEQ_LEN = 128,訓(xùn)練10個epoch,在測試集上的F1值(利用seqeval模塊評估)輸出如下:

           precision    recall  f1-score   support

      LOC     0.9766    0.9032    0.9385      3658
      ORG     0.9700    0.9465    0.9581      2185
      PER     0.9880    0.9721    0.9800      1864

micro avg     0.9775    0.9321    0.9543      7707
macro avg     0.9775    0.9321    0.9541      7707

之前用ALBERT+Bi-LSTM模型得到的F1值為91.96%,而ALBERT+Bi-LSTM+CRF模型能達到95.43%,提升效果不錯。
??模型預(yù)測代碼(model_predict.py)如下:

# -*- coding: utf-8 -*-
# author: Jclian91
# place: Pudong Shanghai
# time: 2020-03-11 13:16
import json
import numpy as np
from keras_contrib.layers import CRF
from keras_contrib.losses import crf_loss
from keras_contrib.metrics import crf_accuracy, crf_viterbi_accuracy
from keras.models import load_model
from collections import defaultdict
from pprint import pprint

from utils import MAX_SEQ_LEN, event_type
from albert_zh.extract_feature import BertVector

# 讀取label2id字典
with open("%s_label2id.json" % event_type, "r", encoding="utf-8") as h:
    label_id_dict = json.loads(h.read())

id_label_dict = {v: k for k, v in label_id_dict.items()}

# 利用ALBERT提取文本特征
bert_model = BertVector(pooling_strategy="NONE", max_seq_len=MAX_SEQ_LEN)
f = lambda text: bert_model.encode([text])["encodes"][0]

# 載入模型
custom_objects = {'CRF': CRF, 'crf_loss': crf_loss, 'crf_viterbi_accuracy': crf_viterbi_accuracy}
ner_model = load_model("%s_ner.h5" % event_type, custom_objects=custom_objects)


# 從預(yù)測的標簽列表中獲取實體
def get_entity(sent, tags_list):

    entity_dict = defaultdict(list)
    i = 0
    for char, tag in zip(sent, tags_list):
        if 'B-' in tag:
            entity = char
            j = i+1
            entity_type = tag.split('-')[-1]
            while j < min(len(sent), len(tags_list)) and 'I-%s' % entity_type in tags_list[j]:
                entity += sent[j]
                j += 1

            entity_dict[entity_type].append(entity)

        i += 1

    return dict(entity_dict)


# 輸入句子,進行預(yù)測
while 1:
    # 輸入句子
    text = input("Please enter an sentence: ").replace(' ', '')
    # 利用訓(xùn)練好的模型進行預(yù)測
    train_x = np.array([f(text)])
    y = np.argmax(ner_model.predict(train_x), axis=2)
    y = [id_label_dict[_] for _ in y[0] if _]

    # 輸出預(yù)測結(jié)果
    pprint(get_entity(text, y))

在網(wǎng)上找?guī)讞l新聞,預(yù)測結(jié)果如下:

Please enter an sentence: 驢媽媽旅游網(wǎng)創(chuàng)始人洪清華近日接受媒體采訪談及驢媽媽的發(fā)展模式時表示:現(xiàn)在,電商有兩種做法——小而美的電商追求盈利,大而全的電商鐘情規(guī)模。
{'PER': ['洪清華']}
Please enter an sentence: EF英孚教育集團是全球最大的私人英語教育機構(gòu),主要致力于英語培訓(xùn)、留學(xué)旅游以及英語文化交流等方面。
{'ORG': ['EF英孚教育集團']}
Please enter an sentence: 宋元時期起,在臺灣早期開發(fā)的過程中,中華文化傳統(tǒng)已隨著大陸墾民傳入臺灣。
{'LOC': ['臺灣', '中華', '臺灣']}
Please enter an sentence: 吸引了眾多投資者來津發(fā)展,康師傅紅燒牛肉面就是于1992年在天津誕生。
{'LOC': ['天津']}
Please enter an sentence: 經(jīng)過激烈角逐,那英戰(zhàn)隊成功晉級16強的學(xué)員有實力非凡的姚貝娜、摯情感打動觀眾的朱克、音樂創(chuàng)作能力十分突出的侯磊。
{'PER': ['姚貝娜', '朱克', '侯磊']}

??接下來我們看看該模型在CLUENER數(shù)據(jù)集上的表現(xiàn)。CLUENER數(shù)據(jù)集是在清華大學(xué)開源的文本分類數(shù)據(jù)集THUCTC基礎(chǔ)上,選出部分數(shù)據(jù)進行細粒度命名實體標注,原數(shù)據(jù)來源于Sina News RSS,實體有:地址(address),書名(book),公司(company),游戲(game),政府(goverment),電影(movie),姓名(name),組織機構(gòu)(organization),職位(position),景點(scene),該數(shù)據(jù)集的介紹網(wǎng)站為:https://www.cluebenchmarks.com/introduce.html 。
??下載數(shù)據(jù)集,用腳本將其處理成模型支持的數(shù)據(jù)格式,因為缺少test數(shù)據(jù)集,故模型評測的時候用dev數(shù)據(jù)集代替。設(shè)置模型的文本最大長度MAX_SEQ_LEN = 128,訓(xùn)練10個epoch,在測試集上的F1值(利用seqeval模塊評估)輸出如下:

sentences length: 10748 
last sentence:  藝術(shù)家也討厭畫廊的老板,內(nèi)心恨他們,這樣的話,你是在這樣的狀態(tài)下,兩年都是一次性合作,甚至兩年、
start ALBERT encding
end ALBERT encoding
sentences length: 1343 
last sentence:  另外意大利的PlayGeneration雜志也剛剛給出了92%的高分。
start ALBERT encding
end ALBERT encoding
sentences length: 1343 
last sentence:  另外意大利的PlayGeneration雜志也剛剛給出了92%的高分。
start ALBERT encding
end ALBERT encoding
......
.......
              precision    recall  f1-score   support

        book     0.9343    0.8421    0.8858       152
    position     0.9549    0.8965    0.9248       425
  government     0.9372    0.9180    0.9275       244
        game     0.6968    0.6725    0.6844       287
organization     0.8836    0.8605    0.8719       344
     company     0.8659    0.7760    0.8184       366
     address     0.8394    0.8187    0.8289       364
       movie     0.9217    0.7067    0.8000       150
        name     0.8771    0.8071    0.8406       451
       scene     0.9939    0.8191    0.8981       199

   micro avg     0.8817    0.8172    0.8482      2982
   macro avg     0.8835    0.8172    0.8482      2982

在網(wǎng)上找?guī)讞l新聞,預(yù)測結(jié)果如下:

Please enter an sentence: 據(jù)中山外僑局消息,近日,秘魯國會議員、祖籍中山市開發(fā)區(qū)的瑪利亞·洪大女士在秘魯國會大廈親切會見了中山市人民政府副市長馮煜榮一行,對中山市友好代表團的來訪表示熱烈的歡迎。
{'address': ['中山市開發(fā)區(qū)', '秘魯國會大廈'],
 'government': ['中山外僑局', '秘魯國會', '中山市人民政府'],
 'name': ['瑪利亞·洪大', '馮煜榮'],
 'position': ['議員', '副市長']}
 Please enter an sentence: “隔離結(jié)束回來,發(fā)現(xiàn)公司不見了”,網(wǎng)上的段子,真發(fā)生在了昆山達鑫電子有限公司員工身上。
{'company': ['昆山達鑫電子有限公司']}
Please enter an sentence: 由黃子韜、易烊千璽、胡冰卿、王子騰等一眾青年演員主演的熱血勵志劇《熱血同行》正在熱播中。
{'game': ['《熱血同行》'], 'name': ['黃子韜', '易烊千璽', '胡冰卿', '王子騰'], 'position': ['演員']}
Please enter an sentence: 近日,由作家出版社主辦的韓作榮《天生我才——李白傳》新書發(fā)布會在京舉行
{'book': ['《天生我才——李白傳》'], 'name': ['韓作榮'], 'organization': ['作家出版社']}

??本項目已經(jīng)開源,Github網(wǎng)址為:https://github.com/percent4/ALBERT_NER_KERAS
??本文到此結(jié)束,感謝大家閱讀,歡迎關(guān)注筆者的微信公眾號:Python爬蟲與算法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容