(深度学习记录)第N2周:Embeddingbag与Embedding详解

🏡我的环境:

  • 语言环境: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)

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值