FuzzyWuzzy Python 库

17 Mar 2025 | 6 分钟阅读

在本教程中,我们将学习如何使用 Python 内置的 fuzzyWuzzy 库匹配字符串,并通过各种示例来确定它们有多相似。

引言

Python 提供了一些比较两个字符串的方法。以下是一些主要方法。

  • 使用正则表达式
  • 简单比较
  • 使用 dfflib

但还有一种可以有效用于比较的方法,称为 fuzzywuzzy。此方法在区分指向同一事物但拼写略有不同的两个字符串方面非常有效。有时我们需要一个程序来自动识别错误的拼写。

这是一个查找与给定模式匹配的字符串的过程。它使用 Levenshtein 距离 来计算序列之间的差异。

该库可以帮助映射缺少公共键的数据库,例如按公司名称联接两个表,而这些公司名称在两个表中显示不同。

示例

让我们看下面的例子。

输出

True

上面的代码返回 true,因为字符串匹配是完全的(100%),如果我们在 str2 中进行更改怎么办。

输出

False

上面的代码返回 false,并且字符串在人类看来几乎相同,但对解释器来说不是。但是,我们可以通过将两个字符串都转换为小写来解决此问题。

输出

True

但是,如果我们更改字符集,我们会遇到另一个问题。

输出

True

为了解决这类问题,我们需要更有效的工具来比较字符串。而 fuzzywuzzy 是计算字符串的最佳工具。

Levenshtein 距离

Levenshtein 距离 用于计算两个单词序列之间的距离。它计算更改给定字符串所需的最小编辑次数。这些编辑可以是插入、删除或替换。

示例 -

我们将在前面的示例中使用上面的函数,当时我们正在尝试比较“Welcome to javatpoint.”和“Welcome to javatpoint”。我们可以看到这两个字符串很可能相同,因为 Levensthtein 的长度很小。

FuzzyWuzzy 包

这个库的名字有点奇怪和有趣,但它很有用。它有一种独特的方式来比较两个字符串,并返回一个 100 分的匹配分数。要使用此库,我们需要在 Python 环境中安装它。

安装

我们可以使用 pip 命令安装此库。

Collecting fuzzywuzzy
  Downloading fuzzywuzzy-0.18.0-py2.py3-none-any.whl (18 kB)
Installing collected packages: fuzzywuzzy
Successfully installed fuzzywuzzy-0.18.0

现在输入以下命令并按 Enter。

让我们来理解 fuzzuwuzzy 库的以下方法

Fuzz 模块

fuzz 模块用于一次比较两个给定的字符串。它在使用不同方法进行比较后返回 100 分的得分。

Fuzz.ratio()

它是 fuzz 模块最重要的函数之一。它根据给定字符串的匹配程度来比较字符串和评分。让我们理解以下示例。

示例 -

输出

100

如上代码所示,fuzz.ratio() 方法返回的分数表示字符串之间差异非常小。

Fuzz.partial_ratio()

fuzzywuzzy 库提供了另一个强大的方法 - partial_ratio()。它用于处理复杂的字符串比较,例如子字符串匹配。让我们看下面的例子。

示例 -

输出

44
100

说明

partial_ratio() 方法可以检测子字符串。因此,它会产生 100% 的相似度。它遵循最优部分逻辑,即当短字符串长度为 k,长字符串长度为 m 时,算法会找到最佳匹配的长度为 k 的子字符串。

Fuzz.token_sort_ratio

此方法不能保证获得准确的结果,因为如果我们更改字符串的顺序。它可能不会给出准确的结果。

但是 fuzzywuzzy 模块提供了解决方案。让我们理解下面的例子。

示例 -

输出

59
74
100

说明

在上面的代码中,我们使用了 token_sort_ratio() 方法,该方法比 partial_ratio 具有优势。在此方法中,字符串标记按字母顺序排序并连接在一起。但还有另一种情况,例如,如果字符串的长度相差很大。

让我们理解下面的例子。

示例 -

输出

40
64
61
95

在上面的代码中,我们使用了另一种称为 fuzz.token_set_ratio() 的方法,该方法执行集合操作,提取公共标记,然后进行 pairwise 比较。

排序标记的交集始终相同,因为子字符串或较小的字符串包含原始字符串的较大块,或者剩余的标记彼此更接近。

fuzzywuzzy 包提供了 process 模块,该模块允许我们计算具有最高相似度的字符串。让我们理解下面的例子。

示例 -

输出

[('hello', 90), ('Hello Good', 90), ('Morning', 90), ('Good Evenining', 59)]
('hello', 90)

上面的代码将返回给定字符串列表的最高匹配百分比。

Fuzz.WRatio

process 模块还提供了 WRatio,它比简单的 ratio 提供了更好的结果。它处理大小写和其他一些参数。让我们理解下面的例子。

示例 -

输出

100

结论

在本教程中,我们讨论了如何匹配字符串并确定它们的相似程度。我们通过简单的例子来说明,但它们足以清楚计算机如何处理不匹配的字符串。许多实际应用,如拼写检查、生物信息学匹配、DNA 序列匹配等,都基于模糊逻辑。


下一主题Dask Python