ruby中大型数组中的快速近似字符串匹配

时间:2014-02-15 20:08:04

标签: ruby algorithm levenshtein-distance fuzzy-search

在Ruby中,我有一个由大约一百万个名为dictionary_array的字符串组成的数组。我有另一个数组,包含大约数千个名为arr的字符串。

对于arr中的每个元素,我想在dictionary_array中找到最接近的元素。

迭代arr中的每个元素,并arr中的每个元素迭代dictionary_array中的每个元素,找到具有最小Levenshtein距离的元素为O(n ^ 2)对我来说太慢了。

有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:1)

通过在您的问题中添加预计算来找到这篇有趣的文章:

http://stevehanov.ca/blog/index.php?id=114

代码在Python中,但应该可以翻译。

答案 1 :(得分:0)

对两个列表中每个单词的字母进行排序。然后交叉两个列表。考虑候选人靠近交叉点。然后反向排序两个列表中的字母并重复该过程。这应该会大大缩小候选人名单,所以你只需要进行大约6-12次Levenshtein比较而不是每个单词一百万次。

答案 2 :(得分:0)

我意识到你发布问题已经过了几周,而且你可能已经找到了合理的解决方案。尽管如此,在寻找类似问题的解决方案时,我不仅遇到了您的问题,还遇到了由Naoaki Okazaki开发的名为SimString的库。该库是用C ++编写的,但Okazaki描述了如何设置适当的Ruby绑定。您可能需要稍微更改一下数据结构才能最有效地使用库,但看起来它可以满足您的需求。我希望它能够解决我自己的问题。