ウィキペディアによると、レーベンシュタイン距離は、次の擬似コードを使用して計算できます。
int LevenshteinDistance(string s, string t)
{
int len_s = length(s), len_t = length(t), cost = 0;
if (s[0] != t[0])
cost = 1;
if (len_s == 0)
return len_t;
else if (len_t == 0)
return len_s;
else
return minimum(
LevenshteinDistance(s[1..len_s], t) + 1,
LevenshteinDistance(s, t[1..len_t]) + 1,
LevenshteinDistance(s[1..len_s], t[1..len_t]) + cost);
}
私があなたの要件を正しく理解していれば、コレクションの最初の違いが最後の違いよりも重要であることを望んでいます。この要求を反映するように、この再帰関数を適応させましょう。
float LevenshteinDistance(string s, string t, float decay)
{
int len_s = length(s), len_t = length(t), cost = 0;
if (s[0] != t[0])
cost = 1;
if (len_s == 0)
return len_t;
else if (len_t == 0)
return len_s;
else
return decay * minimum(
LevenshteinDistance(s[1..len_s], t, decay) + 1,
LevenshteinDistance(s, t[1..len_t], decay) + 1,
LevenshteinDistance(s[1..len_s], t[1..len_t], decay) + cost);
}
パラメータが区間 (0,1) に属する場合decay
、大きなインデックスの差は前のインデックスの差よりも重要ではなくなります。
の例を次に示しdecay=0.9
ます。
s t dist
"1234" "1234" 0.0000
"1234" "1243" 1.3851
"1234" "2134" 1.6290