根据维基百科,可以使用以下伪代码计算 Levenshtein 距离。
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);
}
什么时候decay
属于区间 (0,1) 的参数在较大指数上的差异变得比以前的差异更不显着。
这是decay=0.9
.
s t dist
"1234" "1234" 0.0000
"1234" "1243" 1.3851
"1234" "2134" 1.6290