每个词表示为一个长向量。这个向量的维度就是词表大小,向量中只有一个维度的值为1,其余维度为0
不能展示词与词之间的关系,且特征空间非常大。
word embedding。词向量
表示成一个定长的连续的稠密向量。
分布式表示优点:
(1)词之间存在相似关系:是词之间存在“距离”概念
(2)包含更多的信息,每一维都有特定的含义。


加载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
from paddlenlp.embeddings import TokenEmbedding
# # 初始化TokenEmbedding, 预训练embedding未下载时会自动下载并加载数据
token_embedding = tokenEmbedding(embedding_name="w2v.baidu_encyclopedia.target.word-word.dim300)
# 查看token_embedding详情
print(token_embedding)

TokenEmbedding.search() 获得指定词汇的词向量
test_token_embedding = token_embedding.search("中国")
print(test_token_embedding)

TokenEmbedding.cosine_sim() 计算词向量间余弦相似度,语义相近的词语余弦相似度更高,说明预训练好的词向量空间有很好的语义表示能力。
score1 = token_embedding.cosine_sim("女孩","女人")
score2 = token_embedding.cosine_sim("女孩","书籍")
print('score1:',score1)
print('score2:',score2)

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)
词袋模型(Bag of Words,简称BoW)计算语义向量
首先,将两个句子分别进行切词,并在TokenEmbedding中查找相应的单词词向量(word embdding)。
然后,根据词袋模型,将句子的word embedding叠加作为句子向量(sentence embedding)。
最后,计算两个句子向量的余弦相似度。
使用BoWEncoder 搭建一个BoW模型用于计算句子语义。
paddlenlp.TokenEmbedding 组建word-embedding层
paddlenlp.seq2vec.BoWEncoder 组建句子建模层
import paddle
import paddle.nn as nn
import paddlenlp
class BoWModel(nn.Layer):
def __init__(self,embedder):
super().init_()
self.embedder = embedder
em_dim = self.embedder.embedding_dim
self.encoder = paddlenlp.seq2vec.BoWEncoder(eb_dim)
self.cos_sim_func = nn.CosineDimilarity(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_sim
def forward(self,text):
embedded_text = self.embedder(text)
summed = self.encoder(embedded_text)
return summed
model = BoWModel(embedder = token_embedding)
使用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的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)