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

2025-04-01 09:56:00
admin
原创
25
摘要:问题描述:我正在学习fuzzywuzzyPython。fuzz.ratio我理解、fuzz.partial_ratio和fuzz.token_sort_ratio的概念fuzz.token_set_ratio。我的问题是何时使用哪个函数?我是否首先检查这两个字符串的长度,如果不相似,则排除fuzz.parti...

问题描述:

我正在学习fuzzywuzzyPython。

fuzz.ratio我理解、fuzz.partial_ratiofuzz.token_sort_ratio的概念fuzz.token_set_ratio。我的问题是何时使用哪个函数?

  • 我是否首先检查这两个字符串的长度,如果不相似,则排除fuzz.partial_ratio

  • 如果两个字符串的长度相似,我会使用
    fuzz.token_sort_ratio

  • 我应该一直使用吗fuzz.token_set_ratio

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

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


解决方案 1:

好问题。

我是 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

fuzz.partial_ratio

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

请注意,“YANKEES”是最短的字符串(长度为 7),并且我们对“YANKEES”与“NEW YORK YANKEES”的所有长度为 7 的子字符串运行比率(其中包括与“YANKEES”进行检查,100% 匹配):

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

尝试排除字符串中的差异。对三个特定子字符串集调用比例并返回最大值(代码):

  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 HQ 的两个可能地址:“235 Park Ave 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 Geocoding API。

解决方案 2:

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

fuzz.partial_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

fuzz.partial_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.QRatio,fuzz.UQRatio

fuzz.ratio包含一些验证和短路的包装,出于完整性而包含在这里。
UQRatio是的unicode版本QRatio

fuzz.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.

fuzz.UWRatio

的 Unicode 版本WRatio

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用