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
这对应于我们手动计算的值。
其他资源
以下教程解释了如何计算其他相似性指标: