??在文章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)圖如下:
模型訓(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)與算法。