何时使用哪个模糊函数比较2个字符串

我正在用 Python 学习 fuzzywuzzy

我了解 fuzz.ratiofuzz.partial_ratiofuzz.token_sort_ratiofuzz.token_set_ratio的概念。我的问题是什么时候使用哪个函数?

  • 我先检查2个字符串的长度,如果不相似,那么规则 出 fuzz.partial_ratio
  • 如果两个字符串的长度相似,我将使用 fuzz.token_sort_ratio
  • 我应该一直使用 fuzz.token_set_ratio吗?

有人知道 SeatGeek 用什么标准吗?

我试图建立一个房地产网站,想用 fuzzywuzzy比较地址。

64554 次浏览

问得好。

我是 SeatGeek 的工程师,所以我想我能帮上忙。我们有一个很好的 博客文章来很好地解释这些差异,但是我可以总结并提供一些关于我们如何使用不同类型的见解。

概述

在这四个方法中,每个方法都计算两个输入字符串中令牌的某种排序之间的编辑距离。这是通过使用 difflib.ratio函数 会的完成的:

返回序列相似性的度量值(浮点数在[0,1]中)。

其中 T 是两个序列中元素的总数,而 M 是 匹配的数目,这是2.0 * M/T 注意,这是1如果 序列是相同的,如果它们没有共同点,则为0。

四个 fuzzywuzzy 方法对输入字符串的不同组合调用 difflib.ratio

模糊比率

简单。只需对两个输入字符串(密码)调用 difflib.ratio

fuzz.ratio("NEW YORK METS", "NEW YORK MEATS")
> 96

部分比率

尝试更好地解释部分字符串匹配。使用最短的字符串(长度 n)对较大字符串的所有 n 个长度的子字符串调用 ratio,并返回最高得分(密码)。

注意,“ yANKEES”是最短的字符串(长度为7) ,我们用“ yANKEES”对所有长度为7的子字符串(包括检查“ yANKEES”,匹配度为100%)进行比较:

fuzz.ratio("YANKEES", "NEW YORK YANKEES")
> 60
fuzz.partial_ratio("YANKEES", "NEW YORK YANKEES")
> 100

Token _ sort _ ratio

试图说明类似的字符串顺序错误。在对每个字符串(密码)中的标记进行排序后,对两个字符串调用 ratio。注意这里的 fuzz.ratiofuzz.partial_ratio都失败了,但是一旦你对标记进行排序,它就是100% 匹配的:

fuzz.ratio("New York Mets vs Atlanta Braves", "Atlanta Braves vs New York Mets")
> 45
fuzz.partial_ratio("New York Mets vs Atlanta Braves", "Atlanta Braves vs New York Mets")
> 45
fuzz.token_sort_ratio("New York Mets vs Atlanta Braves", "Atlanta Braves vs New York Mets")
> 100

Token _ set _ ratio

试图排除字符串中的差异。对三个特定子字符串集调用比率并返回 max (密码) :

  1. 与字符串1的其余部分的交集
  2. 只有交集和与字符串2的其余部分的交集
  3. 与1的余数相交,与2的余数相交

注意,通过分割两个字符串的交集和余数,我们考虑到了两个字符串的相似和不同之处:

fuzz.ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 36
fuzz.partial_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 61
fuzz.token_sort_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 51
fuzz.token_set_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners")
> 91

申请

这就是奇迹发生的地方。在 SeatGeek 中,实际上我们为每个数据点(场所、事件名称等)创建一个矢量得分,并使用它来通知针对我们的问题域的相似性的编程决策。

也就是说,事实告诉它听起来并不像 FuzzyWuzzy 对您的用例是有用的。在确定两个地址是否相似方面,这将是非常糟糕的。考虑 SeatGeek 总部的两个可能地址: “ Park Ave 第12层235号”和“ Park Ave S 第12层235号”:

fuzz.ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 93
fuzz.partial_ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 85
fuzz.token_sort_ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 95
fuzz.token_set_ratio("235 Park Ave Floor 12", "235 Park Ave S. Floor 12")
> 100

FuzzyWuzzy 给这些字符串一个很高的比赛分数,但一个地址是我们的实际办公室附近的联合广场和另一个是在另一边的中央车站。

对于您的问题,您最好使用 谷歌地理编码 API

截至2017年6月,fuzzywuzzy还包括一些其他的比较功能。以下是从已接受的答案(取自 源代码)中缺失的部分的概述:

Part _ token _ sort _ ratio

token_sort_ratio中的算法相同,但是在对令牌排序后不应用 ratio,而是使用 partial_ratio

fuzz.token_sort_ratio("New York Mets vs Braves", "Atlanta Braves vs New York Mets")
> 85
fuzz.partial_token_sort_ratio("New York Mets vs Braves", "Atlanta Braves vs New York Mets")
> 100
fuzz.token_sort_ratio("React.js framework", "React.js")
> 62
fuzz.partial_token_sort_ratio("React.js framework", "React.js")
> 100

Part _ token _ set _ ratio

token_set_ratio中的算法相同,但是不将 ratio应用于令牌集,而是使用 partial_ratio

fuzz.token_set_ratio("New York Mets vs Braves", "Atlanta vs New York Mets")
> 82
fuzz.partial_token_set_ratio("New York Mets vs Braves", "Atlanta vs New York Mets")
> 100
fuzz.token_set_ratio("React.js framework", "Reactjs")
> 40
fuzz.partial_token_set_ratio("React.js framework", "Reactjs")
> 71

模糊,模糊,模糊

只是包装了 fuzz.ratio的一些验证和短路,包括在这里的完整性。 UQRatioQRatio的 Unicode 版本。

模糊 Wratio

试图加权(名称代表“加权比率”)的结果来自不同的算法 计算“最佳”分数。 源代码描述:

1. Take the ratio of the two processed strings (fuzz.ratio)
2. Run checks to compare the length of the strings
* If one of the strings is more than 1.5 times as long as the other
use partial_ratio comparisons - scale partial results by 0.9
(this makes sure only full results can return 100)
* If one of the strings is over 8 times as long as the other
instead scale by 0.6
3. Run the other ratio functions
* if using partial ratio functions call partial_ratio,
partial_token_sort_ratio and partial_token_set_ratio
scale all of these by the ratio based on length
* otherwise call token_sort_ratio and token_set_ratio
* all token based comparisons are scaled by 0.95
(on top of any partial scalars)
4. Take the highest value from these results
round it and return it as an integer.

FuzzUWratio

Unicode 版本的 WRatio