【NLP实战】基于ALBERT的文本相似度计算
實(shí)戰(zhàn)是學(xué)習(xí)一門技術(shù)最好的方式,也是深入了解一門技術(shù)唯一的方式。因此,NLP專欄推出了實(shí)戰(zhàn)專欄,讓有興趣的同學(xué)在看文章之余也可以自己動(dòng)手試一試。
ALBERT是一個(gè)比BERT要輕量,效果更好的模型,本篇實(shí)踐介紹如何用ALBERT計(jì)算兩個(gè)文本的相似度。
作者&編輯 | 小Dream哥
1 ALBERT介紹?
ALBERT利用詞嵌入?yún)?shù)因式分解和隱藏層間參數(shù)共享兩種手段,顯著減少了模型的參數(shù)量的同時(shí),基本沒有損失模型的性能。筆者在下面的文章中詳細(xì)介紹了ALBERT的理論,感興趣的同學(xué)可以戳進(jìn)去了解:
【NLP】ALBERT:更輕更快的的預(yù)訓(xùn)練
albert_tiny模型,能夠顯著提高模型的推理速度,但是效果依然很棒,這里介紹如何基于albert_tiny模型進(jìn)行文本相似度計(jì)算。
2? BERT4KERAS
本來(lái)自己寫了個(gè)基于tensorflow的ALBERT模型,后來(lái)看到蘇劍林老師的bert4keras,覺得確實(shí)實(shí)現(xiàn)簡(jiǎn)潔,易懂。遂決定分享給大家。
感興趣的同學(xué)可以看看蘇劍林老師的網(wǎng)站:
https://spaces.ac.cn/archives/6915
BERT4KERAS是蘇老師基于kears實(shí)現(xiàn)的幾個(gè)BERT模型,包括BERT,ALBERT和ROBERTA,基于BERT4KERAS可以快速的使用這些模型,也能夠快速的實(shí)現(xiàn)對(duì)BERT改進(jìn)的想法。
快速安裝:
pip install git+https://www.github.com/bojone/bert4keras.git
3 如何獲取ALBERT-zh??
從如下的github中能夠獲取訓(xùn)練好的ALBERT-zh 模型:
https://github.com/brightmart/albert_zh
4? 開始實(shí)戰(zhàn)
ALBERT輸出的第一個(gè)向量,可以用來(lái)表征整體的輸入文本,在本篇實(shí)戰(zhàn)中,利用這個(gè)向量來(lái)計(jì)算文本之間的相似度。
相似度的計(jì)算大致可以分為這么幾個(gè)步驟:
1. 構(gòu)建模型,加載ALBERT預(yù)訓(xùn)練模型。
2. 構(gòu)建分詞器,處理輸入。
3. 利用模型,計(jì)算輸入文本的向量表征。
4. 利用文本向量,計(jì)算兩個(gè)文本之間距離或者相似度。
1)構(gòu)建模型,加載ALBERT預(yù)訓(xùn)練模型
# 加載預(yù)訓(xùn)練模型
bert = build_bert_model(
config_path=config_path,
checkpoint_path=checkpoint_path,
? ?with_pool=True,
albert=True,
? ?return_keras_model=False,
)
這里直接調(diào)用bert4keras的build_bert_model接口,構(gòu)建albert模型,并直接加載albert的中文模型的權(quán)重。
config_path用來(lái)指定模型的配置文件路徑;
checkpoint_path用來(lái)指定模型權(quán)重文件的路徑;
albert表示指定用albert模型;
2) 構(gòu)建分詞器,處理輸入
#構(gòu)建分詞器
tokenizer = Tokenizer(dict_path)
#格式化輸入
token_ids1, segment_ids1 = tokenizer.encode(u'我想去北京')
token_ids2, segment_ids2 = tokenizer.encode(u'我想去香港')
token_ids3, segment_ids3 = tokenizer.encode(u'目前的局勢(shì),止暴制亂,刻不容緩')
首先構(gòu)建分詞器這里直接用了bert4keras定義的分詞器Tokenizer。
然后用分詞器處理輸入,獲得輸入文本在詞典中的序號(hào)表示及分段信息表示。這里解釋下為什么要將輸入文本轉(zhuǎn)化成這兩個(gè)表示:
1.albert模型的輸入與bert類似,需要接受詞、分段以及位置三個(gè)輸入,位置信息由模型內(nèi)的代碼處理;
2.將詞轉(zhuǎn)化為詞在詞典中的序號(hào)便于后續(xù)的詞嵌入操作。
3) 利用模型,計(jì)算輸入文本的向量表征
#計(jì)算文本的向量表征,獲取albert的第一個(gè)位置的輸出
sentence_vec1 = model.predict([np.array([token_ids1]), np.array([segment_ids1])])[0]
sentence_vec2 = model.predict([np.array([token_ids2]), np.array([segment_ids2])])[0]
sentence_vec3 = model.predict([np.array([token_ids3]), np.array([segment_ids3])])[0]
因?yàn)槲覀儽敬问侵苯永妙A(yù)訓(xùn)練模型的知識(shí),直接計(jì)算文本的向量表征,因此沒有訓(xùn)練過程,直接predict即可獲得文本的向量表征。這里,獲取albert的第一個(gè)位置的輸出作為輸入文本的向量表征。
4) 計(jì)算文本相似度
# 引入兩個(gè)相似度計(jì)算包,歐氏距離和余弦距離
from sklearn.metrics.pairwise import euclidean_distances
from sklearn.metrics.pairwise import cosine_similarity
#定義相似度計(jì)算函數(shù)
def similarity_count(vec1, vec2, mode='cos'):
? ?if mode == 'eu':
? ? ? ?return euclidean_distances([vec1,vec2])[0][1]
? ?if mode == 'cos':
? ? ? ?return cosine_similarity([vec1, vec2])[0][1]
#相似度計(jì)算
#余弦距離
similarity_count(sentence_vec1, sentence_vec2)
#歐式距離
similarity_count(sentence_vec1, sentence_vec2, mode='eu')
這里引入sklearn中的兩個(gè)計(jì)算歐氏距離和余弦距離的包來(lái)計(jì)算文本之間的距離。具體過程相對(duì)簡(jiǎn)單,直接看上面的代碼吧。
5 結(jié)果展示
如上圖所示,計(jì)算了“我想去北京”和“我想去香港”兩句話的余弦距離和歐式距離;計(jì)算了“我想去北京”和“目前的局勢(shì),止暴制亂,刻不容緩”兩句話的余弦距離和歐式距離。兩句表達(dá)意思相近的話,相似度較高,距離較短。但是區(qū)隔度不是特別大,所以,在生產(chǎn)中,在一些特別的領(lǐng)域,需要用特別的語(yǔ)料,進(jìn)行fintune,會(huì)有更好的效果。
至此,介紹了如何利用bert4keras搭建albert模型進(jìn)行文本相似度計(jì)算,代碼在我們有三AI的github可以下載:https://github.com/longpeng2008/yousan.ai/tree/master/natural_language_processing
找到albert文件夾,執(zhí)行python3 similarity.py就可以運(yùn)行了。
總結(jié)
ALBERT利用詞嵌入?yún)?shù)因式分解和隱藏層間參數(shù)共享兩種手段,顯著減少了模型的參數(shù)量的同時(shí),基本沒有損失模型的性能,是一個(gè)不錯(cuò)的工作。
除了使用它,更關(guān)鍵的是albert模型的實(shí)現(xiàn)和理論。我們會(huì)在知識(shí)星球討論相關(guān)的內(nèi)容,感興趣的話可以掃描下面的二維碼了解。
讀者們可以留言,或者加入我們的NLP群進(jìn)行討論。感興趣的同學(xué)可以微信搜索jen104,備注"加入有三AI NLP群"。
下期預(yù)告:命名實(shí)體識(shí)別實(shí)踐
知識(shí)星球推薦
掃描上面的二維碼,就可以加入我們的星球,助你成長(zhǎng)為一名合格的自然語(yǔ)言處理算法工程師。
知識(shí)星球主要有以下內(nèi)容:
(1) 聊天機(jī)器人??紤]到聊天機(jī)器人是一個(gè)非常復(fù)雜的NLP應(yīng)用場(chǎng)景,幾乎涵蓋了所有的NLP任務(wù)及應(yīng)用。所以小Dream哥計(jì)劃以聊天機(jī)器人作為切入點(diǎn),通過介紹聊天機(jī)器人的原理和實(shí)踐,逐步系統(tǒng)的更新到大部分NLP的知識(shí),會(huì)包括語(yǔ)義匹配,文本分類,意圖識(shí)別,語(yǔ)義匹配命名實(shí)體識(shí)別、對(duì)話管理以及分詞等。
(2) 知識(shí)圖譜。知識(shí)圖譜對(duì)于NLP各項(xiàng)任務(wù)效果好壞的重要性,就好比基礎(chǔ)知識(shí)對(duì)于一個(gè)學(xué)生成績(jī)好壞的重要性。他是NLP最重要的基礎(chǔ)設(shè)施,目前各大公司都在著力打造知識(shí)圖譜,作為一個(gè)NLP工程師,必須要熟悉和了解他。
(3) NLP預(yù)訓(xùn)練模型?;诤A繑?shù)據(jù),進(jìn)行超大規(guī)模網(wǎng)絡(luò)的無(wú)監(jiān)督預(yù)訓(xùn)練。具體的任務(wù)再通過少量的樣本進(jìn)行Fine-Tune。這樣模式是目前NLP領(lǐng)域最火熱的模式,很有可能引領(lǐng)NLP進(jìn)入一個(gè)全新發(fā)展高度。你怎么不深入的了解?
轉(zhuǎn)載文章請(qǐng)后臺(tái)聯(lián)系
侵權(quán)必究
往期精選
【完結(jié)】 12篇文章帶你完全進(jìn)入NLP領(lǐng)域,掌握核心技術(shù)
【NLP-詞向量】詞向量的由來(lái)及本質(zhì)
【NLP-詞向量】從模型結(jié)構(gòu)到損失函數(shù)詳解word2vec
【NLP-NER】什么是命名實(shí)體識(shí)別?
【NLP-NER】命名實(shí)體識(shí)別中最常用的兩種深度學(xué)習(xí)模型
【NLP-NER】如何使用BERT來(lái)做命名實(shí)體識(shí)別
【NLP-ChatBot】我們熟悉的聊天機(jī)器人都有哪幾類?
【NLP-ChatBot】搜索引擎的最終形態(tài)之問答系統(tǒng)(FAQ)詳述
【NLP-ChatBot】能干活的聊天機(jī)器人-對(duì)話系統(tǒng)概述
【知識(shí)圖譜】人工智能技術(shù)最重要基礎(chǔ)設(shè)施之一,知識(shí)圖譜你該學(xué)習(xí)的東西
【NLP實(shí)戰(zhàn)】tensorflow詞向量訓(xùn)練實(shí)戰(zhàn)
【NLP實(shí)戰(zhàn)系列】樸素貝葉斯文本分類實(shí)戰(zhàn)
【NLP實(shí)戰(zhàn)系列】Tensorflow命名實(shí)體識(shí)別實(shí)戰(zhàn)
【NLP實(shí)戰(zhàn)】如何基于Tensorflow搭建一個(gè)聊天機(jī)器人
【每周NLP論文推薦】從預(yù)訓(xùn)練模型掌握NLP的基本發(fā)展脈絡(luò)
【每周NLP論文推薦】 NLP中命名實(shí)體識(shí)別從機(jī)器學(xué)習(xí)到深度學(xué)習(xí)的代表性研究
【每周NLP論文推薦】 介紹語(yǔ)義匹配中的經(jīng)典文章
【每周NLP論文推薦】 對(duì)話管理中的標(biāo)志性論文介紹
【每周NLP論文推薦】 開發(fā)聊天機(jī)器人必讀的重要論文
【每周NLP論文推薦】 掌握實(shí)體關(guān)系抽取必讀的文章
【每周NLP論文推薦】 生成式聊天機(jī)器人論文介紹
【每周NLP論文推薦】 知識(shí)圖譜重要論文介紹
總結(jié)
以上是生活随笔為你收集整理的【NLP实战】基于ALBERT的文本相似度计算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【每周CV论文推荐】 初学活体检测与伪造
- 下一篇: 【知识图谱】知识表示:知识图谱如何表示结