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的出现带来了多方面影响:
- 语义关系捕捉:能够捕捉词之间的语义和句法关系
- 向量运算:支持词向量的加减运算,如 "国王 - 男人 + 女人 ≈ 王后"
- 迁移学习:预训练的词向量可用于下游任务
- 低维表示:相比One-hot编码大大降低维度(通常为100-300维)
Word2vec的局限性
- 静态表示:每个词只有一个固定表示,无法处理多义词
- 缺乏上下文感知:不考虑词在特定句子中的上下文
- 依赖大规模语料:需要足够的训练数据
- 只学习词级别表示:不能直接表示短语或句子
特性 | CBOW | Skip-gram |
---|---|---|
训练速度 | 更快 | 更慢 |
对稀有词的处理 | 较差 | 较好 |
内存占用 | 较少 | 较多 |
性能(小数据集) | 一般 | 更好 |
语义捕捉 | 一般 | 更精确 |