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

??在文章NLP(二十四)利用ALBERT實(shí)現(xiàn)命名實(shí)體識(shí)別中,筆者介紹了ALBERT+Bi-LSTM模型在命名實(shí)體識(shí)別方面的應(yīng)用。
??在本文中,筆者將介紹如何實(shí)現(xiàn)ALBERT+Bi-LSTM+CRF模型,以及在人民日?qǐng)?bào)NER數(shù)據(jù)集和CLUENER數(shù)據(jù)集上的表現(xiàn)。
??功能項(xiàng)目方面的介紹里面不再多介紹,筆者只介紹模型訓(xùn)練和模型預(yù)測(cè)部分的代碼。項(xiàng)目方面的代碼可以參考文章NLP(二十四)利用ALBERT實(shí)現(xiàn)命名實(shí)體識(shí)別,模型為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è)置文本的最大長(zhǎng)度MAX_SEQ_LEN = 128,訓(xùn)練10個(gè)epoch,在測(cè)試集上的F1值(利用seqeval模塊評(píng)估)輸出如下:

           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模型能達(dá)到95.43%,提升效果不錯(cuò)。
??模型預(yù)測(cè)代碼(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ù)測(cè)的標(biāo)簽列表中獲取實(shí)體
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)


# 輸入句子,進(jìn)行預(yù)測(cè)
while 1:
    # 輸入句子
    text = input("Please enter an sentence: ").replace(' ', '')
    # 利用訓(xùn)練好的模型進(jìn)行預(yù)測(cè)
    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ù)測(cè)結(jié)果
    pprint(get_entity(text, y))

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

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

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

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ù)測(cè)結(jié)果如下:

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

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

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

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

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