You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark中检测新旧表两列文本的相似度?

检测中文文本相似度的实用方法

先还原你的对比数据:

product_idold_categorynew_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:25:26