简介:本文深入解析NLP中词向量的核心原理,对比SVD分解与Word2Vec两种技术路径,结合数学推导与代码实践,帮助读者掌握文本表示的关键方法。
词向量(Word Embedding)是将离散的文本符号映射为连续向量空间的技术,其核心价值在于将语义关系转化为几何距离。例如,”king”与”queen”的向量差接近”man”与”woman”的向量差,这种数学表达为机器理解语言提供了基础。
早期NLP采用独热编码(One-Hot Encoding)表示单词,但存在两大缺陷:
Firth在1957年提出的分布式假设指出:”词的语义由其上下文决定”。基于此,Hinton于1986年提出分布式词表示(Distributed Representation),通过共享隐藏层参数压缩维度,使相似词在向量空间聚集。
奇异值分解(SVD)是线性代数中的矩阵分解技术,在NLP中用于从共现矩阵提取低维词向量。
滑动窗口统计:以目标词为中心,统计窗口内单词共现次数
# 示例:构建共现矩阵from collections import defaultdictimport numpy as npcorpus = ["I love natural language processing","Word embeddings are powerful"]window_size = 2co_occurrence = defaultdict(lambda: defaultdict(int))for sentence in corpus:words = sentence.split()for i, word in enumerate(words):for j in range(max(0, i-window_size), min(len(words), i+window_size+1)):if i != j:co_occurrence[word][words[j]] += 1
矩阵对称化处理:将有向共现转为无向共现,增强统计稳定性
权重调整:应用PMI(点互信息)或PPMI(正点互信息)缓解低频词问题:
PPMI(w,c) = max(log2(P(w,c)/(P(w)*P(c))), 0)
对共现矩阵M(m×n)进行SVD分解:
M = UΣV^T
取前k个奇异值对应的列向量,得到词向量矩阵U_k和上下文向量矩阵V_k。实际实现中可使用TruncatedSVD:
from sklearn.decomposition import TruncatedSVD# 将共现字典转为矩阵vocab = list(co_occurrence.keys())word_index = {word: i for i, word in enumerate(vocab)}matrix = np.zeros((len(vocab), len(vocab)))for word1 in co_occurrence:for word2, count in co_occurrence[word1].items():matrix[word_index[word1]][word_index[word2]] = count# SVD降维svd = TruncatedSVD(n_components=50)word_vectors = svd.fit_transform(matrix)
Word2Vec通过神经网络模型直接学习词向量,包含CBOW和Skip-Gram两种架构。
| 特性 | CBOW | Skip-Gram |
|---|---|---|
| 输入输出 | 上下文预测中心词 | 中心词预测上下文 |
| 适用场景 | 小数据集、低频词 | 大数据集、高频词 |
| 计算效率 | 较高(单个中心词预测) | 较低(多个上下文词预测) |
原始Softmax计算量随词汇表大小指数增长,负采样通过以下方式优化:
其中σ为sigmoid函数,P_n为噪声分布
J(θ) = log σ(u_o^T v_c) + ∑_{k=1}^K E_{w_k~P_n}[log σ(-u_k^T v_c)]
from gensim.models import Word2Vecsentences = [["I", "love", "natural", "language", "processing"],["Word", "embeddings", "are", "powerful"]]# 训练Skip-Gram模型model = Word2Vec(sentences,vector_size=100,window=5,min_count=1,sg=1, # 1表示Skip-Gramhs=0, # 使用负采样negative=5,workers=4)# 获取词向量vector = model.wv["processing"]
| 方法 | 典型维度 | 训练速度 | 语义捕捉能力 | 多义性处理 |
|---|---|---|---|---|
| SVD | 300-500 | 慢 | 中等 | 差 |
| Word2Vec | 50-300 | 快 | 强 | 较好 |
| GloVe | 50-300 | 中等 | 强 | 较好 |
本教程系统梳理了词向量技术的演进脉络,从线性代数的SVD分解到神经网络的Word2Vec,为NLP实践者提供了完整的技术图谱。实际应用中需根据数据规模、计算资源和任务需求选择合适方法,并关注预训练模型与领域适配的结合。