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

from paddlenlp.embeddings import TokenEmbedding

# # 初始化TokenEmbedding, 预训练embedding未下载时会自动下载并加载数据
token_embedding = tokenEmbedding(embedding_name="w2v.baidu_encyclopedia.target.word-word.dim300)

# 查看token_embedding详情
print(token_embedding)

在这里插入图片描述

认识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)
	

基于TokenEmbedding衡量句子语义相似度

词袋模型(Bag of Words,简称BoW)计算语义向量

首先,将两个句子分别进行切词,并在TokenEmbedding中查找相应的单词词向量(word embdding)。

然后,根据词袋模型,将句子的word embedding叠加作为句子向量(sentence embedding)。

最后,计算两个句子向量的余弦相似度。

基于TokenEmbedding的词袋模型

使用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)
构造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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向上Claire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值