如何在PySpark中检测新旧表两列文本的相似度?
检测中文文本相似度的实用方法
先还原你的对比数据:
| product_id | old_category | new_category |
|---|---|---|
| 001 | 金属废料 | 金属部件 |
| 002 | 汽车零件 | 汽车构件 |
| 003 | 塑料挡泥板 | 挡泥板 |
针对old_category和new_category的文本相似度检测,有以下几种直接可行的方案:
1. 基础字符串匹配算法
这类方法无需分词,直接基于字符层面计算相似度:
- 编辑距离(Levenshtein Distance):统计两个字符串通过插入、删除、替换字符变为彼此所需的最少操作次数,数值越小,文本越相似。比如"金属废料"和"金属部件"的编辑距离为2,"塑料挡泥板"和"挡泥板"的编辑距离为2。
- Jaccard相似度:将字符串拆分为字符集合,计算交集元素数量与并集元素数量的比值,结果范围0-1,越接近1相似度越高。例如"汽车零件"和"汽车构件"的Jaccard相似度为2/5=0.4。
2. 中文分词后计算语义相似度
中文文本先分词再计算,能更准确反映语义层面的相似性:
- 余弦相似度:先对文本分词(如用jieba工具),将分词结果转换为词频向量,再计算两个向量的余弦值,值越接近1,语义越相似。比如"塑料挡泥板"分词为["塑料","挡泥板"],"挡泥板"分词为["挡泥板"],两者的余弦相似度会很高。
- TF-IDF加权相似度:在词频向量基础上加入TF-IDF权重,突出重要词汇的影响,适合批量处理大量分类数据。
3. 代码实现示例(Python)
用fuzzywuzzy快速计算字符串相似度
from fuzzywuzzy import fuzz # 全匹配相似度 print(fuzz.ratio("金属废料", "金属部件")) # 输出67 # 部分匹配相似度(适合包含关系的文本) print(fuzz.partial_ratio("塑料挡泥板", "挡泥板")) # 输出100
用jieba+sklearn计算分词后的余弦相似度
import jieba from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity def get_cosine_similarity(text_a, text_b): # 中文分词 seg_a = " ".join(jieba.lcut(text_a)) seg_b = " ".join(jieba.lcut(text_b)) # 生成词频矩阵 vectorizer = CountVectorizer() freq_matrix = vectorizer.fit_transform([seg_a, seg_b]) # 计算余弦相似度 return cosine_similarity(freq_matrix)[0][1] # 示例计算 print(get_cosine_similarity("汽车零件", "汽车构件")) # 输出约0.577
内容的提问来源于stack exchange,提问作者Marcos Dias
相关产品推荐
相关产品推荐

