9.7-一定要开始学了
詞向量
one-hot表示
每個詞表示為一個長向量。這個向量的維度就是詞表大小,向量中只有一個維度的值為1,其余維度為0
不能展示詞與詞之間的關系,且特征空間非常大。
分布式表示
word embedding。詞向量
表示成一個定長的連續的稠密向量。
分布式表示優點:
(1)詞之間存在相似關系:是詞之間存在“距離”概念
(2)包含更多的信息,每一維都有特定的含義。
word2vec
預訓練詞向量
加載TokenEmbedding
tokenEmbedding()參數
embedding_name 模型名稱以參數形式傳入TokenEmbeddings
w2v.baidu_encyclopedia.target.word-word.dim300的詞向量
unknow_token 未知token的表示,默認為[UNK]
unknown_token_vector 未知token的向量表示,默認生成和embedding維數一致,數值均值為0的正態分布向量
extended_vocab_path 擴展詞匯列表文件路幾個,詞表格式一行一個詞。
trainable embedding曾是否可悲訓練
默認為TRUE
認識embedding
TokenEmbedding.search() 獲得指定詞匯的詞向量
test_token_embedding = token_embedding.search("中國") print(test_token_embedding)
TokenEmbedding.cosine_sim() 計算詞向量間余弦相似度,語義相近的詞語余弦相似度更高,說明預訓練好的詞向量空間有很好的語義表示能力。
score1 有更好的相似性
詞向量映射到低微空間
# 獲取詞表中前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 LogWriter with LogWriter(logdir = './token_hidi') as writer:writer.add_embedding(tag='test',mat=[i for i in test_token_embedding],matadata= labels)基于TokenEmbedding衡量句子語義相似度
詞袋模型(Bag of Words,簡稱BoW)計算語義向量
首先,將兩個句子分別進行切詞,并在TokenEmbedding中查找相應的單詞詞向量(word embdding)。
然后,根據詞袋模型,將句子的word embedding疊加作為句子向量(sentence embedding)。
最后,計算兩個句子向量的余弦相似度。
基于TokenEmbedding的詞袋模型
使用BoWEncoder 搭建一個BoW模型用于計算句子語義。
paddlenlp.TokenEmbedding 組建word-embedding層
paddlenlp.seq2vec.BoWEncoder 組建句子建模層
構造Tokenizer
使用tokenEmbedding詞表構造Tokenizer
from data import Tokenizer tokenizer = Tokenizer() toenizer.set_vocab(vocab=token_embedding.vocab)相似句對數據讀取
以提供的樣例數據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)查看相似語句相關度
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()使用VisualDL查看句子向量
# 引入VisualDL的LogWriter記錄日志 import numpy as np from 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).flatten().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).flatten().numpy())label_list.append(text_b)with LogWriter(logdir='./sentence_hidi') as writer:writer.add_embeddings(tag='test', mat=embedding_list, metadata=label_list)總結
以上是生活随笔為你收集整理的9.7-一定要开始学了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线上的观众朋友们好,这里是最劲最有料的华
- 下一篇: 视频监控系统中流媒体服务器的主要功能,流