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、關鍵詞提取。