【问题标题】:fast approximate string matching in a large array in rubyruby中大型数组中的快速近似字符串匹配
【发布时间】:2014-03-15 04:57:58
【问题描述】:

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

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

遍历arr 中的每个元素,并且对于arr 中的每个元素,遍历dictionary_array 中的每个元素以找到具有最小Levenshtein 距离的元素是O(n^2),对于我的目的来说太慢了.

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

【问题讨论】:

  • Ruby 不是那种语言。
  • 定义太慢。多久时间?你能运行一次并缓存结果吗?
  • 阿奎那,这里不可能没有缓存
  • 等等,你想做什么?只是有城市名称的别名吗?如果是这样,那你就太复杂了。 :)
  • 换句话说,你问“有没有更好的方法来解决这个问题?”但是的问题。您提出了a 问题的解决方案,并询问如何更有效地实施该解决方案。但是您要解决的原始问题是什么?换句话说,您正在实施的用例是什么?见:meta.stackexchange.com/questions/66377/what-is-the-xy-problem

标签: ruby algorithm levenshtein-distance fuzzy-search


【解决方案1】:

通过向您的问题添加预计算发现这篇有趣的文章:

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

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

【讨论】:

    【解决方案2】:

    对两个列表中每个单词的字母进行排序。然后将两个列表相交。考虑候选人靠近交叉点。然后对两个列表中的字母进行反向排序并重复该过程。这应该会显着缩小候选列表,因此您只需进行大约 6 到 12 次 Levenshtein 比较,而不是对每个单词进行 100 万次比较。

    【讨论】:

    • 您可能会丢弃最低候选人。如何避免?
    • 暴力搜索 100 万 x 1000 次比较
    • 这根本不能回答我的问题
    • 你不能一无所获。我已经解释了解决您的问题的实用方法。除了使用将匹配算法与相交相结合的算法外,没有办法获得精确匹配,这种算法将非常复杂。你可以花几个月的时间来研究它。您最好的做法是实施我上面概述的简单解决方案。
    • 这不是我的问题。实际上有很多关于近似字符串匹配的材料,OP肯定不是第一个遇到这个问题的人
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 2013-11-29
      • 2011-05-11
      • 2013-04-15
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多