Python中的Jaro和Jaro-Winkler相似度

2025年1月5日 | 阅读6分钟

Jaro 相似度

两个字符串之间的 Jaro 相似度是衡量它们相似程度的指标。Jaro 距离的值介于 0 和 1 之间,其中 1 表示字符串相等,0 表示字符串不相似。

示例

算法

以下公式用于计算 Jaro 相似度

Jaro and Jaro-Winkler Similarity in Python

其中

  • m 是匹配字符的数量
  • t 是换位的数量的一半
  • 其中 |s1| 和 |s2| 分别是字符串 s1 和 s2 的长度。

当字符相同且字符之间的距离不超过 { max(|s1|, |s2|) / 2 } - 1 时,则称这些字符为匹配字符。

两个字符串中顺序不同的匹配字符数量的一半即为换位。

计算

  • 假设 s1="arnab" 和 s2="raanb",任何字符可以匹配的最大距离为 1。
  • 很明显,两个字符串都包含五个匹配的字符,但由于字符顺序不同,有四个字符的顺序不正确,导致两次换位。
  • 因此,可以使用以下公式确定 Jaro 相似度

Jaro 相似度 = ( 1 / 3 ) * { ( 5 / 5 ) + ( 5 / 5 ) + ( 5 - 2 ) / 5 } = 0.86667

Python 中 Jaro 相似度的实现

上述方法的实现如下。

代码

程序说明

此 Python 程序用于计算两个输入字符串 (s1 和 s2) 之间的 Jaro 相似度。Jaro 相似度是一种相似度指标,其值介于 0 和 1 之间,1 表示两个字符串完全匹配。程序首先验证输入字符串是否等效,然后返回最大的相似度 1.0。接着确定字符串的长度,指定允许的最大匹配距离,并初始化计数器。为了在给定距离内找到第二个字符串中的匹配项,程序会遍历第一个字符串中的字符。哈希数组用于跟踪匹配项,并计算换位数。

输出

0.733333
  • 时间复杂度: O(N * M),其中 N 和 M 分别是 s1 和 s2 的字符串长度。
  • 辅助空间: O(N + M)

Jaro-Winkler 相似度

Jaro-Winkler 相似度是一种字符串度量,用于计算两个字符串之间的编辑距离。Winkler-Jaro 相似度和 Jaro 相似度非常相似。当两个字符串的前缀匹配时,它们会产生分歧。Jaro-Winkler 相似度使用前缀因子“p”来在字符串共享特定最大长度 (l) 的前缀时提供更精确的结果。

示例

计算

Jaro-Winkler 相似度定义如下

其中

  • Sj 是 Jaro 相似度。
  • Sw 是 Jaro-Winkler 相似度。
  • P 是比例因子(默认为 0.1)。
  • L 是匹配前缀的长度,最多为四个字符。
  • 假设 s1="arnab" 和 s2="aranb"。两个字符串的 Jaro 相似度为 0.933333。(基于上述计算。)
  • 我们假设比例因子为 0.1,匹配前缀的长度为 2。
  • 更改公式中的一个值

Jaro-Winkler 相似度= 0.9333333 + 0.1 * 2 * (1-0.9333333) = 0.946667

Python 中 Jaro-Winkler 相似度的实现

以上方法的实现如下:

代码

程序说明

此 Python 程序实现了用于比较两个字符串的 Jaro 相似度和 Jaro-Winkler 相似度度量。jaro_distance 函数在确定 Jaro 相似度时会考虑字符串的长度、允许的最大匹配距离以及具有潜在换位的匹配次数。通过添加公共前缀并根据前缀的长度修改相似度分数,jaro_Winkler 函数进一步提高了相似度。对于两个示例字符串(“TRATE”和“TRACE”),驱动代码演示了如何使用 Jaro-Winkler 相似度并输出分数。拼写检查和记录链接是使用这些相似度度量的两个常见字符串匹配应用。

输出

Jaro-Winkler Similarity = 0.9066666666666667
  • 时间复杂度: O(N * M),其中 N 和 M 分别是 s1 和 s2 的字符串长度。
  • 辅助空间: O(N + M)。