计算两个字符串相(或句子)似度的方法有大约有三种:1 编辑距离,2 余弦相似度,3 FuzzyWuzzy
本文章主要给大家讲解 FuzzyWuzzy 库的使用:
1)----》》
导入库
>>> from fuzzywuzzy import fuzz
>>> from fuzzywuzzy import process
运行代码
>>> fuzz.ratio("this is a test", "this is a test!")out 97>>> fuzz.partial_ratio("this is a test", "this is a test!")out 100
fuzz.ratio()对位置敏感,全匹配,fuzz.partial_ratio()对位置不敏感,搜索匹配,从输出的结果就可以看到。
2)----》》
>>> fuzz._process_and_sort(s, force_ascii, full_process=True)
对字符串s排序。force_ascii:True 或者False。为True表示转换为ascii码。如果full_process为True,则会将字符串s转换为小写,去掉除字母和数字之外的字符(发现不能去掉-字符),剩下的字符串以空格分开,然后排序。如果为False,则直接对字符串s排序。
>>> fuzz._token_sort(s1, s2, partial=True, force_ascii=True, full_process=True)
给出字符串 s1, s2的相似度。首先经过 fuzz._process_and_sort()函数处理。partial为True时,再经过fuzz.partial_ratio()函数。partial为False时,再经过fuzz.ratio()函数。
>>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")out 100
partial为False的_token_sort()
fuzz.partial_token_sort_ratio(s1, s2, force_ascii=True, full_process=True)
就是partial为True时的Fuzz._token_sort()
3)
>>> fuzz.token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")out 100
fuzz._token_set(s1, s2, partial=True, force_ascii=True, full_process=True)
当partial为False时,就是 fuzz.token_set_ratio()函数。
fuzz.partial_token_set_ratio(s1, s2, force_ascii=True, full_process=True)
partial为True的fuzz._token_set()函数。
总结:如果计算相似度的字符串只有字母和数字,直接可以用ratio()和partial_ratio()。但如果还有其他字符,而且我们想要去掉这些没用字符,就用下边的。下边的函数都对顺序不敏感,但token_sort_ratio()系列是全字符匹配,不管顺序。而token_set_ratio()只要第二个字符串包含第一个字符串就100,不管顺序。
>>> 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)
query是字符串,choices是数组,元素是字符串。 processor是对输入比较的字符串的处理函数,默认是fuzzywuzzy.utils.full_process(),即将字符串变为小写, 去掉除字母和数字之外的字符(发现不能去掉-字符),剩下的字符串以空格分开。scorer计算两个字符串相似度的函数,默认fuzz.WRatio()。 limit是输出个数。
输出为数组,元素为元组,元祖第一个匹配到的字符串,第二个为int型,为score。对输出按照score排序。
score_cutoff为一个阈值,当score小于该阈值时,不会输出。返回一个生成器,输出每个大于 score_cutoff的匹配,按顺序输出,不排序。
>>> process.extractBests(query, choices, processor=default_processor, scorer=default_scorer, score_cutoff=0, limit=5)
|
|