Jaro-winkler 相似性简介(定义和示例)


在统计学中, Jaro-Winkler 相似度是衡量两个字符串之间相似度的一种方法。

两个字符串之间的Jaro 相似度(sim j ) 定义为:

sim j = 1/3 * ( m /|s 1 | + m/|s 2 | + (mt)/m )

金子:

  • m : 匹配字符的数量
    • 如果 s 1和 s 2的两个字符相同且彼此相差不超过 [max(|s 1 |, |s 2 |) / 2] – 1 个字符,则认为它们匹配。
  • |s 1 | , |s 2 | :分别是第一个和第二个字符串的长度
  • t :换位次数
    • 计算方式为匹配字符数(但序列顺序不同)除以 2。

Jaro-Winkler 相似度(sim w ) 定义为:

sim w = sim j + lp(1 – sim j )

金子:

  • sim j :两个字符串 s 1和 s 2之间的 Jaro 相似度
  • l :字符串开头的公共前缀的长度(最多 4 个字符)
  • p :缩放因子,指示分数向上调整多少以具有公共前缀。通常,这被定义为 p = 0.1 并且不应超过 p = 0.25。

两个字符串之间的 Jaro-Winkler 相似度始终介于 0 和 1 之间,其中:

  • 0表示字符串之间不相似
  • 1表示字符串完全匹配

注意:Jaro-Winkler距离定义为 1 – sim w

下面的示例展示了如何在实践中计算两个字符串之间的 Jaro-Winkler 相似度。

示例:计算两个字符串之间的 Jaro-Winkler 相似度

假设我们有以下两个字符串:

  • 通道 1 (s 1 ):鼠标
  • 通道 2 (s 2 ):静音

首先,我们来计算这两个字符串之间的 Jaro 相似度:

sim j = 1/3 * ( m /|s 1 | + m/|s 2 | + (mt)/m )

金子:

  • m : 匹配字符的数量
    • 如果 s 1和 s 2的两个字符相同且彼此相差不超过 [max(|s 1 |, |s 2 |) / 2] – 1 个字符,则认为它们匹配。

在这种情况下,[max(|s 1 |, |s 2 |) / 2] – 1 计算为 5/2 – 1 = 1.5。我们将定义三个对应的字母:m、u、e。所以, m = 3

  • |s 1 | , |s 2 | :分别是第一个和第二个字符串的长度

在这种情况下, |s 1 | = 5|s 1 | = 4

  • t :换位次数
    • 计算方式为匹配字符数(但序列顺序不同)除以 2。

在本例中,存在三个匹配字符,但它们已经具有相同的顺序,因此t = 0

因此,我们将计算 Jaro 相似度如下:

模拟j = 1/3 * (3/5 + 3/4 + (3-0)/3) = 0.78333。

接下来,我们计算 Jaro-Winkler 相似度 (sim w ),如下所示:

sim w = sim j + lp(1 – sim j )

在这种情况下,我们将计算:

模拟w = 0.78333 + (1)*(0.1)(1 – 0.78333) = 0.805。

两条链之间的 Jaro-Winkler 相似度为0.805

由于该值接近 1,这告诉我们这两个字符串非常相似。

我们可以通过计算 R 中两个字符串之间的 Jaro-Winkler 相似度来确认这是正确的:

 library (stringdist)

#calculate Jaro-Winkler similarity between 'mouse' and 'mute'
1 - stringdist("mouse", "mute", method = "jw", p= 0.1 )

[1] 0.805

这对应于我们手动计算的值。

其他资源

以下教程解释了如何计算其他相似性指标:

布雷-柯蒂斯相异性简介
Jaccard相似指数简介

添加评论

您的电子邮箱地址不会被公开。 必填项已用*标注