基于KNN的企业名称匹配中距离度量及Ratio指标计算问题咨询
企业名称模糊匹配代码相关问题解答
1. Ratio指标的计算逻辑与认知验证
你的认知完全正确:
Ratio指标来自fuzz.token_sort_ratio,确实是fuzzywuzzy包的方法,底层默认基于Levenshtein距离(编辑距离,统计两个字符串互相转换需要的最少增/删/替换字符数)计算。- 它和原始编辑距离的区别是多了两步预处理:先把两个待匹配字符串按空格拆分为独立token,再把token按字典序排序后拼接成新字符串,最终计算两个新字符串的归一化编辑距离,转换成0-100的整数就是
Ratio值。
这个特性非常适配企业名称匹配场景:比如「阿里巴巴科技有限公司」和「科技有限公司阿里巴巴」词序颠倒但内容完全一致,用这个方法计算可以直接拿到100分,不会受词序混乱影响。
2. 不直接用KNN输出距离,额外选用fuzzy评分的原因
这套代码用的是「粗筛+精排」的两步匹配逻辑,两个工具的定位完全不同:
- KNN+TF-IDF的作用是粗筛:如果直接给每个待匹配名称和全量标准名称池跑fuzzy匹配,数据量稍大就会出现性能问题。先用TF-IDF把字符串转成向量、用KNN先筛选出Top N最可能的候选,能把匹配范围从全量缩小到极小的候选池,大幅提升运算效率。但TF-IDF向量距离是基于字符n-gram重合度计算的,对企业名称的局部差异、词序调整的匹配准确度远低于直接的字符串相似度计算,不能作为最终匹配评分。
token_sort_ratio的作用是精排:在KNN筛出的小候选池里做精准的相似度打分,它的评分结果更贴合人对两个企业名称是否一致的判断,所以会作为最终输出的Ratio指标。
3. 修改NearestNeighbors的metric参数无明显变化的原因
NearestNeighbors的度量指标会影响最终匹配结果,你没看到变化大概率是以下两个原因:
- 你提供的代码里,
fuzzy_tf_idf函数调用fuzzy_nn_match时,固定传参n_neighbors = 1,相当于KNN粗筛阶段直接只返回1个候选,后续fuzzy匹配只能给这唯一的候选打分。只要不同度量指标筛选出的Top1候选一致,最终结果自然不会有变化。你可以把n_neighbors调整到5~10之后再修改metric参数,就能看到结果差异。 - 如果你的数据集本身比较简单,待匹配的非标准化名称和标准名称差异很小,不同度量指标粗筛出来的候选重合度极高,也会出现改参数后结果无明显变化的情况。
内容的提问来源于stack exchange,提问作者JSC
相关产品推荐
相关产品推荐

