当前位置: 首页 > 面试题库 >

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

逄烨
2023-03-14
问题内容

我正在fuzzywuzzy用Python学习。

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

  • 我是否先检查2个字符串的长度,说不一样,然后排除fuzz.partial_ratio
  • 如果两个字符串的长度相似,我将使用 fuzz.token_sort_ratio
  • 我应该一直使用fuzz.token_set_ratio吗?

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

我正在尝试建立一个房地产网站,想fuzzywuzzy用来比较地址。


问题答案:

好问题。

我是SeatGeek的工程师,所以我想可以为您提供帮助。我们有一篇很棒的博客文章,很好地解释了这些差异,但是我可以总结一下,并提供一些有关如何使用不同类型的见解。

在幕后,这四种方法中的每一种都计算两个输入字符串中标记的某些顺序之间的编辑距离。这是使用进行difflib.ratio功能这将:

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

其中T是两个序列中元素的总数,M是匹配数,这是2.0 * M /T。请注意,如果序列相同,则为1;如果没有相同之处,则为0。

四种Fuzzywuzzy方法调用difflib.ratio输入字符串的不同组合。

模糊比

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

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

fuzz.partial_ratio

尝试解决部分字符串匹配会更好。ratio使用最短的字符串(长度为n)对较大的字符串的所有n个长度的子字符串进行调用,并返回最高分数(code)。

请注意,“ YANKEES”是最短的字符串(长度为7),我们对“ NEW YORK YANKEES”的所有长度为7的子字符串(包括检查“
YANKEES”(100%匹配))使用比率“ YANKEES” ):

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

fuzz.token_sort_ratio

试图说明乱序的相似字符串。ratio在对每个字符串中的标记进行排序之后,调用这两个字符串(code)。请注意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

fuzz.token_set_ratio

尝试排除字符串中的差异。在三个特定的子字符串集上调用ratio并返回max(code):

  1. 仅交集和与字符串一的余数的交集
  2. 仅交集和与字符串二的余数的交集
  3. 与一个的余数相交和与两个的余数相交

请注意,通过拆分两个字符串的交集和余数,我们考虑了两个字符串的相似性和差异性:

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总部的两个可能地址:“
235 Park Ave S. Floor 12”和“ 235 Park Ave S. Floor 12”:

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为这些字符串提供了较高的匹配分数,但是一个地址是我们在联合广场附近的实际办公室,另一个地址是大中央车站的另一侧。

对于您的问题,最好使用Google GeocodingAPI。



 类似资料:
  • 问题内容: 如何比较javascript中的2个函数?我不是在谈论内部参考。说 可以比较和吗? 问题答案:

  • 问题内容: 我有一个简单的疑问。如果有人帮助我,那就太好了。 我有两个字符串: 这两个值相等,但是如何在Java中比较它们呢?我们拥有并用于比较字符串alpha值,类似地,如何比较数字值。 问题答案: 这就对了。您可以使用方法将数字字符串转换为整数,该方法将返回类型。然后比较与相同。

  • 问题内容: 我想知道如何在一行中比较多个字符串。我尝试使用|| 但不适用于布尔值或字符串。这是我的代码是什么样的: 对于那些将其标记为重复的对象,我在此处检查了200多个关于堆栈溢出的问题,但没有一个起作用。@Chrylis发布的一个实际上没有帮助。他们只是在问==和.equals()的区别 问题答案: 首先,不要用于字符串。稍后您将了解原因。您想按字符串的内容而不是它们在内存中的位置比较字符串。

  • 问题内容: 我知道的结果是布尔值,因此无法进行比较,但是我们如何检查是否存在多个字符? 问题答案: 这不是您想要的。请使用堆栈语句: 或者,由于我是 正则表达式的狂热者 ,因此这是一种使用 正则表达式 的方法!:) 由于user2980077 ,此后修复的代码中有一个错误

  • 我知道可以使用,现在不推荐使用。类似于咆哮的代码: 另外,也许可以将手动脚本写成字符串,但我怀疑这是否是正确的解决方案。任何创建正确查询的想法都将受到欢迎。

  • 问题内容: 我有两个文件,如下所示: 和 我需要比较所有单元格,以及从该单元格中比较一个单元格 。 如何添加的比较电池和? 问题答案: 以下方法应该可以帮助您入门: 这将显示两个文件之间不同的所有单元格。对于给定的两个文件,将显示: 如果您更喜欢单元格名称,请使用: 给你: