两个ORDERED集合的相似性

时间:2012-10-20 07:47:36

标签: algorithm language-agnostic levenshtein-distance

我有一个有序的收藏品:

[Doc1, Doc2, Doc3, Doc4, Doc5] 

其中Doc1排在Doc2之前(想象一下搜索查询情况,此有序集合是搜索结果。

现在,说我有第二个有序集合:

[Doc1, Doc2, Doc3, Doc5, Doc4]

我需要一种方法来将这种差异量化为数值分数。它还必须考虑到权重,以便[Doc1, Doc2, Doc3, Doc5, Doc4]更接近原始集合,然后是[Doc2, Doc1, Doc3, Doc4, Doc5],因为差异更接近顶部。

我考虑过Levenshtein的差异,但看不出如何考虑订单。

1 个答案:

答案 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