本文目录导读:

在Python中进行数据相似度计算,根据数据类型(文本、数值、集合、向量等)有多种方法,以下是常用的分类及对应方法:
文本相似度
基于统计的方法
- 余弦相似度 - 向量空间模型,适用于词频/词袋
from sklearn.metrics.pairwise import cosine_similarity from sklearn.feature_extraction.text import CountVectorizer
texts = ['I love Python', 'I love programming'] vectorizer = CountVectorizer() vectors = vectorizer.fit_transform(texts) similarity = cosine_similarity(vectors[0], vectors[1])[0][0]
- **TF-IDF + 余弦相似度** - 加权词频,效果更好
```python
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
vectors = tfidf.fit_transform(texts)
- Jaccard相似度 - 基于集合交集
def jaccard_similarity(str1, str2): set1, set2 = set(str1.split()), set(str2.split()) return len(set1 & set2) / len(set1 | set2)
基于编辑距离的方法
-
Levenshtein距离 - 编辑操作次数
import Levenshtein similarity = 1 - (Levenshtein.distance(s1, s2) / max(len(s1), len(s2)))
-
difflib (标准库) - 序列匹配器
from difflib import SequenceMatcher similarity = SequenceMatcher(None, s1, s2).ratio()
数值向量相似度
常见距离/相似度
import numpy as np from scipy.spatial.distance import euclidean, cosine, cityblock a, b = np.array([1,2,3]), np.array([4,5,6]) # 欧氏距离(越小越相似) euclidean(a, b) # 曼哈顿距离 cityblock(a, b) # 余弦相似度(越大越相似) 1 - cosine(a, b) # 皮尔逊相关系数 from scipy.stats import pearsonr corr, _ = pearsonr(a, b)
集合相似度
- Jaccard - 交集/并集
- Dice系数 - 2*交集/(|A|+|B|)
- Overlap系数 - 交集/较小集合
def dice_similarity(set1, set2):
return 2 * len(set1 & set2) / (len(set1) + len(set2))
高级语义相似度(NLP)
词嵌入方法
# Word2Vec / GloVe / FastText
from gensim.models import KeyedVectors
model = KeyedVectors.load_word2vec_format('path_to_model')
similarity = model.similarity('king', 'queen')
# Sentence Transformers(推荐,效果好)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(['I love Python', 'I enjoy coding'])
similarity = cosine_similarity([embeddings[0]], [embeddings[1]])[0][0]
BERT类模型
from transformers import AutoTokenizer, AutoModel
import torch
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')
# 计算CLS向量或平均池化后计算相似度
结构数据相似度
- 矩阵/表格相似度 - 相关系数矩阵、协方差
- 时间序列相似度 - DTW (Dynamic Time Warping)
from dtaidistance import dtw similarity = dtw.distance(series1, series2) # 越小越相似
内置/第三方库对比
| 方法 | 适用场景 | Python库 |
|---|---|---|
| 余弦相似度 | 文本、向量 | sklearn, scipy |
| Jaccard | 集合、关键词 | 自定义 |
| 编辑距离 | 短文本、字符串 | Levenshtein, difflib |
| 皮尔逊 | 数值序列 | scipy, numpy |
| DTW | 时间序列 | dtaidistance |
| 词嵌入 | 语义相似度 | gensim, sentence-transformers |
选择建议
- 快速简单: difflib (文本) 或 Jaccard (关键词)
- 文本分析: TF-IDF + 余弦相似度
- 语义理解: Sentence-BERT 效果最好
- 数值数据: 皮尔逊或余弦根据需求选择
- 大数据量: 使用 Faiss (Facebook AI Similarity Search) 进行高效索引
需要针对具体数据类型和使用场景的方法吗?