一、Word2Vec的核心理念
Word2Vec由Google团队于2013年提出,是一种通过无监督学习生成词向量的模型。其核心思想是 "相似的词拥有相似的上下文" ,通过上下文关系捕捉词汇的语义和语法特征。生成的向量具有低维(通常100-300维)、连续且稠密的特点,解决了传统One-Hot编码的高维稀疏和语义缺失问题。
二、向量化的核心步骤(以Skip-Gram模型为例)
示例句子
假设句子为:"The quick brown fox jumps over the lazy dog."
步骤1:分词与构建词汇表
- 分词结果:["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
- 词汇表(去除重复词):{"The":0, "quick":1, "brown":2, "fox":3, "jumps":4, "over":5, "lazy":6, "dog":7}
作用:将文本转化为可处理的离散符号,为后续向量化提供基础。
步骤2:定义上下文窗口
- 设定窗口大小(window=2),即中心词前后各取2个词作为上下文。
- 示例:中心词为"brown"时,上下文词为["The", "quick", "fox", "jumps"]
作用:限定模型学习的局部语境范围,平衡语义关联与计算复杂度。
步骤3:生成训练样本
- 输入-输出对 :
- ("brown" → "The"), ("brown" → "quick"), ("brown" → "fox"), ("brown" → "jumps")
- 类似地为其他词生成样本。
作用:将文本转化为监督学习任务,目标是让模型通过中心词预测上下文词。
步骤4:构建神经网络
-
输入层:中心词的One-Hot编码
- 词汇表大小V=8,"brown"的One-Hot向量为:[0,0,1,0,0,0,0,0]
-
隐藏层:权重矩阵W(维度V×N,N为向量维度,假设N=3)
-
输入向量与W相乘得到隐藏层向量: h = W T ⋅ x h = W^T \cdot x h=WT⋅x
-
例如:若W的某行为[0.1, -0.2, 0.3],则h=[0.1, -0.2, 0.3]
-
-
输出层:权重矩阵W'(维度N×V)
- 计算上下文词的概率分布: p = softmax ( W ′ T ⋅ h ) p = \text{softmax}(W'^T \cdot h) p=softmax(W′T⋅h)
作用:通过矩阵运算将高维One-Hot编码压缩为低维稠密向量,并学习词与上下文的关系。
步骤5:训练与优化
- 损失函数:交叉熵损失,衡量预测概率与真实分布的差异。
- 反向传播:通过梯度下降调整W和W'的参数,使预测更准确。
- 优化方法 :
- 层次Softmax:通过哈夫曼树编码减少计算复杂度(从O(V)降到O(logV))。
- 负采样:随机选取非上下文词作为负样本,加速训练。
作用:通过迭代优化,使语义相近的词在向量空间中距离更近(如"fox"和"dog"的向量余弦相似度较高)。
步骤6:获取词向量
- 最终输出 :权重矩阵W的每一行对应一个词的向量。
- 例如:"fox"的向量为W的第3行,可能是[0.4, -0.1, 0.2]
三、从词向量到句子向量
词向量生成后,需组合成句子向量。常用方法包括:
-
平均池化(Average Pooling)
- 将句子中所有词向量取算术平均。
- 示例:句子"The quick brown fox"的向量 = (vec(The)+vec(quick)+vec(brown)+vec(fox))/4
- 优点 :简单高效;缺点:忽略词序和权重差异。
-
TF-IDF加权平均
-
计算每个词的TF-IDF值作为权重,加权求和。
-
公式: Sentence Vector = ∑ i = 1 n ( TF-IDF ( w i ) ⋅ vec ( w i ) ) \text{Sentence Vector} = \sum_{i=1}^n (\text{TF-IDF}(w_i) \cdot \text{vec}(w_i)) Sentence Vector=i=1∑n(TF-IDF(wi)⋅vec(wi))
-
优点:突出关键词的贡献。
-
-
深度学习组合
- 使用RNN、LSTM等模型捕捉词序信息,生成更复杂的句子表示。
四、示例完整流程
假设训练后的词向量如下:
- "The": [0.1, 0.2, 0.3]
- "quick": [0.4, -0.1, 0.5]
- "brown": [0.2, 0.3, -0.2]
- "fox": [0.5, 0.0, 0.1]
句子向量计算(平均池化) :
Sentence Vector = [ 0.1 + 0.4 + 0.2 + 0.5 , 0.2 + ( − 0.1 ) + 0.3 + 0.0 , 0.3 + 0.5 + ( − 0.2 ) + 0.1 ] 4 = [ 0.3 , 0.1 , 0.175 ] \text{Sentence Vector} = \frac{[0.1+0.4+0.2+0.5, 0.2+(-0.1)+0.3+0.0, 0.3+0.5+(-0.2)+0.1]}{4} = [0.3, 0.1, 0.175] Sentence Vector=4[0.1+0.4+0.2+0.5,0.2+(−0.1)+0.3+0.0,0.3+0.5+(−0.2)+0.1]=[0.3,0.1,0.175]
五、Word2Vec的优缺点
优点 | 缺点 |
---|---|
低维稠密,避免维度灾难 | 无法处理未登录词(OOV) |
捕捉语义相似性(如"king"-"queen"≈"man"-"woman") | 忽略词序和全局语境(需依赖后续模型) |
训练效率高(通过负采样优化) | 句子向量过于简单(需结合其他方法) |
六、应用场景
- 语义搜索:将查询词和文档转为向量,计算相似度。
- 推荐系统:通过用户行为生成向量,推荐相似商品。
- 文本分类:将句子向量输入分类器(如SVM)。
七、代码示例(使用Gensim库)
python
from gensim.models import Word2Vec
# 训练数据
sentences = [["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]]
# 训练模型(Skip-Gram架构)
model = Word2Vec(sentences, vector_size=100, window=2, sg=1, min_count=1)
# 获取词向量
vector_fox = model.wv["fox"]
# 计算句子向量(平均池化)
sentence_vector = sum(model.wv[word] for word in sentences[0]) / len(sentences[0])
总结
Word2Vec通过局部上下文关系将词映射为低维向量,再通过池化或加权生成句子表示。尽管存在局限性,但其高效性和语义捕捉能力使其成为NLP的基础工具之一。后续模型如BERT、ELMo在此基础上引入更深层的语境建模,进一步提升了语义表示能力。