Python+fuzzywuzzy计算两个字符串之间的相似度
作者:古明地觉 发布时间:2021-02-04 16:31:22
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 进行匹配,只是会弹出警告罢了。
来源:https://mp.weixin.qq.com/s/Zqz9ZrT6h9fVZpw3jItDrw


猜你喜欢
- 一、建造者模式建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 =>
- filter是Python的内置方法。官方定义是:filter(function or None, sequence) -> list
- 树莓派与arduino串口通信第一步:先设置硬件串口分配给GPIO串口输入sudo raspi-config命令进入树莓派系统配置界面,选择
- Python在很大程度上可以对shell脚本进行替代。笔者一般单行命令用shell,复杂点的多行操作就直接用Python了。这篇文章就归纳一
- 1.regex-coach ——正则表达式工具2. IECookiesView——IE的cookie查看工具3.Flex Trace Pan
- 【ThinkPHP版本查询】dump(THINK_VERSION);模板获取get参数{$Think.get.pageNumber}或者$R
- 转自http://rookiefly.cn/detail/69作死小能手这两天闲着没事,把自己电脑重装了,然而重装过后配置开发环境踩了一些坑
- 调用很简单 Readkid.motion.tween(target,duration, vars)target: 要缓动的DOM对象dura
- 今天我们来学习,如何使用有趣的自定义标记来布局页面。有的朋友可能有这样的疑问,自己随便定义的标记浏览器怎么能正确的认识呢?这里我们就要用到文
- 前言大家好,我是空空star,本篇给大家分享一下通过Python的pyttsx3库将文字转为音频。一、pyttsx3是什么?pyttsx3是
- 1、表中字段区分大小写的设置在使用gorm查询的时候,会出现账户名A和a是一样的情况,是因为mysql默认不区分大小写造成的1.问题产生的原
- 背景介绍#ubuntu 20.04 版本系统自带的 MySQL 版本是 8.0,普通方法很难安装 5.7 版本的。由于 8.0 版本较 5.
- 相关文章ASP.NET Core2.2 中的Configuration配置一ASP.NET Core2.2 中的Configuration配
- 本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法。分享给大家供大家参考,具体如下:1. 函数带多个参数# 普通的装饰器
- 最近看到N多介绍CSS框架,前些天我说过一句话:“在我有限的视野里,还没见到可以真正可以称得上css框架的东东~”,当然也可能是我的视野太小
- 原文链接:Histogram of Oriented Gradients(文中的图片均来自翻译原文)什么是特征描述子特征描述子一张图片或者一
- 多进程共享变量和获得结果由于工程需求,要使用多线程来跑一个程序。但是因为听说python的多线程是假的,于是使用多进程,反正任务需要共享的参
- 130 :文件格式不正确。(还不是很清楚错误的状况) 145 :文件无法打开。 1005:创建表
- 开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作安装paramiko模块pip3
- 1、背景最近有个项目,需要搭建一个socket服务器,一个web服务器,然后实现两个服务器之间的通讯交互。刚开始的方案是用Python中so