使用近似字符串匹配比较/匹配两列(模糊字符串匹配,levenshtein)

时间:2014-11-03 14:56:40

标签: c# hashtable levenshtein-distance

首先让我解释一下我想要实现的目标。我正在制作的应用程序应该能够相互比较两个不同表的两列。因此,第一个表中列的每个单元格都应链接到第二个表的列中最匹配的单元格。所以你会得到这样的东西:

example http://foto.modelbouwforum.nl/images/2014/11/03/Levenshtein_match.png

这可以通过使用Levenshtein算法轻松实现。所以我在c#中编写了一个测试程序,看看我是否可以重新创建与图像显示的相同的结果。我制作了两个数组,一个包含图像的第一列,另一个包含图像的第二列。将第一列的每个单元格与第二列的每个单元格进行比较,这意味着我在每个单元格上进行4次迭代(总共16次)。然后将第二列的最高匹配(具有最低levenshtein距离的匹配)链接到第一列的单元。

问题: 假设我们有两个大列,每列有100K行,这应该会产生一些严重的性能问题。因为第一列中的每个单元都需要与第二列的每个单元匹配才能获得尽可能高的匹配,因此您必须迭代100K * 100K = 100亿次。所以我必须创造一些东西以避免迭代100亿次。

我做了一些关于levenshtein可以使用的地方的研究,并且发现了这个问题:http://www.slideshare.net/fullscreen/VasileTopac/fuzzy-hash-map/4。我想知道我是否能够创建像链接中那样的人?

需要考虑的一些事项:

  • 在如此大的列中,单个单元格上可能存在多个匹配项(用户需要选择正确的单元格)。这意味着你无法做到 从当前搜索中排除先前匹配的单元格以降低迭代次数。
  • 在示例中,匹配/比较仅在两列上完成,但将来我喜欢比较表1中的单个列 表2中的所有列(用户工作量较少)。如你所料,这将是更加昂贵的时间。

注意: 我现在只使用c#4个月,我希望有人可以为我提供一个很好的起点(我不希望得到一个完整的答案,我宁愿自己做一些研究来学习它以及)。谢谢你的理解。英语不是我的母语,所以请随时编辑我的帖子。

1 个答案:

答案 0 :(得分:0)

尝试提出一些假设,它总是适用于可以将其分割成较小块的匹配,如:

  

表1中的第一个大写字母字符必须与表2中的第一个大写字母字符匹配

您可以找到一些有效的假设,允许您将值预处理到另一列:

FirstAlpha1   FirstAlpha2
===========   ===========
P             C
S             F
C             P
F             S

然后你可以对这个额外的值进行简单的排序和连接(完全匹配),将解决方案分成更小的块。