使用 fuzzywuzzy 模块计算两个字符串之间的相似度

简介: 使用 fuzzywuzzy 模块计算两个字符串之间的相似度

fuzzywuzzy 可以计算两个字符串之间的相似度,它依据 Levenshtein Distance 算法来进行计算。该算法又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需要的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越高。

我们来看一下该模块的用法,非常简单:

from fuzzywuzzy import fuzz
# 调用 fuzz.ratio 即可计算两个字符串的相似度
print(
    fuzz.ratio("古明地觉", "古明地恋")
)  # 75
# 我们看到 ratio 是完全匹配的
# 它把字符串的长度也考虑在内了
print(
    fuzz.ratio("古明地觉", "古明地觉aa")
)  # 80
# partial_ratio是非完全匹配
# 如果一方结束了,那么剩下的就不考虑了
print(
    fuzz.partial_ratio("古明地觉", "古明地觉,小五萝莉")
)  # 100
# token_sort_ratio表示忽略顺序匹配
# 但前提是多个词,以空格进行分隔
print(
    fuzz.ratio("古 明 地 觉", "古 明 地 觉"[:: -1])
)  # 25
print(
    fuzz.token_sort_ratio("古 明 地 觉", "古 明 地 觉"[:: -1])
)  # 100
# token_set_ratio表示去重匹配
# 同样:前提是多个词,以空格进行分隔
print(fuzz.ratio("a a a he", "a he"))  # 67
print(
    fuzz.token_set_ratio("a a a he", "a he")
)  # 100

当我们使用 git 的时候,如果命令输错了,那么会告诉你此命令不是一个 git 命令,这是理所应当的。然后重点来了,git 还会提示一些与你输错的命令长得非常相似的一些命令。

所以这里面也用到了字符串的相似度原理,找出 git 命令中和你输错的命令最相似的几个,然后进行提示。

如果我们也写了一个类似的程序,需要用户通过命令行参数的方式,那么当用户输入了一个不存在的命令时,我们也可以这么做。而实现方法也很简单,就是将所有的命令和用户输错的命令都计算一个相似度,然后返回相似度最高的 n 个即可。

使用上面的 fuzz 完全可以实现,当然 fuzzywuzzy 模块还提供了一个 extract 函数,可以让我们更加轻松地做到这一点。

from fuzzywuzzy import process
words = ["hello python", "hello java", 
         "hello golang", "hello php"]
# 会自动和 words 里面的每一个元素进行比较
# 然后按照相似度从高到低排列
print(process.extract("hello thon", words))
"""
[('hello python', 91), ('hello php', 74), 
 ('hello golang', 73), ('hello java', 64)]
"""
# 还可以传入一个 limit 参数
# 表示只返回前 limit 个,默认为5
print(
    process.extract("hello thon", words, limit=2)
) 
"""
[('hello python', 91), 
 ('hello php', 74)]
"""
# 返回分数最高的,此时返回一个元组
print(
    process.extractOne("hello thon", words)
)  
"""
('hello python', 91)
"""

这个模块使用起来还是比较简单的,当然核心是字符串相似度的计算原理,这才是重点,有兴趣可以去了解一下。

另外使用 fuzzywuzzy 这个模块的时候,会弹出一个警告:

UserWarning: Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning

提示我们可以通过安装 python-Levenshtein 得到解决,这是一个用于加速字符串匹配的库,可提供 4 到 10 倍的加速。当然即使没有这个库也是可以的,没有的话 fuzzywuzzy 底层会使用标准库 difflib 进行匹配,只是会弹出警告罢了。

相关文章
|
11月前
|
存储 人工智能 调度
直播回放 | 高性能智算集群设计思考与实践
本次分享的主题是高性能智算集群设计思考与实践,由阿里云灵骏智算集群产品解决方案负责人丛培岩分享。 1. AGI对基础设施的挑战 2. 高性能智算集群的设计实践 3. 思考与展望
255 1
|
9月前
|
人工智能 算法 物联网
ComfyUI:搭积木一样构建专属于自己的AIGC工作流(保姆级教程)
通过本篇文章,你可以了解并实践通过【ComfyUI】构建自己的【文生图】和【文生动图】工作流。
ComfyUI:搭积木一样构建专属于自己的AIGC工作流(保姆级教程)
|
6月前
|
数据安全/隐私保护 Windows
电脑文件夹加密全攻略:Anvi Folder Locker 工具详解(附下载),一键实现锁定、只读、隐藏三重保护
Anvi Folder Locker是由Anvsoft Corporation开发的免费文件夹和文件加密工具,适用于Windows系统。它提供多种保护方式,如隐藏、密码保护、锁定和只读等,确保敏感数据安全。软件功能强大,集成在Windows资源管理器中,支持24/7免费技术支持。用户可自定义权限,防止文件被修改、复制或删除。初次使用需设置主密码,安装后即可快速保护文件夹。
2459 2
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
430 2
JS算法必备之Array常用操作方法
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
关系型数据库 PostgreSQL
PostgreSQL pg_orphaned扩展
由于种种原因,PostgreSQL可能会产生一些孤儿文件,这些文件会占用磁盘空间,手工查找费时费力还容易出错,pg_orphaned扩展很好的解决了这个问题。
|
机器学习/深度学习 人工智能 算法
深度学习和强化学习有什么区别呢
【10月更文挑战第23天】深度学习和强化学习有什么区别呢
|
存储 安全 Docker
直接停掉docker后镜像都没了
7月更文挑战第12天
1923 7
|
SQL 人工智能 JavaScript
重磅!通义千问2.5正式发布
重磅!通义千问2.5正式发布
17921 8
|
JSON 自然语言处理 搜索推荐
开发一款专属的 VSCode 代码提示插件
作为前端开发者一定用过VsCode这款利器,而其强大的插件能力无疑更是让我们深深的爱上了它。据不完全统计,VsCode插件市场中的插件数量已经超过了3万,由此可见大家的热情有多高。其中涉及到各种各样功能的插件,有主题曲相关的,有代码开发相关的,比如代码片段、Git插件、tslint等等。作为开发者,肯定用过各种各样的代码提示的插件,代表性的有TabNine、Copilot等等。今天就让我们来自己动手,开发一款专属的代码提示插件。毕竟别人的再好也是别人的, 属于自己的才是最好的。
3309 1
开发一款专属的 VSCode 代码提示插件