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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:36:05