Word2Vec模型详解:CBOW与Skip-gram
目录
模型概述
Word2Vec是一种用于生成词向量的神经网络模型,由Google在2013年提出。它包含两种主要架构:
- CBOW (Continuous Bag of Words): 根据上下文词汇预测目标词
- Skip-gram: 根据目标词预测上下文词汇
这两种模型都能将词汇转换为高维密集向量,使得语义相近的词在向量空间中距离较近。
理论基础
基本假设
Word2Vec基于分布式假设:在相似上下文中出现的词汇具有相似的语义。
核心思想
通过神经网络学习词汇的分布式表示,使得:
- 语义相似的词汇在向量空间中距离较近
- 词汇间的语义关系通过向量运算体现
- 支持词汇类比推理(如:国王-男人+女人=皇后)
CBOW模型详解
模型架构
上下文词汇 → 嵌入层 → 平均池化 → 线性层 → 目标词概率
CBOW模型通过上下文词汇的平均嵌入来预测中心词汇。
代码实现
1. 模型定义
# 定义CBOW模型类,继承自PyTorch的神经网络模块
class CBOWModel(nn.Module):
def __init__(self, vocab_size, embedding_dim):
# 调用父类构造函数
super(CBOWModel, self).__init__()
# 创建词嵌入层,将词汇索引映射到密集向量
self.embedding = nn.Embedding(vocab_size, embedding_dim)
# 创建线性层,将嵌入向量映射到词汇表大小的输出
self.linear = nn.Linear(embedding_dim, vocab_size)
def forward(self, context_words):
# 前向传播函数,context_words形状: [batch_size, context_size]
# 获取上下文词汇的嵌入向量
embeds = self.embedding(context_words) # 形状: [batch_size, context_size, embedding_dim]
# 计算上下文词汇嵌入的平均值
mean_embed = torch.mean(embeds, dim=1) # 形状: [batch_size, embedding_dim]
# 通过线性层得到最终输出
out = self.linear(mean_embed) # 形状: [batch_size, vocab_size]
return out
关键特点:
- 单一嵌入层:所有词汇共享同一个嵌入空间
- 平均池化:对上下文词汇嵌入求平均
- 分类任务:输出目标词汇的概率分布
2. 数据集创建
def create_cbow_dataset(corpus, window_size=2):
"""创建CBOW训练数据集"""
# 初始化数据列表
data = []
# 遍历语料库,跳过边界位置
for i in range(window_size, len(corpus) - window_size):
# 初始化上下文词汇列表
context = []
# 当前位置的词汇作为目标词
target = corpus[i]
# 收集目标词周围的上下文词汇
for j in range(i - window_size, i + window_size + 1):
# 跳过目标词本身
if j != i:
# 添加上下文词汇到列表
context.append(corpus[j])
# 将上下文和目标词作为训练样本
data.append((context, target))
# 返回训练数据集
return data
数据格式:每个样本为 ([上下文词汇列表], 目标词)
3. 完形填空功能
def cloze_test(model, sentence, mask_position, word_to_id, id_to_word, window_size=2, top_k=5):
"""完形填空函数"""
# 将句子分割成词汇列表
words = sentence.lower().replace('.', ' .').split()
# 检查mask位置是否有效
if mask_position >= len(words) or mask_position < 0:
print(f"无效的mask位置: {
mask_position}")
return None
# 保存被遮掩的真实词汇
true_word = words[mask_position]
print(

最低0.47元/天 解锁文章
844

被折叠的 条评论
为什么被折叠?



