从词向量到Word2Vec:NLP文本表示的数学之旅

作者:渣渣辉2025.10.16 00:24浏览量:0

简介:本文深入解析NLP中词向量的核心原理,对比SVD分解与Word2Vec两种技术路径,结合数学推导与代码实践,帮助读者掌握文本表示的关键方法。

NLP教程(1) | 词向量、SVD分解与Word2Vec

一、词向量:自然语言处理的基石

词向量(Word Embedding)是将离散的文本符号映射为连续向量空间的技术,其核心价值在于将语义关系转化为几何距离。例如,”king”与”queen”的向量差接近”man”与”woman”的向量差,这种数学表达为机器理解语言提供了基础。

1.1 传统词表示方法的局限

早期NLP采用独热编码(One-Hot Encoding)表示单词,但存在两大缺陷:

  • 维度灾难:词汇表10万词时,向量维度达10万维,且99.99%元素为0
  • 语义缺失:任意两个单词的余弦相似度恒为0,无法捕捉语义关联

1.2 分布式假设的理论突破

Firth在1957年提出的分布式假设指出:”词的语义由其上下文决定”。基于此,Hinton于1986年提出分布式词表示(Distributed Representation),通过共享隐藏层参数压缩维度,使相似词在向量空间聚集。

二、SVD分解:基于统计的词向量生成

奇异值分解(SVD)是线性代数中的矩阵分解技术,在NLP中用于从共现矩阵提取低维词向量。

2.1 共现矩阵构建流程

  1. 滑动窗口统计:以目标词为中心,统计窗口内单词共现次数

    1. # 示例:构建共现矩阵
    2. from collections import defaultdict
    3. import numpy as np
    4. corpus = ["I love natural language processing",
    5. "Word embeddings are powerful"]
    6. window_size = 2
    7. co_occurrence = defaultdict(lambda: defaultdict(int))
    8. for sentence in corpus:
    9. words = sentence.split()
    10. for i, word in enumerate(words):
    11. for j in range(max(0, i-window_size), min(len(words), i+window_size+1)):
    12. if i != j:
    13. co_occurrence[word][words[j]] += 1
  2. 矩阵对称化处理:将有向共现转为无向共现,增强统计稳定性

  3. 权重调整:应用PMI(点互信息)或PPMI(正点互信息)缓解低频词问题:

    1. PPMI(w,c) = max(log2(P(w,c)/(P(w)*P(c))), 0)

2.2 SVD分解与降维实现

对共现矩阵M(m×n)进行SVD分解:

  1. M = UΣV^T

取前k个奇异值对应的列向量,得到词向量矩阵U_k和上下文向量矩阵V_k。实际实现中可使用TruncatedSVD:

  1. from sklearn.decomposition import TruncatedSVD
  2. # 将共现字典转为矩阵
  3. vocab = list(co_occurrence.keys())
  4. word_index = {word: i for i, word in enumerate(vocab)}
  5. matrix = np.zeros((len(vocab), len(vocab)))
  6. for word1 in co_occurrence:
  7. for word2, count in co_occurrence[word1].items():
  8. matrix[word_index[word1]][word_index[word2]] = count
  9. # SVD降维
  10. svd = TruncatedSVD(n_components=50)
  11. word_vectors = svd.fit_transform(matrix)

2.3 局限性分析

  • 计算复杂度高:O(n³)时间复杂度难以处理大规模语料
  • 静态词向量:无法处理一词多义现象
  • 稀疏性问题:低频词向量质量差

三、Word2Vec:神经网络驱动的词向量革命

Word2Vec通过神经网络模型直接学习词向量,包含CBOW和Skip-Gram两种架构。

3.1 CBOW与Skip-Gram架构对比

特性 CBOW Skip-Gram
输入输出 上下文预测中心词 中心词预测上下文
适用场景 小数据集、低频词 大数据集、高频词
计算效率 较高(单个中心词预测) 较低(多个上下文词预测)

3.2 负采样优化技术

原始Softmax计算量随词汇表大小指数增长,负采样通过以下方式优化:

  1. 噪声对比估计:将多分类转为二分类问题
  2. 负样本选择:按词频的3/4次方分布采样
  3. 损失函数
    1. J(θ) = log σ(u_o^T v_c) + _{k=1}^K E_{w_k~P_n}[log σ(-u_k^T v_c)]
    其中σ为sigmoid函数,P_n为噪声分布

3.3 Gensim实现示例

  1. from gensim.models import Word2Vec
  2. sentences = [["I", "love", "natural", "language", "processing"],
  3. ["Word", "embeddings", "are", "powerful"]]
  4. # 训练Skip-Gram模型
  5. model = Word2Vec(sentences,
  6. vector_size=100,
  7. window=5,
  8. min_count=1,
  9. sg=1, # 1表示Skip-Gram
  10. hs=0, # 使用负采样
  11. negative=5,
  12. workers=4)
  13. # 获取词向量
  14. vector = model.wv["processing"]

四、技术对比与选型建议

4.1 维度与精度权衡

方法 典型维度 训练速度 语义捕捉能力 多义性处理
SVD 300-500 中等
Word2Vec 50-300 较好
GloVe 50-300 中等 较好

4.2 实际应用建议

  1. 资源受限场景:优先选择预训练词向量(如Google News 300维)
  2. 领域适配需求:使用Gensim/FastText微调领域词向量
  3. 实时性要求高:采用Skip-Gram+负采样组合
  4. 多语言支持:FastText的子词模型可处理未登录词

五、前沿发展方向

  1. 上下文相关词向量BERT、ELMo等模型通过深度网络捕捉动态语义
  2. 低资源语言处理:跨语言词向量对齐技术(如MUSE)
  3. 可解释性研究:通过概率生成模型理解词向量几何结构
  4. 高效训练算法:分布式Word2Vec实现(如Spark NLP)

本教程系统梳理了词向量技术的演进脉络,从线性代数的SVD分解到神经网络的Word2Vec,为NLP实践者提供了完整的技术图谱。实际应用中需根据数据规模、计算资源和任务需求选择合适方法,并关注预训练模型与领域适配的结合。