Python脚本数据相似度计算有哪些方法

wen 实用脚本 2

本文目录导读:

Python脚本数据相似度计算有哪些方法

  1. 文本相似度
  2. 数值向量相似度
  3. 集合相似度
  4. 高级语义相似度(NLP)
  5. 结构数据相似度
  6. 内置/第三方库对比
  7. 选择建议

在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) 进行高效索引

需要针对具体数据类型和使用场景的方法吗?

抱歉,评论功能暂时关闭!