首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >difflib.get_close_matches获取分数

difflib.get_close_matches获取分数
EN

Stack Overflow用户
提问于 2016-03-29 19:47:35
回答 2查看 13.9K关注 0票数 8

我正在尝试使用difflib.get_close_matches获取最佳匹配的分数

代码语言:javascript
复制
import difflib

best_match = difflib.get_close_matches(str,str_list,1)[0]

我知道添加'cutoff‘参数的选项,但不知道如何在设置阈值后获得实际分数。我是不是遗漏了什么?有没有更好的解决方案来匹配unicode字符串?

EN

回答 2

Stack Overflow用户

发布于 2016-06-15 17:07:42

我发现difflib.get_close_matches是匹配/模糊匹配字符串的最简单方法。但是还有其他一些更高级的库,比如你在评论中提到的fuzzywuzzy。

但是如果你想使用difflib,你可以使用difflib.SequenceMatcher来获得分数,如下所示:

代码语言:javascript
复制
import difflib
my_str = 'apple'
str_list = ['ape' , 'fjsdf', 'aerewtg', 'dgyow', 'paepd']
best_match = difflib.get_close_matches(my_str,str_list,1)[0]
score = difflib.SequenceMatcher(None, my_str, best_match).ratio()

在本例中,'apple‘和列表之间的最佳匹配是'ape’,得分为0.75。

您还可以遍历列表并计算要检查的所有分数:

代码语言:javascript
复制
for word in str_list:
    print "score for: " + my_str + " vs. " + word + " = " + str(difflib.SequenceMatcher(None, my_str, word).ratio())

在此示例中,您将获得以下内容:

代码语言:javascript
复制
score for: apple vs. ape = 0.75
score for: apple vs. fjsdf = 0.0
score for: apple vs. aerewtg = 0.333333333333
score for: apple vs. dgyow = 0.0
score for: apple vs. paepd = 0.4

difflib的文档可以在这里找到:https://docs.python.org/2/library/difflib.html

票数 10
EN

Stack Overflow用户

发布于 2022-02-09 18:48:35

要回答这个问题,通常的方法是以这种方式获取由get_close_matches()单独返回的匹配的比较分数:

代码语言:javascript
复制
match_ratio = difflib.SequenceMatcher(None, 'aple', 'apple').ratio()

在我的例子中,有一种方法可以将速度提高大约10%……

我使用get_close_matches()进行拼写检查,它在幕后运行SequenceMatcher(),但只返回匹配字符串的列表。正常情况下。

但是,对于当前在第736行左右的Lib/difflib.py中的一个小变化,返回可以是一个将分数作为值的字典,因此不需要在每个列表项上再次运行SequenceMatcher来获得它们的分数比率。在示例中,为了清晰起见,我缩短了输出浮点值(如0.8888888888888888到0.889)。Input n=7表示,如果超过7个,即最高的7个,则将返回项限制为7个,如果candidates很多,则可以应用这一点。

当前仅返回列表

在本例中,结果通常类似于['apple', 'staple', 'able', 'lapel']

..。如果省略了.6的默认截止值(就像Ben的答案一样,没有判断)。

变化

difflib.py中是简单的(右边的这一行显示的是原件)

代码语言:javascript
复制
return {v: k for (k, v) in result}  # hack to return dict with scores instead of list, original was ... [x for score, x in result]

新字典返回

包括像{'apple': 0.889, 'staple': 0.8, 'able': 0.75, 'lapel': 0.667}一样的分数

代码语言:javascript
复制
>>> to_match = 'aple'
>>> candidates = ['lapel', 'staple', 'zoo', 'able', 'apple', 'appealing']

将最小分数截止/阈值从.4提高到.8:

代码语言:javascript
复制
>>> difflib.get_close_matches(to_match, candidates, n=7, cutoff=.4)
{'apple': 0.889, 'staple': 0.8, 'able': 0.75, 'lapel': 0.667, 'appealing': 0.461}

>>> difflib.get_close_matches(to_match, candidates, n=7, cutoff=.7)
{'apple': 0.889, 'staple': 0.8, 'able': 0.75}

>>> difflib.get_close_matches(to_match, candidates, n=7, cutoff=.8)
{'apple': 0.889, 'staple': 0.8}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36283391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档