通过ressemblance匹配2个字符串列表

时间:2011-04-07 20:21:06

标签: algorithm string list matching

问题

我有2个字符串列表。我想从我的列表中找到最匹配的对。

例如,我有这两个列表:

list1 = {"a1","b1","c1"}
list2 = {"a2","b2","c2"}

我想得到以下结果:

results = {{"a1,"a2"}, {"b1,"b2"}, {"c1,"c2"}}

其他信息

为了比较2个字符串,我想使用与Levenshtein distance类似的东西。例如,当我将"a1""a2"进行比较时,它会使"a1""b2"的距离缩短,因此"a1" + "a2"会被认为是更好的匹配。

当不同的对获得相同的距离结果时,我变得复杂。您不能只为list1中的特定项目选择最小距离,因为list1中的其他项目可以与list2中的相同项目获得相同的距离。

问题

你有算法的建议吗?

我现在在哪里

你最好不要先看我的发现,这样你就不会受到我工作的影响。

我计算每对可能的字符串的Levenshtein距离,并将结果存储在一个二维数组中。然后我构建了一个单维数组,其中每个元素都有:

  • 该对(我的二维数组中的i,j索引)
  • 距离

然后我使用distance元素对此数组进行排序。

最后,我浏览已排序的数组并一起解析具有共同距离的项目(所有距离== 0首先,然后所有距离== 1,等等...)。每次,我解析一个元素,我在我的2D数组中标记它,这样我就可以快速跳过已排序数组中已解析的项目。

我认为我可以比这个解决方案更好。它在时间和空间上可能不是最有效的。

2 个答案:

答案 0 :(得分:2)

一旦确定了要用于跟踪两个字符串之间“距离”的度量标准,无论是Levenshtein距离还是另一个字符串,您都可以使用Hungarian algorithm来解决问题。

我个人从未实现它,但维基百科包含一些可能有帮助的链接。

答案 1 :(得分:0)

我建议对此进行优化:

I calculate the Levenshtein distance for each possible pair of string and store the results in a 2-dimension array.

是否可以通过考虑长度来避免为每个可能的字符串对计算距离。因为我们说:

1. if the pair is e.g. "ab", and "cdefg"
2. and you know that there's another string that has similar length with "ab" e.g. "xy"

然后你不需要计算“ab”和“cdefg”之间的距离。因为在这些长度的字符串之间可以得到的最小距离是3,而两个相等长度的字符串之间的最大距离(如示例中的“ab”和“xy”)将是2.

您可以使用更智能的数据结构来跟踪字符串的长度,例如C ++ 0x或tr1 C ++中的unordered_map<int, vector<string> >