Word2vec

预计学习时间:30分钟

Word2vec 是由Google团队在2013年提出的一种词嵌入方法,通过神经网络学习词的分布式表示,将词映射到低维连续向量空间,使得语义相似的词在向量空间中彼此接近。

Word2vec的核心思想

Word2vec基于分布假说(Distributional Hypothesis):"相似的词出现在相似的上下文中"。其核心思想是:

  • 从大规模文本中学习词的向量表示
  • 通过预测任务隐式地捕捉词之间的语义关系
  • 将One-hot稀疏表示转换为低维密集向量

Word2vec模型架构

Word2vec有两种主要架构:

1. CBOW(Continuous Bag of Words)

  • 任务:根据上下文预测中心词
  • 输入:中心词周围的上下文词
  • 输出:中心词的概率分布

2. Skip-gram

  • 任务:根据中心词预测上下文
  • 输入:中心词
  • 输出:上下文词的概率分布

在实践中,Skip-gram模型对于低频词表现更好,而CBOW训练速度更快。对于大型语料库,Skip-gram通常是首选。

# 使用gensim库实现Word2vec模型
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

# 训练Word2vec模型
def train_word2vec(corpus_file, output_file, vector_size=100, window=5, min_count=5):
    """
    训练Word2vec模型并保存
    
    参数:
    - corpus_file: 语料库文件路径(每行一个分词后的句子)
    - output_file: 模型保存路径
    - vector_size: 词向量维度
    - window: 上下文窗口大小
    - min_count: 词频阈值,频率低于此值的词将被忽略
    """
    # 训练模型(使用Skip-gram架构)
    model = Word2Vec(
        LineSentence(corpus_file),
        vector_size=vector_size,
        window=window,
        min_count=min_count,
        workers=4,        # 使用多线程加速训练
        sg=1,             # sg=1表示使用Skip-gram, sg=0表示使用CBOW
        epochs=5          # 迭代次数
    )
    
    # 保存模型
    model.save(output_file)
    
    return model

# 使用训练好的模型
def use_word2vec_model(model_path, word):
    """获取词向量并展示相似词"""
    model = Word2Vec.load(model_path)
    
    # 获取词向量
    word_vector = model.wv[word]
    
    # 找出最相似的词
    similar_words = model.wv.most_similar(word, topn=10)
    
    return word_vector, similar_words

"Word2vec的出现是表示学习领域的重要突破,它为后续的词嵌入技术奠定了基础。" — Tomas Mikolov

Word2vec的应用和优势

Word2vec的出现带来了多方面影响:

  1. 语义关系捕捉:能够捕捉词之间的语义和句法关系
  2. 向量运算:支持词向量的加减运算,如 "国王 - 男人 + 女人 ≈ 王后"
  3. 迁移学习:预训练的词向量可用于下游任务
  4. 低维表示:相比One-hot编码大大降低维度(通常为100-300维)

Word2vec的局限性

  • 静态表示:每个词只有一个固定表示,无法处理多义词
  • 缺乏上下文感知:不考虑词在特定句子中的上下文
  • 依赖大规模语料:需要足够的训练数据
  • 只学习词级别表示:不能直接表示短语或句子
特性CBOWSkip-gram
训练速度更快更慢
对稀有词的处理较差较好
内存占用较少较多
性能(小数据集)一般更好
语义捕捉一般更精确