FuzzyWuzzy不同匹配方法对相同文本返回结果不一致的技术咨询
为什么FuzzyWuzzy的
token_sort_ratio和partial_token_sort_ratio返回不同结果? 这是个很常见的疑问,核心原因是这两个方法的匹配逻辑完全不同,咱们结合你的例子一步步拆解:
1. fuzz.token_sort_ratio的工作逻辑
这个方法的步骤是:
- 把两个字符串按空格拆分成「token(词元)」
- 对每个字符串的token按字母顺序排序
- 将排序后的token重新拼接成新字符串
- 计算两个新字符串的完整相似度(基于编辑距离/SequenceMatcher)
放到你的例子里:
"Kimberly Beukema"拆分后是["Kimberly", "Beukema"],排序后拼接为"Beukema Kimberly""Ms. Kimberly Beukema"拆分后是["Ms.", "Kimberly", "Beukema"],排序后拼接为"Beukema Kimberly Ms."
现在它要对比的是这两个完整字符串的相似度——第二个字符串比第一个多了"Ms. "这部分内容,所以完整匹配度会被拉低,最终返回91。
2. fuzz.partial_token_sort_ratio的工作逻辑
这个方法在token_sort_ratio的基础上,做了一个关键调整:只做部分匹配,步骤是:
- 和
token_sort_ratio一样,先拆分、排序token - 取较短的那个token集合,去匹配较长的token集合
- 计算较短集合的token在较长集合中的覆盖比例
还是你的例子:
- 较短的token集合是
["Kimberly", "Beukema"] - 较长的token集合是
["Ms.", "Kimberly", "Beukema"]
因为较短集合里的所有token都能在较长集合中找到,覆盖比例是100%,所以返回100。
给你的小建议
如果你的场景是匹配姓名(经常会有Ms./Mr.这类前缀差异),partial_token_sort_ratio或者fuzz.token_set_ratio(基于token集合的交集匹配)会比token_sort_ratio更合适,它们能更好地忽略这类无关的前缀/后缀差异。
内容的提问来源于stack exchange,提问作者Cristina




