我有一个有序的收藏品:
[Doc1, Doc2, Doc3, Doc4, Doc5]
其中Doc1排在Doc2
之前(想象一下搜索查询情况,此有序集合是搜索结果。
现在,说我有第二个有序集合:
[Doc1, Doc2, Doc3, Doc5, Doc4]
我需要一种方法来将这种差异量化为数值分数。它还必须考虑到权重,以便[Doc1, Doc2, Doc3, Doc5, Doc4]
更接近原始集合,然后是[Doc2, Doc1, Doc3, Doc4, Doc5]
,因为差异更接近顶部。
我考虑过Levenshtein的差异,但看不出如何考虑订单。
答案 0 :(得分:1)
According to Wikipedia 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