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

ruby中大型数组中的快速近似字符串匹配,ruby,algorithm,levenshtein-distance,fuzzy-search,Ruby,Algorithm,Levenshtein Distance,Fuzzy Search,在Ruby中,我有一个由大约一百万个字符串组成的数组,名为dictionary\u array。我有另一个数组,由大约1000个字符串组成,称为arr 对于arr中的每个元素,我想在dictionary\u数组中找到最接近的元素 迭代arr中的每个元素,对于arr中的每个元素,迭代dictionary\u数组中的每个元素,以找到最小Levenshtein距离为O(n^2)且对于我来说太慢 有更好的方法解决这个问题吗?通过在问题中添加预计算,找到了这篇有趣的文章: 代码是用Python编写的,但

在Ruby中,我有一个由大约一百万个字符串组成的数组,名为
dictionary\u array
。我有另一个数组,由大约1000个字符串组成,称为
arr

对于
arr
中的每个元素,我想在
dictionary\u数组
中找到最接近的元素

迭代
arr
中的每个元素,对于
arr
中的每个元素,迭代
dictionary\u数组
中的每个元素,以找到最小Levenshtein距离为O(n^2)且对于我来说太慢


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

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


代码是用Python编写的,但应该可以翻译。

对两个列表中每个单词的字母进行排序。然后将两个列表相交。考虑考生接近交叉点。然后对两个列表中的字母进行反向排序,并重复此过程。这将大大缩小候选名单,因此你只需对每个单词进行6-12次Levenshtein比较,而不是100万次比较。

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

Ruby不是解决这个问题的语言。定义太慢了。需要多长时间?你能运行一次并缓存结果吗?阿奎那,不缓存是不可能的等等,那么你想做什么?只有城市名称的别名吗?如果是这样的话,你就把事情复杂化了。:)换句话说,你问“有没有更好的方法来解决这个问题?”但问题是什么。您提出了一个问题的解决方案,并询问了如何更有效地实施该解决方案。但你想解决的最初问题是什么?换句话说,您正在实现的用例是什么?看:你可能会丢掉最低的候选人。如何避免这种情况?暴力搜索100万x 1000对比根本不能回答我的问题你不可能白白得到一些东西。我已经解释了解决你问题的实际方法。除非使用一种将匹配算法与交线相结合的算法,否则无法获得精确匹配,而这种算法将极其复杂。你可以花几个月的时间来做。你最好的做法是实施我上面概述的简单解决方案。这不是我的问题。实际上有很多关于近似字符串匹配的资料,OP肯定不是第一个遇到这个问题的人