持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
介绍
FuzzyWuzzy
是一个简单易用的模糊字符串匹配工具包。它依据 Levenshtein Distance 算法,计算两个序列之间的差异。
Levenshtein Distance算法,又叫 Edit Distance算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。
安装和使用
安装
安装方式有以下几种:
- 通过
pip
进行安装
pip install fuzzywuzzy
- 使用pip通过Github进行安装
pip install git+git://github.com/seatgeek/fuzzywuzzy.git@0.18.0#egg=fuzzywuzzy
使用
主要介绍该模块下的四个方法,分别是Ration(简单匹配)
、Partial Ratio(非完全匹配)
、Token Sort Ratio(忽略顺序匹配)
、Token Set Ratio(去重子集匹配)
。
在运行程序时可能会出现warning
,但是并不影响程序运行,可以按照提示安装python-Levenshtein
包:
# warning
UserWarning: Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning
warnings.warn('Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning')
Ratio
fuzz.ratio(s1, s2)
:参数分别是需要进行匹配的两个字符串
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
res = fuzz.ratio("this is a test", "this is a test!")
print(res) # 97
Partial Ratio
使用非完全匹配,精度要更高一些
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
res = fuzz.partial_ratio("this is a test", "this is a test!")
print(res) # 100
Token Sort Ratio
忽略顺序匹配,原理在于:以 空格 为分隔符,小写 化所有字母,无视空格外的其它标点符号
from fuzzywuzzy import fuzz
from fuzzywuzzy import process
res = fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
print(res) # 91
res1 = fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
print(res1) # 100
Token Set Ratio
相当于比对之前有一个集合去重的过程,注意最后两个,可理解为该方法是在token_sort_ratio方法的基础上添加了集合去重的功能。
>>> fuzz.token_sort_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
84
>>> fuzz.token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
100
小总结
fuzz这几个方法最后得到的结果都是数字,如果需要获得匹配度最高的字符串结果,还需要依旧自己的数据类型选择不同的函数,然后再进行结果提取,如果但看文本数据的匹配程度使用这种方式是可以量化的,但是对于我们要提取匹配的结果来说就不是很方便了,因此就有了process模块。
Process
用于处理备选答案有限的情况,返回模糊匹配的字符串和相似度。可以使用不同的方法提取数据。
- extract - 提取多条数据
>>> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
>>> process.extract("new york jets", choices, limit=2)
[('New York Jets', 100), ('New York Giants', 78)]
>>> process.extractOne("cowboys", choices)
("Dallas Cowboys", 90)
- extractOne - 提取一条数据
如果要提取匹配度最大的结果,可以使用extractOne,注意这里返回的是 元组 类型, 还有就是匹配度最大的结果不一定是我们想要的数据。
>>> process.extractOne("System of a down - Hypnotize - Heroin", songs)
('/music/library/good/System of a Down/2005 - Hypnotize/01 - Attack.mp3', 86)
>>> process.extractOne("System of a down - Hypnotize - Heroin", songs, scorer=fuzz.token_sort_ratio)
("/music/library/good/System of a Down/2005 - Hypnotize/10 - She's Like Heroin.mp3", 61)
总结
fuzzywuzzy
模块是一个简单易用的模糊字符串匹配工具,在处理数据需要对数据进行模糊匹配时就可以适当是使用该模块哦~