使用Python对比两个dataframe列的字符串相似度实现产品匹配
需求实现方案
该需求完全可以实现,Python生态有多种成熟的工具可以完成短文本语义相似度匹配,适配你提到的产品名称模糊匹配场景,以下是两种常用的落地方案:
方案1:编辑距离模糊匹配(轻量无依赖模型)
适合短文本、关键词重合度高的匹配场景,通过计算两个文本的字符重合度打分判断是否匹配,使用fuzzywuzzy库即可实现:
import pandas as pd from fuzzywuzzy import fuzz # 构造示例数据 df1 = pd.DataFrame({ "Product Name": ["Car with batteries", "Headphones Sony"], "Cost": [2, 3] }) df2 = pd.DataFrame({ "Product Name": ["Car batteries", "Headphones Sony"], "Cost": [2, 3] }) # 配置相似度阈值,范围0-100,分数越高匹配要求越严格 SIM_THRESHOLD = 70 # 生成匹配标记列,存储匹配到的df2产品名,无匹配则为缺失值 df1["Matches"] = df1["Product Name"].apply( lambda x: next((prod_name for prod_name in df2["Product Name"] if fuzz.ratio(x, prod_name) >= SIM_THRESHOLD), pd.NA) )
该方案下「Car with batteries」和「Car batteries」的匹配得分约85,超过阈值会被判定为匹配,完全一致的「Headphones Sony」得分100也会正常匹配。
方案2:语义向量匹配(准确率更高)
如果存在字面重合度低但语义一致的匹配需求,可以用轻量预训练语义模型把文本转成语义向量,通过余弦相似度判断匹配程度,使用sentence-transformers库即可实现:
from sentence_transformers import SentenceTransformer, util # 加载轻量英文语义模型 model = SentenceTransformer('all-MiniLM-L6-v2') # 生成两个表产品名的语义向量 emb1 = model.encode(df1["Product Name"].tolist(), convert_to_tensor=True) emb2 = model.encode(df2["Product Name"].tolist(), convert_to_tensor=True) # 计算余弦相似度矩阵 cos_sim_matrix = util.cos_sim(emb1, emb2) # 配置相似度阈值,范围0-1,分数越高匹配要求越严格 SIM_THRESHOLD = 0.7 # 生成匹配标记列 match_result = [] for row in cos_sim_matrix: max_sim_score = row.max().item() if max_sim_score >= SIM_THRESHOLD: match_result.append(df2["Product Name"].iloc[row.argmax().item()]) else: match_result.append(pd.NA) df1["Matches"] = match_result
注意事项
- 两种方案的相似度阈值都可以根据业务的匹配严格程度自行调整,避免漏匹配或者误匹配
- 匹配前可以先对产品名字段做预处理:统一大小写、去除特殊字符、过滤无意义停用词,可进一步提升匹配准确率和效率
内容的提问来源于stack exchange,提问作者PaulCoder
相关产品推荐
相关产品推荐

