Word2Vec模型详解:CBOW与Skip-gram

Word2Vec模型详解:CBOW与Skip-gram

目录

  1. 模型概述
  2. 理论基础
  3. CBOW模型详解
  4. Skip-gram模型详解
  5. 模型对比
  6. 代码实现详解
  7. 训练过程分析
  8. 应用场景
  9. 实验结果
  10. 总结

模型概述

Word2Vec是一种用于生成词向量的神经网络模型,由Google在2013年提出。它包含两种主要架构:

  • CBOW (Continuous Bag of Words): 根据上下文词汇预测目标词
  • Skip-gram: 根据目标词预测上下文词汇

这两种模型都能将词汇转换为高维密集向量,使得语义相近的词在向量空间中距离较近。

理论基础

基本假设

Word2Vec基于分布式假设:在相似上下文中出现的词汇具有相似的语义。

核心思想

通过神经网络学习词汇的分布式表示,使得:

  1. 语义相似的词汇在向量空间中距离较近
  2. 词汇间的语义关系通过向量运算体现
  3. 支持词汇类比推理(如:国王-男人+女人=皇后)

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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值