- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊 | 接辅导、项目定制
🏡我的环境:
- 语言环境:Python3.11.4
- 编译器:Jupyter Notebook
- torcch版本:2.0.1
词嵌入是一种用于自然语言处理 (NLP) 的技术,用于将单词表示为数字,以便计算机可以处理它们。通俗的讲就是,一种把文本转为数值输入到计算机中的方法。
上一篇提到的将文本转换为字典序列、one-hot编码就是最早期的词嵌入方法。
Embedding和EmbeddingBag则是PyTorch中的用来处理文本数据中词嵌入(word embedding)的工具,它们将离散的词汇映射到低维的连续向量空间中,使得词汇之间的语义关系能够在向量空间中得到体现。
1. Embedding详解
Embedding是PyTorch中最基本的词嵌入操作,TensorFlow中也有相同的函数,功能是一样。它将每个离散的词汇映射到一个低维的连续向量空间中,并且保持了词汇之间的语义关系。在PyTorch中,Embedding的输入是一个整数张量,每个整数都代表着一个词汇的索引,输出是一个浮点型的张量,每个浮点数都代表着对应词汇的词嵌入向量。
嵌入层使用随机权重初始化,并将学习数据集中所有词的嵌入。它是一个灵活的层,可以以各种方式使用,如:
·它可以用作深度学习模型的一部分,其中嵌入与模型本身一起被学习。
·它可以用于加载训练好的词嵌入模型。
嵌入层被定义为网络的第一个隐藏层。
2. EmbeddingBag详解
EmbeddingBag是在Embedding基础上进一步优化的工具,它可以直接处理不定长的句子,并且可以计算句子中所有词汇的词嵌入向量的均值或总和。在PyTorch中,EmbeddingBag的输入是一个整数张量和一个偏移量张量,每个整数都代表着一个词汇的索引,偏移量则表示句子中每个词汇的位置,输出是一个浮点型的张量,每个浮点数都代表着对应句子的词嵌入向量的均值或总和。
任务:用Embeddingbag与Embedding完成词嵌入
“比较直观的编码方式是采用上面提到的字典序列。例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。
为了避免这种问题,引入了one-hot编码(也称独热编码)。one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。这样,每个类别之间就是相互独立的,不存在顺序或距离关系。例如,对于三个类别的情况,可以使用如下的one-hot编码:”
使用 EmbeddingBag 和 Embedding 完成词嵌入,首先需要处理文档中的文本,将其转换为适合进行词嵌入的格式,涉及到以下步骤:
文本清洗:移除文档中的特殊字符和标点符号,将文本统一为小写(如果适用)。
分词:将文本分割成单词或标记(tokens)。
建立词汇表:从分词后的文本中创建一个词汇表,每个唯一的单词对应一个索引。
文本向量化:将文本转换为数字形式,以便进行嵌入处理。
from collections import Counter
import torch
import torch.nn as nn
import re
# 清洗文本并进行分词
def tokenize(text):
# 移除特殊字符和标点,并转换为小写
text = re.sub(r'[^\w\s]', '', text).lower()
# 分词
return text.split()
# 创建词汇表
def create_vocab(text_tokens):
vocab = Counter(text_tokens)
vocab = sorted(vocab, key=vocab.get, reverse=True)
vocab_to_int = {word: ii for ii, word in enumerate(vocab, 1)} # 索引从1开始
return vocab_to_int
# 将文本转换为数字形式
def text_to_int(tokens, vocab_to_int):
return [vocab_to_int[word] for word in tokens if word in vocab_to_int]
# 定义Embedding和EmbeddingBag层
def define_embedding_layers(vocab_size, embedding_dim=100):
embedding = nn.Embedding(num_embeddings=vocab_size, embedding_dim=embedding_dim)
embedding_bag = nn.EmbeddingBag(num_embeddings=vocab_size, embedding_dim=embedding_dim, mode='mean')
return embedding, embedding_bag
# 读取文件内容
file_path = '/Users/wendyweng/Downloads/任务文件.txt'
with open(file_path, 'r', encoding='utf-8') as file:
file_content = file.read()
# 文本清洗和分词
tokens = tokenize(file_content)
# 创建词汇表
vocab_to_int = create_vocab(tokens)
# 将文本转换为数字形式
int_text = text_to_int(tokens, vocab_to_int)
# 定义嵌入层参数
embedding_dim = 100
vocab_size = len(vocab_to_int) + 1
# 定义Embedding和EmbeddingBag层
embedding, embedding_bag = define_embedding_layers(vocab_size, embedding_dim)
# 转换为tensor以供嵌入层使用
input_tensor = torch.tensor([int_text], dtype=torch.long)
# 使用Embedding和EmbeddingBag进行词嵌入
embedded = embedding(input_tensor)
embedded_bag = embedding_bag(input_tensor)
# 打印结果
print("Embedding shape:", embedded.shape)
print("EmbeddingBag shape:", embedded_bag.shape)