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