>- ** 本文为[365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客**
>- ** 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)**
词嵌入是一种用于自然语言处理 (NLP) 的技术,用于将单词表示为数字,以便计算机可以处理它们。通俗的讲就是,一种把文本转为数值输入到计算机中的方法。
上一篇提到的将文本转换为字典序列、one-hot编码就是最早期的词嵌入方法。
Embedding和EmbeddingBag则是PyTorch中的用来处理文本数据中词嵌入(word embedding)的工具,它们将离散的词汇映射到低维的连续向量空间中,使得词汇之间的语义关系能够在向量空间中得到体现。
1. Embedding详解
Embedding是PyTorch中最基本的词嵌入操作,TensorFlow中也有相同的函数,功能是一样。它将每个离散的词汇映射到一个低维的连续向量空间中,并且保持了词汇之间的语义关系。在PyTorch中,Embedding的输入是一个整数张量,每个整数都代表着一个词汇的索引,输出是一个浮点型的张量,每个浮点数都代表着对应词汇的词嵌入向量。
嵌入层使用随机权重初始化,并将学习数据集中所有词的嵌入。它是一个灵活的层,可以以各种方式使用,如:
●它可以用作深度学习模型的一部分,其中嵌入与模型本身一起被学习。
●它可以用于加载训练好的词嵌入模型。
嵌入层被定义为网络的第一个隐藏层。
2. EmbeddingBag详解
EmbeddingBag是在Embedding基础上进一步优化的工具,它可以直接处理不定长的句子,并且可以计算句子中所有词汇的词嵌入向量的均值或总和。在PyTorch中,EmbeddingBag的输入是一个整数张量和一个偏移量张量,每个整数都代表着一个词汇的索引,偏移量则表示句子中每个词汇的位置,输出是一个浮点型的张量,每个浮点数都代表着对应句子的词嵌入向量的均值或总和。
下面是用Embedding、EmbeddingBag测试的案例
import torch
import torch.nn.functional as F
import jieba
import torch.nn as nn
texts = [
'比较直观的编码方式是采用上面提到的字典序列。例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。为了避免这种问题,引入了one-hot编码(也称独热编码)。one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。这样,每个类别之间就是相互独立的,不存在顺序或距离关系。例如,对于三个类别的情况,可以使用如下的one-hot编码']
# 使用结巴分词
tokenized_texts = [list(jieba.cut(text)) for text in texts]
# 构建词汇表
word_index = {}
index_word = {}
# 枚举分词结果,将序列填入索引
for i, word in enumerate(set([word for text in tokenized_texts for word in text])):
word_index[word] = i
index_word[i] = word
# 将文本转化为整数序列
sequences = [[word_index[word] for word in text] for text in tokenized_texts]
# 获取词汇表大小
vocab_size = len(word_index)
# 将整数序列转化为one-hot编码
one_hot_results = torch.zeros(len(texts), vocab_size)
for i, seq in enumerate(sequences):
one_hot_results[i, seq] = 1
print("词汇表:")
print(word_index)
print("\n 文本:")
print(texts)
print("\n 分词结果:")
print(tokenized_texts)
print("\n 文本序列:")
print(sequences)
print("\n One-hot 编码:")
print(one_hot_results)
##############Embedding 转换词嵌入量########################
embedding_dim = 4 # 迁入向量的维度
embedding = nn.Embedding(vocab_size, embedding_dim)
input_sequence1 = torch.tensor(sequences, dtype=torch.long)
embedding_sequence1 = embedding(input_sequence1)
print("\n embedding 编码:")
print(embedding_sequence1)
######################################
##############EmbeddingBag 转换词嵌入量########################
embedding_dim = 4 # 迁入向量的维度
embedding_bag = nn.EmbeddingBag(vocab_size, embedding_dim, mode='mean')
input_sequence2 = torch.tensor(sequences, dtype=torch.long)
embedding_sequence1 = embedding_bag(input_sequence2)
print("\n embedding 编码:")
print(embedding_sequence1)
######################################