RapidFuzz 是一个用于 Python 和 C++ 的快速字符串匹配库,它使用 FuzzyWuzzy 的字符串相似度计算。然而,RapidFuzz 有几个方面与 FuzzyWuzzy 不同:
它是 MIT 许可的,因此可以使用您想要为项目选择的任何许可证,而在使用 FuzzyWuzzy 时您必须采用 GPL 许可证
它提供了许多 string_metrics,例如 hamming 或 jaro_winkler,这些指标未包含在 FuzzyWuzzy 中
它主要是用 C++ 编写的,除此之外还进行了大量算法改进,使字符串匹配速度更快,同时仍然提供相同的结果。有关详细基准,请查看文档
修复了partial_ratio
实现中的多个错误
它在很大程度上可以用作fuzzywuzzy
的替代品。然而,这里描述了一些 API 差异
Python 3.9 或更高版本
在 Windows 上,需要 Visual C++ 2019 可再发行组件
安装RapidFuzz的方法有多种,推荐的方法是使用pip
(Python包管理器)或conda
(开源、跨平台的包管理器)
RapidFuzz 可以通过以下方式通过pip
安装:
pip 安装rapidfuzz
有适用于 MacOS(10.9 及更高版本)、Linux x86_64 和 Windows 的 RapidFuzz 预构建二进制文件(轮子)。 piwheels 上提供了适用于armv6l(Raspberry Pi Zero)和armv7l(Raspberry Pi)的轮子。
✖️失败“ImportError:DLL加载失败”
如果您在 Windows 上遇到此错误,原因很可能是未安装 Visual C++ 2019 可再发行组件,这是查找 C++ 库所必需的(C++ 2019 版本包括 2015、2017 和 2019 版本)。
RapidFuzz 可以使用conda
安装:
conda install -c conda-forge Rapidfuzz
RapidFuzz 可以通过克隆存储库直接从源发行版安装。这需要支持 C++17 的编译器。
git clone --recursive https://github.com/rapidfuzz/rapidfuzz.gitcd rapidfuzz 点安装。
一些简单的函数如下所示。可以在此处找到所有功能的完整文档。
请注意,从 RapidFuzz 3.0.0 开始,默认情况下不会对字符串进行预处理(删除所有非字母数字字符、修剪空格、将所有字符转换为小写)。这意味着,当比较具有相同字符但大小写不同的两个字符串时(“这是一个单词”、“这是一个单词”),它们的相似度得分值可能不同,因此在比较此类字符串时,您可能会看到得分差异与以前的版本相比的价值。可以在此处找到一些使用预处理进行字符串匹配的示例。
RapidFuzz 中的评分器可以在fuzz
和distance
模块中找到。
> from Rapidfuzz import fuzz> fuzz.ratio("这是一个测试", "这是一个测试!")96.55172413793103
> from Rapidfuzz import fuzz> fuzz.partial_ratio("这是一个测试", "这是一个测试!")100.0
> from Rapidfuzz import fuzz> fuzz.ratio("fuzzy wuzzy 是一只熊", "wuzzy fuzzy 是一只熊")90.9090909090909> fuzz.token_sort_ratio("fuzzy wuzzy 是一只熊", "wuzzy fuzzy 是一只熊")100.0
> from Rapidfuzz import fuzz> fuzz.token_sort_ratio("fuzzy 是一只熊", "fuzzy fuzzy 是一只熊")84.21052631578947> fuzz.token_set_ratio("fuzzy 是一只熊", "fuzzy fuzzy 是一只熊")100.0# 返回 100.0如果一个字符串是另一个字符串的子集,无论字符串中的额外内容如何更长的字符串> fuzz.token_set_ratio("fuzzy was a bear but not a dogs", "fuzzy was a bear")100.0# 仅当两个字符串存在明显不一致时,分数才会降低> fuzz.token_set_ratio("fuzzy was a bear"但不是狗”,“模糊是一只熊,但不是猫”)92.3076923076923
> from rapidfuzz import fuzz> fuzz.WRatio("this is a test", "this is a new test!!!")85.5> from rapidfuzz import fuzz, utils> # 从列表中删除非字母数字字符 ("!") string> fuzz.WRatio("这是一个测试", "这是一个新的测试!!!",processor=utils.default_process) # 这里 "这是一个新的测试!!!"转换为 "this is a new test"95.0> fuzz.WRatio("this is a test", "this is a new test")95.0> # 将字符串转换为小写> fuzz.WRatio("this is a word" , "这是一个词")21.42857142857143> fuzz.WRatio("这是一个词", "这是一个词", handler=utils.default_process) # 这里“THIS IS A WORD”被转换为“this is a word”100.0
> from Rapidfuzz import fuzz> fuzz.QRatio("这是一个测试", "这是一个新测试!!!")80.0> from rapidfuzz import fuzz, utils> # 从列表中删除非字母数字字符("!") string> fuzz.QRatio("这是一个测试", "这是一个新测试!!!",processor=utils.default_process)87.5> fuzz.QRatio("这是a test", "this is a new test")87.5> # 将字符串转换为小写> fuzz.QRatio("this is a word", "THIS IS A WORD")21.42857142857143> fuzz.QRatio("this is a word ”,“这是一个词”,processor=utils.default_process)100.0
处理模块使其将字符串与字符串列表进行比较。这通常比直接使用 Python 的评分器性能更高。以下是有关 RapidFuzz 中处理器的使用的一些示例:
> from rapidfuzz import process, fuzz> choice = ["亚特兰大猎鹰队", "纽约喷气机队", "纽约巨人队", "达拉斯牛仔队"]> process.extract("纽约喷气机队", Choices, Scorer=fuzz. WRatio, limit=2)[('纽约喷气机队', 76.92307692307692, 1), ('纽约Giants', 64.28571428571428, 2)]> process.extractOne("cowboys", Choices, Scorer=fuzz.WRatio)('Dallas Cowboys', 83.07692307692308, 3)> # With preprocessing> from rapidfuzz import process, fuzz, utils> process .extract("纽约喷气机", 选择, Scorer=fuzz.WRatio, limit=2, 处理器=utils.default_process)[('纽约喷气机队', 100.0, 1), ('纽约巨人队', 78.57142857142857, 2)]> process.extractOne (“牛仔”,选择,记分器=fuzz.WRatio,处理器=utils.default_process)('达拉斯牛仔队', 90.0, 3)
处理器的完整文档可以在这里找到
以下基准测试对 RapidFuzz 和 FuzzyWuzzy 之间的性能进行了快速比较。可以在文档中找到更详细的字符串指标基准。对于这个简单的比较,我生成了一个包含 10.000 个长度为 10 的字符串的列表,与此列表中包含 100 个元素的样本进行比较:
单词 = ["".join(random.choice(string.ascii_letters + string.digits) for _ in range(10))for _ in range(10_000) ]样本 = 单词[:: len(单词) // 100]
第一个基准测试比较了直接从 Python 使用 FuzzyWuzzy 和 RapidFuzz 中的评分器的性能,如下所示:
对于样本中的样本:对于单词中的单词:scorer(样本,单词)
下图显示了每个记分器每秒处理的元素数。不同得分手之间的表现存在很大差异。然而,RapidFuzz 中每个得分手的速度都更快
第二个基准测试比较了记分器与 cdist 结合使用时的性能,如下所示:
cdist(样本、单词、记分器=记分器)
下图显示了每个记分器每秒处理的元素数。在 RapidFuzz 中,通过cdist
等处理器使用记分器比直接使用它要快得多。这就是为什么应尽可能使用它们。
如果您在工作中使用 RapidFuzz,并且想回馈一些自己的利益来支持该项目,请考虑通过 GitHub Sponsors 或 PayPal 向我们汇款,我们可以用这些钱来购买空闲时间来维护这个伟大的库,修复软件中的错误,审查和集成代码贡献,改进其功能和文档,或者只是偶尔深呼吸并喝杯茶。感谢您的支持。
通过 GitHub 赞助商或 PayPal 支持该项目:
RapidFuzz 是根据 MIT 许可证获得许可的,因为我相信每个人都应该能够使用它,而不必被迫采用 GPL 许可证。这就是为什么该库基于 fuzzywuzzy 的旧版本,该版本也获得了 MIT 许可。这个旧版本的 fuzzywuzzy 可以在这里找到。