FuzzyWuzzy:Python中的模糊字符串匹配

什么是模糊字符串匹配?

模糊字符串匹配是大致(而不是精确地)查找与给定模糊匹配的字符串的过程,就像字面意思一样,它也被称为近似字符串匹配。通常,这些字符串普哦诶的模式另一个字符串。

使用Levenshtein Distance计算两个字符串之间的接近程度,也称为编辑距离,其基本上是基于将一个字符串转换为另一个字符串的精确匹配所需要的基本操作的计数。

Fuzzy(模糊)字符串匹配像一个老板。它作为一个简单易用的包使用Levenshtein Distance来计算中序列之间的差异。


要求

  • Python2.7或更高版本
  • 依赖于优秀的difflib Python库

  • Python-Levenshtein(可选,在字符串匹配中提供4-10的加速,但在某些情况下可能会导致不同的结果)

安装

使用pip安装

pip install fuzzywuzzy

或者使用以下的安装python-Levenshtein

pip install fuzzywuzzy [speedup]

通过github使用pip

pip install git+git://github.com/seatgeek/fuzzywuzzy.git@0.17.0#egg=fuzzywuzzy

添加到你的requirements.txt文件(执行 pip install -r requirements.txt)

通过git安装

git clone git://github.com/seatgeek/fuzzywuzzy.git fuzzywuzzy
cd fuzzywuzzy
python setup.py install

使用方法

>>> from fuzzywuzzy import fuzz
>>> from fuzzywuzzy import process

 

四种模糊匹配方法

1、ratio()——使用纯Levenshtein Distance进行匹配。

2、partial_ratio()——基于最佳的子串(substrings)进行匹配

3、token_set_ratio——对字符串进行标记(tokenizes)并在匹配之前按字母顺序对它们进行排序 

4、token_set_ratio——对字符串进行标记(tokenizes)并比较交集和余数 

下面的代码片段突出显示了这四种算法与一些通用用例之间的区别:

1、当比较字符串因标点符号而不同的情况:

fuzz.ratio("test is fuzzywuzzy","test is fuzzywuzzy") #抽取匹配

 fuzz.ratio("test is fuzzywuzzy","test is fuzzywuzzy..") #有标点

 

不一致的子串是我们常见的问题。为了解决它,当两个字符串具有明显不同的长度时(例如下面的情况),我们使用称为“best partial”的启发式算法。如果较短的字符串是长度m,而较长的字符串是长度n,我们基本上对最佳匹配长度为m的子字符串的得分感兴趣可以采用下面的辅助算法,fuzzywuzzy封装了partial_ratio函数。

fuzz.partial_ratio("test is fuzzywuzzy","test is fuzzywuzzy..") #有标点

token_sort_ratio方法涉及对有问题的字符串进行标记,按字母顺序对标记进行排序,然后将它们连接回字符串。例如:

"new york mets vs atlanta braves"   →→  "atlanta braves mets new vs york"
fuzz.token_sort_ratio("test is fuzzywuzzy","test is fuzzywuzzy!!") #标点

token_set_ratio方法类似,但更灵活一点。在这里,我们对两个字符串进行标记,但不是立即进行排序和比较,而是将标记分为两组:交集和余数。我们使用这些集合来构建比较字符串。

s1 = "mariners vs angels"
s2 = "los angeles angels of anaheim at seattle mariners"

#使用token_sort_ratio方法没有用,因为第二个(更长)字符串有太多的额外token与排序交错。我们最终会比较:
t1 = "angels mariners vs"
t2 = "anaheim angeles angels los mariners of seattle vs"
#不是很有用。相反,set方法允许我们检测“angels”和“mariners ”对两个字符串都是通用的,并将它们分开#(设置交集)。现在我们构造并比较以下形式的字符串:
t0 = [SORTED_INTERSECTION]
t1 = [SORTED_INTERSECTION] + [SORTED_REST_OF_STRING1]
t2 = [SORTED_INTERSECTION] + [SORTED_REST_OF_STRING2]
# 然后比较每一对。
'''
这里的直觉是,因为SORTED_INTERSECTION组件总是完全相同,
所以当(a)构成完整字符串的较大百分比时,分数增加,并且(b)字符串余数更相似。在我们的例子中
'''
t0 = "angels mariners"
t1 = "angels mariners vs"
t2 = "angels mariners anaheim angeles at los of seattle"
fuzz.ratio(t0, t1) ⇒ 90
fuzz.ratio(t0, t2) ⇒ 46
fuzz.ratio(t1, t2) ⇒ 50
fuzz.token_set_ratio("mariners vs angels", "los angeles angels of anaheim at seattle mariners") ⇒ 90
'''
还有其他方法可以组合这些值。例如,我们可以采用平均值或最小值。但根据我们的经验,“尽可能最佳匹配”的方法似乎可以提供最佳的现实生活结果。当然,使用集合意味着重复的令牌会在转换中丢失。
'''

fuzz.token_set_ratio("Sirhan, Sirhan", "Sirhan") ⇒ 100
fuzz.token_set_ratio("test is fuzzywuzzy","test is fuzzywuzzy!!")

2、比较字符串有不同的情况:

fuzz.ratio("Test is Fuzzywuzzy","test is fuzzywuzzy") #ratio - 大小写

 fuzz.partial_ratio("Test is Fuzzywuzzy","test is fuzzywuzzy")#patial_ratio - 大小写

 

fuzz.token_sort_ratio("Test is Fuzzywuzzy","test is fuzzywuzzy") #token_sort_ratio -大小写

fuzz.token_set_ratio("Test is Fuzzywuzzy","test is fuzzywuzzy") #token_set_ratio-大小写

3、比较字符串顺序不同的情况:

fuzz.ratio("Test is Fuzzywuzzy","fuzzywuzzy is test ")

fuzz.partial_ratio("Test is Fuzzywuzzy","fuzzywuzzy is test ")

fuzz.token_set_ratio("Test is Fuzzywuzzy","fuzzywuzzy is test ")

 fuzz.token_sort_ratio("Test is Fuzzywuzzy","fuzzywuzzy is test ")

4、比较字符串是子集

fuzz.ratio("Test is Fuzzywuzzy","fuzzywuzzy ")

 fuzz.partial_ratio("Test is Fuzzywuzzy","fuzzywuzzy ")

fuzz.token_sort_ratio("Test is Fuzzywuzzy","fuzzywuzzy ")

fuzz.token_set_ratio("Test is Fuzzywuzzy","fuzzywuzzy ")

与选择列表进行比较

下面的代码片段演示了如何使用四个scorers(ratio, partial_ratio, token_sort_ratio, token_set_ratio)中一个,对一个字符串的列表来获得分数。scorer的选择取决于数据的性质和所需结果的性质。

我们还可以使用"socer_cutoff"参数来设置最佳匹配分数的阈值。如果最佳匹配分数低于阈值,则会返回None,如下面的代码片段所示:

将FuzzyMatch应用于整个数据集

下面的代码片段淹死了如何将模糊屁哦EI应用与整个dataset_1列中,以针对dataset_2的列返回最佳分数,其中计分器为"token_set_ratio",score_cutoff为90

更多模糊匹配用例:

以下是可以使用模糊匹配的几个用例列表:

  • 匹配客户跟踪所有客户购买以识别购买行为
  • 匹配客户地址以根据位置细分客户
  • 查找搜索关键字的近似匹配项
  • 匹配文件路径
  • 用于拼写检查
  • 检测剽窃(文本重用)
  • 匹配DNA序列
  • 用于垃圾邮件过滤

参考文献如下:

GitHub中FuzzyWuzzy

FuzzyWuzzy:Python中的模糊字符串匹配

使用Python的FuzzyWuzzy

Python中的模糊字符串匹配

 

 

  • 15
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值