Distributional Similarity in NLP(分布式相似性)
分布式相似性(Distributional Similarity) 是自然语言处理(NLP)中的核心概念,基于“相似的单词出现在相似的上下文中”这一假设。它用于衡量单词之间的相似性,广泛应用于词向量、信息检索、文本分类等任务。
1. 分布式假设(Distributional Hypothesis)
分布式相似性基于以下假设:
“You shall know a word by the company it keeps.”
—— J. R. Firth (1957)
即,两个单词如果经常出现在相似的上下文中,那么它们的语义相似。
例如:
- “猫” 和 “狗” 经常出现在 “宠物”、“喜欢吃”、“可爱”等词的上下文中,因此它们的意义接近。
- “汽车” 和 “自行车” 都出现在 “交通工具”、“驾驶”、“速度” 等上下文中,因此它们可能具有相似性。
2. 计算分布式相似性的方法
2.1 共现矩阵(Co-occurrence Matrix)
最基础的分布式相似性计算方法是共现矩阵:
- 统计一个词与不同词的共现次数,形成一个词-词矩阵。
- 每个单词的向量由其共现次数构成。
示例:
词 | 猫 | 狗 | 汽车 | 自行车 | 可爱 | 速度 |
---|---|---|---|---|---|---|
猫 | 5 | 3 | 0 | 0 | 10 | 0 |
狗 | 3 | 5 | 0 | 0 | 8 | 0 |
汽车 | 0 | 0 | 6 | 4 | 0 | 10 |
自行车 | 0 | 0 | 4 | 6 | 0 | 9 |
问题:
- 稀疏性:矩阵可能非常大,大量词对没有共现。
- 维度灾难:单词的维度取决于整个词汇表大小,计算开销大。
2.2 词向量(Word Embeddings)
为了解决稀疏性问题,使用低维向量表示单词:
- 基于共现矩阵的降维方法
- PCA(主成分分析)
- SVD(奇异值分解)
- PPMI(正点互信息)
- 预测式方法(Neural-based Models)
- Word2Vec(CBOW & Skip-Gram)
- GloVe(基于矩阵分解)
- FastText(子词信息)
- BERT & Transformer Embeddings(上下文相关词向量)
示例:
from gensim.models import Word2Vec# 训练 Word2Vec
sentences = [["猫", "喜欢", "鱼"], ["狗", "喜欢", "骨头"], ["汽车", "行驶", "速度", "快"]]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, sg=0)# 获取 "猫" 的词向量
vector = model.wv["猫"]
print(vector)
3. 计算词相似性的方法
3.1 余弦相似度(Cosine Similarity)
余弦相似度衡量两个词向量的夹角:
-
sim ( A , B ) = A ⋅ B ∥ A ∥ ∥ B ∥ \text{sim}(A, B) = \frac{A \cdot B}{\|A\| \|B\|} sim(A,B)=∥A∥∥B∥A⋅B
结果范围:[][-1,1][−1,1]
-
1 表示完全相似,0 表示不相关,-1 表示完全相反
3.2 欧几里得距离(Euclidean Distance)
d ( A , B ) = ∑ ( A i − B i ) 2 d(A, B) = \sqrt{\sum (A_i - B_i)^2} d(A,B)=∑(Ai−Bi)2
- 距离越小,词的相似度越高。
- 适用于低维向量。
3.3 Jaccard 相似度
用于离散词袋模型:
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A, B) = \frac{|A \cap B|}{|A \cup B|} J(A,B)=∣A∪B∣∣A∩B∣
- 适用于 n-gram、关键词提取。