快速模糊字符串匹配
项目描述
Python 和 C++ 中使用 Levenshtein 距离的快速模糊字符串匹配
描述
RapidFuzz 是一个用于 Python 和 C++ 的快速字符串匹配库,它使用来自FuzzyWuzzy的字符串相似度计算。然而,RapidFuzz 与 FuzzyWuzzy 的不同之处在于:
- 它是 MIT 许可的,因此它可以用于您可能想为您的项目选择的任何许可,而在使用 FuzzyWuzzy 时您被迫采用 GPL 许可
- 它提供了许多 string_metrics,如 hamming 或 jaro_winkler,这些在 FuzzyWuzzy 中不包含
- 它主要是用 C++ 编写的,除此之外,还对算法进行了许多改进,以使字符串匹配更快,同时仍然提供相同的结果。有关详细的基准测试,请查看文档
- 修复了
partial_ratio实现中的多个错误
要求
- Python 3.6 或更高版本
- 在 Windows 上,需要Visual C++ 2019 可再发行组件
安装
有几种安装 RapidFuzz 的方法,推荐的方法是使用pip(Python 包管理器)或
conda(开源、跨平台的包管理器)
带点
RapidFuzz 可以通过pip以下方式安装:
pip install rapidfuzz
有用于 MacOS(10.9 及更高版本)、Linux x86_64 和 Windows 的 RapidFuzz 的预构建二进制文件(轮子)。armv6l (Raspberry Pi Zero) 和 armv7l (Raspberry Pi) 的轮子在piwheels上可用。
:heavy_multiplication_x: 失败“ImportError:DLL 加载失败”
如果您在 Windows 上遇到此错误,原因很可能是未安装Visual C++ 2019 可再发行组件,这是查找 C++ 库所必需的(C++ 2019 版本包括 2015、2017 和 2019 版本)。
与康达
RapidFuzz 可以安装conda:
conda install -c conda-forge rapidfuzz
来自 git
RapidFuzz 可以通过克隆存储库直接从源代码分发中安装。这需要支持 C++17 的编译器。
git clone --recursive https://github.com/maxbachmann/rapidfuzz.git
cd rapidfuzz
pip install .
用法
一些简单的功能如下所示。可以在此处找到所有功能的完整文档。
得分手
RapidFuzz 中的记分器可以在模块fuzz和string_metric.
简单比率
> fuzz.ratio("this is a test", "this is a test!")
96.55171966552734
部分比率
> fuzz.partial_ratio("this is a test", "this is a test!")
100.0
令牌排序率
> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
90.90908813476562
> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
100.0
代币集比率
> fuzz.token_sort_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
83.8709716796875
> fuzz.token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
100.0
过程
process 模块将字符串与字符串列表进行比较。这通常比直接从 Python 使用记分器性能更高。以下是 RapidFuzz 中处理器使用的一些示例:
> from rapidfuzz import process, fuzz
> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
> process.extract("new york jets", choices, scorer=fuzz.WRatio, limit=2)
[('New York Jets', 100, 1), ('New York Giants', 78.57142639160156, 2)]
> process.extractOne("cowboys", choices, scorer=fuzz.WRatio)
("Dallas Cowboys", 90, 3)
处理器的完整文档可以在这里找到
基准
以下基准提供了 RapidFuzz 和 FuzzyWuzzy 之间的快速性能比较。可以在文档中找到更详细的字符串指标基准。对于这个简单的比较,我生成了一个包含 10.000 个长度为 10 的字符串的列表,并将其与该列表中的 100 个元素的样本进行比较:
words = [
''.join(random.choice(string.ascii_letters + string.digits) for _ in range(10))
for _ in range(10_000)
]
samples = words[::len(words) // 100]
第一个基准测试比较了 FuzzyWuzzy 和 RapidFuzz 中评分器在直接从 Python 中使用时的性能,如下所示:
for sample in samples:
for word in words:
scorer(sample, word)
下图显示了每个记分器每秒处理的元素数量。不同的得分手之间有很大的表现差异。然而,RapidFuzz 中的每个得分手都更快
第二个基准测试通过以下方式比较了记分器与 extractOne 结合使用时的性能:
for sample in samples:
extractOne(sample, word, scorer=scorer)
下图显示了每个记分器每秒处理的元素数量。在 RapidFuzz 中,通过处理器使用记分器extractOne比直接使用它要快得多。这就是为什么应该尽可能使用它们。
支持项目
如果您在工作中使用 RapidFuzz 并想回馈您自己的一些好处来支持该项目,请考虑通过 GitHub 赞助商或 PayPal 向我们汇款,我们可以用这些钱为我们争取空闲时间来维护这个伟大的图书馆,修复软件中的错误,审查和集成代码贡献,改进其功能和文档,或者只是深呼吸,偶尔喝杯茶。谢谢您的支持。
通过GitHub Sponsors或PayPal支持该项目:
执照
RapidFuzz 是在 MIT 许可下获得许可的,因为我相信每个人都应该能够使用它而不必被迫采用 GPL 许可。这就是为什么该库基于 MIT 许可的旧版本的fuzzywuzzy 的原因。可以在此处找到此旧版本的fuzzywuzzy 。