Jaro-winkler の類似性の概要 (定義と例)
統計におけるJaro-Winkler 類似度は、2 つの文字列間の類似性を測定する方法です。
2 つの文字列間のJaro 類似度(sim j ) は次のように定義されます。
sim j = 1/3 * ( m /|s 1 | + m/|s 2 | + (mt)/m )
金:
- m : 一致する文字の数
- s 1と s 2の 2 つの文字が同じで、[max(|s 1 |, |s 2 |) / 2] – 1 文字以内の場合、一致するとみなされます。
- |s 1 | 、 |s 2 | : それぞれ 1 番目と 2 番目の文字列の長さ
- t : 転置数
- 一致する文字の数 (ただし順序は異なります) を 2 で割って計算されます。
Jaro-Winkler 類似度(sim w ) は次のように定義されます。
sim w = sim j + lp(1 – sim j )
金:
- sim j : 2 つの文字列 s 1と s 2間の Jaro 類似度
- l : 文字列先頭の共通プレフィックスの長さ(最大4文字)
- p : 共通のプレフィックスを持たせるためにスコアがどの程度上方調整されるかを示すスケーリング係数。通常、これは p = 0.1 として定義され、p = 0.25 を超えてはなりません。
2 つの文字列間の Jaro-Winkler 類似度は常に 0 と 1 の間になります。
- 0 は文字列間に類似性がないことを示します
- 1 は文字列が正確に一致することを示します
注: Jaro-Winkler距離は1 – sim wとして定義されます。
次の例は、実際に 2 つの文字列間の Jaro-Winkler 類似度を計算する方法を示しています。
例: 2 つの文字列間の Jaro-Winkler 類似度の計算
次の 2 つの文字列があるとします。
- チャンネル 1 (s 1 ):マウス
- チャンネル 2 (s 2 ):ミュート
まず、これら 2 つの文字列間の Jaro 類似度を計算してみましょう。
sim j = 1/3 * ( m /|s 1 | + m/|s 2 | + (mt)/m )
金:
- m : 一致する文字の数
- s 1と s 2の 2 つの文字が同じで、[max(|s 1 |, |s 2 |) / 2] – 1 文字以内の場合、一致するとみなされます。
この場合、[max(|s 1 |, |s 2 |) / 2] – 1 は 5/2 – 1 = 1.5 として計算されます。 m、u、e の 3 つの文字を対応するものとして定義します。したがって、 m = 3 となります。
- |s 1 | 、 |s 2 | : それぞれ 1 番目と 2 番目の文字列の長さ
この場合、 |s 1 | = 5および|s 1 | = 4 。
- t : 転置数
- 一致する文字の数 (ただし順序は異なります) を 2 で割って計算されます。
この場合、一致する文字は 3 つありますが、それらはすでに同じ順序になっているため、 t = 0になります。
したがって、Jaro の類似度を次のように計算します。
sim j = 1/3 * (3/5 + 3/4 + (3-0)/3) = 0.78333。
次に、次のように Jaro-Winkler 類似度 (sim w ) を計算してみましょう。
sim w = sim j + lp(1 – sim j )
この場合、次のように計算します。
sim w = 0.78333 + (1)*(0.1)(1 – 0.78333) = 0.805。
2 つのチェーン間の Jaro-Winkler 類似度は0.805です。
この値は 1 に近いため、2 つの文字列が非常に似ていることがわかります。
R の 2 つの文字列間の Jaro-Winkler 類似度を計算することで、これが正しいことを確認できます。
library (stringdist) #calculate Jaro-Winkler similarity between 'mouse' and 'mute' 1 - stringdist("mouse", "mute", method = "jw", p= 0.1 ) [1] 0.805
これは手動で計算した値に対応します。
追加リソース
次のチュートリアルでは、他の類似性メトリックを計算する方法について説明します。