越学越有趣:『手把手带你学NLP』系列项目01 ——词向量应用的那些事儿
點(diǎn)擊左上方藍(lán)字關(guān)注我們
課程簡(jiǎn)介
“手把手帶你學(xué)NLP”是基于飛槳PaddleNLP的系列實(shí)戰(zhàn)項(xiàng)目。本系列由百度多位資深工程師精心打造,提供了從詞向量、預(yù)訓(xùn)練語言模型,到信息抽取、情感分析、文本問答、結(jié)構(gòu)化數(shù)據(jù)問答、文本翻譯、機(jī)器同傳、對(duì)話系統(tǒng)等實(shí)踐項(xiàng)目的全流程講解,旨在幫助開發(fā)者更全面清晰地掌握百度飛槳框架在NLP領(lǐng)域的用法,并能夠舉一反三、靈活使用飛槳框架和PaddleNLP進(jìn)行NLP深度學(xué)習(xí)實(shí)踐。
從6月7日起,百度飛槳 & 自然語言處理部攜手推出了12節(jié)NLP精品課,課程中會(huì)介紹到這里的實(shí)踐項(xiàng)目。
課程報(bào)名請(qǐng)戳:
https://aistudio.baidu.com/aistudio/course/introduce/24177
歡迎來課程QQ群(群號(hào):758287592)交流吧~~
詞向量(Word embedding),即把詞語表示成實(shí)數(shù)向量。“好”的詞向量能體現(xiàn)詞語直接的相近關(guān)系。詞向量已經(jīng)被證明可以提高NLP任務(wù)的性能,例如語法分析和情感分析。
圖1:詞向量示意圖PaddleNLP已預(yù)置多個(gè)公開的預(yù)訓(xùn)練Embedding,您可以通過使用paddlenlp.embeddings.TokenEmbedding接口加載預(yù)訓(xùn)練Embedding,從而提升訓(xùn)練效果。
接下來將依次介紹paddlenlp.embeddings.TokenEmbedding,展示詞與詞之間的語義距離,并結(jié)合詞袋模型獲取句子的語義表示。
本次課程項(xiàng)目鏈接:
https://aistudio.baidu.com/aistudio/projectdetail/1535355
!pip?install?--upgrade?paddlenlp?-i?https://pypi.org/simple加載WordEmbedding
TokenEmbedding()參數(shù)
embedding_name 將模型名稱以參數(shù)形式傳入TokenEmbedding,加載對(duì)應(yīng)的模型。默認(rèn)為w2v.baidu_encyclopedia.target.word-word.dim300的詞向量。
unknown_token 未知token的表示,默認(rèn)為[UNK]。
unknown_token_vector 未知token的向量表示,默認(rèn)生成和embedding維數(shù)一致,數(shù)值均值為0的正態(tài)分布向量。
extended_vocab_path 擴(kuò)展詞匯列表文件路徑,詞表格式為一行一個(gè)詞。如引入擴(kuò)展詞匯列表,trainable=True。
trainable Embedding層是否可被訓(xùn)練。True表示Embedding可以更新參數(shù),False為不可更新。默認(rèn)為True。
1.1 認(rèn)識(shí)一下Embedding
TokenEmbedding.search獲得指定詞匯的詞向量。
test_token_embedding?=?token_embedding.search("中國(guó)") print(test_token_embedding)[[?0.260801??0.1047????0.129453?-0.257317?-0.16152???0.19567??-0.0748680.361168??0.245882?-0.219141?-0.388083??0.235189??0.029316??0.154215 ……0.289043?-0.284084??0.205076??0.059885??0.055871??0.159309??0.0621810.123634??0.282932??0.140399?-0.076253?-0.087103??0.07262?]]TokenEmbedding.cosine_sim計(jì)算詞向量間余弦相似度,語義相近的詞語余弦相似度更高,說明預(yù)訓(xùn)練好的詞向量空間有很好的語義表示能力。
score1?=?token_embedding.cosine_sim("女孩",?"女人") score2?=?token_embedding.cosine_sim("女孩",?"書籍") print('score1:',?score1) print('score2:',?score2) score1:?0.7017183 score2:?0.191898961.2 詞向量映射到低維空間
使用深度學(xué)習(xí)可視化工具VisualDL的High Dimensional組件可以對(duì)embedding結(jié)果進(jìn)行可視化展示,便于對(duì)其直觀分析,步驟如下:
由于AI Studio當(dāng)前支持的是VisualDL 2.1版本,因此需要升級(jí)到2.2版本體驗(yàn)最新的數(shù)據(jù)降維功能
創(chuàng)建LogWriter并將記錄詞向量
點(diǎn)擊左側(cè)面板中的可視化tab,選擇‘hidi’作為文件并啟動(dòng)VisualDL可視化
啟動(dòng)VisualDL查看詞向量降維效果
啟動(dòng)步驟:
切換到「可視化」指定可視化日志
日志文件選擇 'hidi'
點(diǎn)擊「啟動(dòng)VisualDL」后點(diǎn)擊「打開VisualDL」,選擇「高維數(shù)據(jù)映射」,即可查看詞表中前1000詞UMAP方法下映射到三維空間的可視化結(jié)果:
可以看出,語義相近的詞在詞向量空間中聚集(如數(shù)字、章節(jié)等),說明預(yù)訓(xùn)練好的詞向量有很好的文本表示能力。
使用VisualDL除可視化embedding結(jié)果外,還可以對(duì)標(biāo)量、圖片、音頻等進(jìn)行可視化,有效提升訓(xùn)練調(diào)參效率。關(guān)于VisualDL更多功能和詳細(xì)介紹,可參考VisualDL使用文檔。
基于TokenEmbedding
衡量句子語義相似度
在許多實(shí)際應(yīng)用場(chǎng)景(如文檔檢索系統(tǒng))中, 需要衡量?jī)蓚€(gè)句子的語義相似程度。此時(shí)我們可以使用詞袋模型(Bag of Words,簡(jiǎn)稱BoW)計(jì)算句子的語義向量。
首先,將兩個(gè)句子分別進(jìn)行切詞,并在TokenEmbedding中查找相應(yīng)的單詞詞向量(word embdding)。
然后,根據(jù)詞袋模型,將句子的word embedding疊加作為句子向量(sentence embedding)。
最后,計(jì)算兩個(gè)句子向量的余弦相似度。
2.1 基于TokenEmbedding的詞袋模型
使用BoWEncoder搭建一個(gè)BoW模型用于計(jì)算句子語義。
paddlenlp.TokenEmbedding組建word-embedding層
paddlenlp.seq2vec.BoWEncoder組建句子建模層
2.2 構(gòu)造Tokenizer
使用TokenEmbedding詞表構(gòu)造Tokenizer。
from?data?import?Tokenizertokenizer?=?Tokenizer() tokenizer.set_vocab(token_embedding.vocab)2.3 相似句對(duì)數(shù)據(jù)讀取
以提供的樣例數(shù)據(jù)text_pair.txt為例,該數(shù)據(jù)文件每行包含兩個(gè)句子。
2.4 查看相似語句相關(guān)度
for?text_a,?text_b_list?in?text_pairs.items():text_a_ids?=?paddle.to_tensor([tokenizer.text_to_ids(text_a)])for?text_b?in?text_b_list:text_b_ids?=?paddle.to_tensor([tokenizer.text_to_ids(text_b)])print("text_a:?{}".format(text_a))print("text_b:?{}".format(text_b))print("cosine_sim:?{}".format(model.get_cos_sim(text_a_ids,?text_b_ids).numpy()[0]))print() text_a:?多項(xiàng)式矩陣左共軛積對(duì)偶Sylvester共軛和數(shù)學(xué)算子完備參數(shù)解 text_b:?多項(xiàng)式矩陣的左共軛積及其應(yīng)用 cosine_sim:?0.8861939311027527text_a:?多項(xiàng)式矩陣左共軛積對(duì)偶Sylvester共軛和數(shù)學(xué)算子完備參數(shù)解 text_b:?退化阻尼對(duì)高維可壓縮歐拉方程組經(jīng)典解的影響 cosine_sim:?0.79758417606353762.5?使用VisualDL查看句子向量
#?引入VisualDL的LogWriter記錄日志import?numpy?as?npfrom?visualdl?import?LogWriter????#?獲取句子以及其對(duì)應(yīng)的向量 label_list?=?[] embedding_list?=?[] for?text_a,?text_b_list?in?text_pairs.items():text_a_ids?=?paddle.to_tensor([tokenizer.text_to_ids(text_a)])embedding_list.append(model(text_a_ids).numpy())label_list.append(text_a)for?text_b?in?text_b_list:text_b_ids?=?paddle.to_tensor([tokenizer.text_to_ids(text_b)])embedding_list.append(model(text_b_ids).numpy())label_list.append(text_b)embedding_list?=?np.concatenate(embedding_list,?axis=0)with?LogWriter(logdir='./hidi')?as?writer:writer.add_embeddings(tag='test',?mat=[i?for?i?in?embedding_list],?metadata=label_list)2.6 啟動(dòng)VisualDL觀察句子向量降維效果
步驟如上述觀察詞向量降維效果一樣。
可以看出,語義相近的句子在句子向量空間中聚集(如有關(guān)課堂的句子、有關(guān)化學(xué)描述句子等)。
動(dòng)手試一試
看完上面的詳細(xì)教程,是不是也想動(dòng)手體驗(yàn)一下呀。小編也強(qiáng)烈建議初學(xué)者參考上面的代碼親手敲一遍,因?yàn)橹挥羞@樣才能加深你對(duì)代碼的理解呦!
本次課程對(duì)應(yīng)的代碼:
https://aistudio.baidu.com/aistudio/projectdetail/1535355
除此之外,還可以更換一下TokenEmbedding預(yù)訓(xùn)練模型,使用VisualDL查看相應(yīng)的TokenEmbedding可視化效果,并嘗試使用更換后的TokenEmbedding計(jì)算句對(duì)語義相似度,進(jìn)一步加深理解哈!
加入交流群,一起學(xué)習(xí)吧
如果你在學(xué)習(xí)過程中遇到任何問題或疑問,歡迎加入PaddleNLP的QQ技術(shù)交流群!
關(guān)于PaddleNLP更多預(yù)訓(xùn)練詞向量
PaddleNLP提供61種可直接加載的預(yù)訓(xùn)練詞向量,訓(xùn)練自多領(lǐng)域中英文語料、如百度百科、新聞?wù)Z料、微博等,覆蓋多種經(jīng)典詞向量模型(word2vec、glove、fastText)、涵蓋不同維度、不同語料庫(kù)大小,詳情請(qǐng)參考:
https://github.com/PaddlePaddle/PaddleNLP/blob/develop/docs/model_zoo/embeddings.md
更多PaddleNLP信息,歡迎訪問GitHub點(diǎn)star后體驗(yàn):
https://github.com/PaddlePaddle/PaddleNLP/
飛槳(PaddlePaddle)以百度多年的深度學(xué)習(xí)技術(shù)研究和業(yè)務(wù)應(yīng)用為基礎(chǔ),集深度學(xué)習(xí)核心訓(xùn)練和推理框架、基礎(chǔ)模型庫(kù)、端到端開發(fā)套件和豐富的工具組件于一體,是中國(guó)首個(gè)自主研發(fā)、功能完備、開源開放的產(chǎn)業(yè)級(jí)深度學(xué)習(xí)平臺(tái)。飛槳企業(yè)版針對(duì)企業(yè)級(jí)需求增強(qiáng)了相應(yīng)特性,包含零門檻AI開發(fā)平臺(tái)EasyDL和全功能AI開發(fā)平臺(tái)BML。EasyDL主要面向中小企業(yè),提供零門檻、預(yù)置豐富網(wǎng)絡(luò)和模型、便捷高效的開發(fā)平臺(tái);BML是為大型企業(yè)提供的功能全面、可靈活定制和被深度集成的開發(fā)平臺(tái)。
END
總結(jié)
以上是生活随笔為你收集整理的越学越有趣:『手把手带你学NLP』系列项目01 ——词向量应用的那些事儿的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 图片热点区域,Andro
- 下一篇: cpp enum enum class