日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

​越学越有趣:『手把手带你学NLP』系列项目01 ——词向量应用的那些事儿

發布時間:2023/12/8 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ​越学越有趣:『手把手带你学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。

from?paddlenlp.embeddings?import?TokenEmbedding#?初始化TokenEmbedding,?預訓練embedding未下載時會自動下載并加載數據 token_embedding?=?TokenEmbedding(embedding_name="w2v.baidu_encyclopedia.target.word-word.dim300")#?查看token_embedding詳情 print(token_embedding)Parameter?containing: Tensor(shape=[635965,?300],?dtype=float32,?place=CUDAPlace(0),?stop_gradient=False,[[-0.24200200,??0.13931701,??0.07378800,?...,??0.14103900,??0.05592300,?-0.08004800],[-0.08671700,??0.07770800,??0.09515300,?...,??0.11196400,??0.03082200,?-0.12893000],[-0.11436500,??0.12201900,??0.02833000,?...,??0.11068700,??0.03607300,?-0.13763499],...,[?0.02628800,?-0.00008300,?-0.00393500,?...,??0.00654000,??0.00024600,?-0.00662600],[?0.00274005,??0.02501113,??0.03349263,?...,??0.04212213,?-0.00800593,?-0.00184806],[?0.????????,??0.????????,??0.????????,?...,??0.????????,??0.????????,??0.????????]])

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.19189896

1.2 詞向量映射到低維空間

使用深度學習可視化工具VisualDL的High Dimensional組件可以對embedding結果進行可視化展示,便于對其直觀分析,步驟如下:

  • 由于AI Studio當前支持的是VisualDL 2.1版本,因此需要升級到2.2版本體驗最新的數據降維功能

  • 創建LogWriter并將記錄詞向量

  • 點擊左側面板中的可視化tab,選擇‘hidi’作為文件并啟動VisualDL可視化

  • !pip?install?--upgrade?visualdl #?獲取詞表中前1000個單詞 labels?=?token_embedding.vocab.to_tokens(list(range(0,?1000))) #?取出這1000個單詞對應的Embedding test_token_embedding?=?token_embedding.search(labels)#?引入VisualDL的LogWriter記錄日志 from?visualdl?import?LogWriterwith?LogWriter(logdir='./hidi')?as?writer:#writer.add_embeddings(tag='test',?mat=test_token_embedding,?metadata=labels)writer.add_embeddings(tag='test',?mat=[i?for?i?in?test_token_embedding],?metadata=labels)

    啟動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組建句子建模層

    import?paddleimport?paddle.nn?as?nnimport?paddlenlpclass?BoWModel(nn.Layer):def?__init__(self,?embedder):super().__init__()self.embedder?=?embedderemb_dim?=?self.embedder.embedding_dimself.encoder?=?paddlenlp.seq2vec.BoWEncoder(emb_dim)self.cos_sim_func?=?nn.CosineSimilarity(axis=-1)def?get_cos_sim(self,?text_a,?text_b):text_a_embedding?=?self.forward(text_a)text_b_embedding?=?self.forward(text_b)cos_sim?=?self.cos_sim_func(text_a_embedding,?text_b_embedding)return?cos_simdef?forward(self,?text):#?Shape:?(batch_size,?num_tokens,?embedding_dim)embedded_text?=?self.embedder(text)#?Shape:?(batch_size,?embedding_dim)summed?=?self.encoder(embedded_text)return?summed model?=?BoWModel(embedder=token_embedding)

    2.2 構造Tokenizer

    使用TokenEmbedding詞表構造Tokenizer。

    from?data?import?Tokenizertokenizer?=?Tokenizer() tokenizer.set_vocab(token_embedding.vocab)

    2.3 相似句對數據讀取

    以提供的樣例數據text_pair.txt為例,該數據文件每行包含兩個句子。

    text_pairs?=?{}with?open("text_pair.txt",?"r",?encoding="utf8")?as?f:for?line?in?f:text_a,?text_b?=?line.strip().split("\t")if?text_a?not?in?text_pairs:text_pairs[text_a]?=?[]text_pairs[text_a].append(text_b)

    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.7975841760635376

    2.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 ——词向量应用的那些事儿的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。