logo

从词向量到Word2Vec:NLP中语义表示的数学之旅

作者:问题终结者2025.09.26 18:39浏览量:12

简介:本文深入解析NLP中词向量的核心概念,对比SVD分解与Word2Vec的技术原理,结合数学推导与代码示例,帮助开发者掌握语义表示的关键方法。

一、词向量:NLP的语义基石

词向量(Word Embedding)是将离散的词汇映射为连续向量的技术,是自然语言处理中语义表示的核心工具。其本质是通过数学建模捕捉词汇间的语义关联,例如”king”与”queen”在向量空间中距离相近,而”king”与”apple”距离较远。

1.1 独热编码的局限性

传统方法中,词汇常被表示为独热向量(One-Hot Encoding),如”cat”可能被编码为[1,0,0],”dog”为[0,1,0]。这种表示存在三大缺陷:

  • 高维稀疏性:词汇表大小为N时,向量维度为N,导致计算效率低下
  • 语义缺失:任意两个词汇的余弦相似度均为0,无法体现语义关联
  • 泛化能力差:无法处理未登录词(OOV)问题

1.2 分布式假设的突破

Harris(1954)提出的分布式假设指出:语义相似的词往往出现在相似的上下文中。基于此,词向量通过统计词汇共现关系构建低维稠密向量。例如:

  • “bank”在金融语境中常与”money”、”loan”共现
  • 在地理语境中常与”river”、”stream”共现
    通过捕捉这种共现模式,词向量能自动学习多义词的不同语义。

二、SVD分解:矩阵降维的经典解法

奇异值分解(SVD)是早期构建词向量的主流方法,其核心思想是通过矩阵分解提取共现矩阵的潜在语义特征。

2.1 共现矩阵构建

给定语料库,首先统计窗口大小为k的共现次数。例如对于句子”The cat sat on the mat”,当k=2时:

  • “cat”与”sat”共现1次
  • “cat”与”on”共现1次
  • “the”与”cat”共现2次(左右窗口各1次)

构建的共现矩阵M为词汇表大小×词汇表大小的对称矩阵,元素M[i][j]表示词汇i与j的共现次数。

2.2 SVD分解原理

对共现矩阵M进行SVD分解:
[ M = U \Sigma V^T ]
其中:

  • U和V为正交矩阵,列向量称为奇异向量
  • Σ为对角矩阵,对角线元素为奇异值

取前d个最大奇异值对应的向量,得到降维后的词向量:
[ W = U_d \sqrt{\Sigma_d} ]
[ C = V_d \sqrt{\Sigma_d} ]
其中W为词向量矩阵,C为上下文向量矩阵。

2.3 代码实现示例

  1. import numpy as np
  2. from scipy.linalg import svd
  3. # 示例共现矩阵(实际中需从语料统计)
  4. co_occurrence = np.array([
  5. [10, 2, 3],
  6. [2, 8, 1],
  7. [3, 1, 6]
  8. ])
  9. # SVD分解
  10. U, S, Vt = svd(co_occurrence)
  11. # 取前2维
  12. d = 2
  13. U_d = U[:, :d]
  14. S_d = np.diag(S[:d])
  15. word_vectors = U_d @ np.sqrt(S_d)
  16. print("词向量矩阵:")
  17. print(word_vectors)

2.4 SVD的局限性

尽管SVD能捕捉全局共现信息,但存在三大问题:

  • 计算复杂度高:O(n³)的时间复杂度难以处理大规模语料
  • 存储开销大:需存储整个共现矩阵
  • 无法在线更新:新增数据时需重新计算整个矩阵

三、Word2Vec:神经网络的语义革命

Word2Vec(Mikolov等,2013)通过神经网络模型直接学习词向量,分为CBOW(Continuous Bag-of-Words)和Skip-Gram两种架构。

3.1 CBOW模型原理

CBOW通过上下文预测中心词,其结构如下:

  1. 输入层:将上下文词汇的独热编码相加(或取平均)
  2. 投影层:通过权重矩阵W将输入映射为低维向量
  3. 输出层:通过softmax函数预测中心词概率

损失函数为交叉熵损失:
[ J = -\log p(w_c | \tilde{w}) ]
其中( w_c )为中心词,( \tilde{w} )为上下文。

3.2 Skip-Gram模型原理

Skip-Gram采用相反的策略:用中心词预测上下文词汇。其优势在于:

  • 对罕见词效果更好
  • 能捕捉更细粒度的语义关系

损失函数为:
[ J = -\sum{-k \leq j \leq k, j \neq 0} \log p(w{t+j} | w_t) ]
其中k为窗口大小,( w_t )为中心词。

3.3 优化技巧

Word2Vec通过以下技术提升效率:

  • 层次Softmax:将输出层构建为霍夫曼树,复杂度从O(V)降至O(log V)
  • 负采样:仅更新部分负样本的权重,大幅减少计算量
  • 子采样:高频词以概率p丢弃,平衡常见词与罕见词的学习

3.4 代码实现示例

  1. import gensim
  2. from gensim.models import Word2Vec
  3. # 示例语料(分词后的句子列表)
  4. sentences = [
  5. ["cat", "sat", "on", "mat"],
  6. ["dog", "played", "with", "ball"],
  7. ["cat", "chased", "dog"]
  8. ]
  9. # 训练Word2Vec模型
  10. model = Word2Vec(
  11. sentences=sentences,
  12. vector_size=100, # 向量维度
  13. window=2, # 上下文窗口大小
  14. min_count=1, # 最小词频
  15. workers=4, # 并行线程数
  16. sg=1 # 1为Skip-Gram,0为CBOW
  17. )
  18. # 获取词向量
  19. cat_vector = model.wv["cat"]
  20. print("'cat'的词向量:", cat_vector[:5]) # 打印前5维
  21. # 计算词相似度
  22. similarity = model.wv.similarity("cat", "dog")
  23. print("'cat'与'dog'的相似度:", similarity)

3.5 Word2Vec的优势

相比SVD,Word2Vec具有以下优势:

  • 计算效率高:支持在线学习,可处理大规模语料
  • 语义表示强:能捕捉线性代数关系(如king - man + woman ≈ queen)
  • 应用广泛:作为预训练词向量用于下游任务(如文本分类、机器翻译

四、技术对比与选型建议

特性 SVD分解 Word2Vec
计算复杂度 O(n³) O(n·d·k)
内存消耗 高(需存储共现矩阵) 低(仅需存储词向量)
语义捕捉能力 全局共现关系 局部上下文关系
在线更新能力 ✔️
超参数敏感度 低(主要维度d) 高(窗口、维度、采样)

选型建议

  • 小规模静态语料:SVD分解可获得稳定结果
  • 大规模动态语料:优先选择Word2Vec
  • 需要捕捉线性关系:Word2Vec效果更优
  • 计算资源有限:Word2Vec的负采样版本更高效

五、进阶方向

  1. GloVe模型:结合全局共现统计与局部上下文窗口
  2. FastText:引入子词信息,处理未登录词问题
  3. BERT词嵌入:基于Transformer的上下文相关词表示
  4. 多语言词向量:通过跨语言对齐实现语义空间统一

六、实践建议

  1. 数据预处理:统一大小写、去除停用词、处理词形变化
  2. 超参数调优:向量维度建议50-300,窗口大小根据任务调整
  3. 评估方法:使用词类比任务(如king-man+woman≈queen)验证质量
  4. 可视化分析:通过t-SNE降维观察词向量分布

通过系统掌握词向量技术,开发者能构建更强大的NLP模型,为智能问答、情感分析、机器翻译等应用奠定坚实基础。

相关文章推荐

发表评论

活动