从数据库中快速获得模糊字符串匹配

时间:2010-01-20 07:59:37

标签: string fuzzy-search

我有一个约150'000个单词和一个模式(任何一个单词)的数据库,我希望从数据库中获得所有单词,其中Damerau-Levenshtein与它之间的距离较小比给定的数字。我需要这样做非常快。你能建议什么算法?如果Damerau-Levenshtein距离没有好的算法,那么也欢迎Levenshtin距离。

感谢您的帮助。

P.S。我不打算使用SOUNDEX。

5 个答案:

答案 0 :(得分:2)

我将从一个SQL函数开始计算Levenshtein距离(在T-SQl或.Net中)(是的,我是一个MS人......),其最大距离参数会导致提前退出。 / p>

然后可以使用此函数将输入与每个字符串进行比较,以检查distanve,如果它突破阈值,则转到下一个。

我也在想你可以,例如,将最大距离设置为2,然后过滤掉长度大于1的所有单词,而第一个字母不同。使用索引可能会稍快一些。

你也可以快捷方式带回所有完美匹配的字符串(索引会提高速度),因为这些实际需要更长的时间来计算Levenshtein距离为0。

只是一些想法......

答案 1 :(得分:1)

我认为你不能在没有实际列举所有行的情况下计算出这种功能 所以解决方案是:

  1. 使其成为一个非常快速的枚举(但这不会真正扩展)
  2. 以某种方式过滤初始变体(以字母索引,至少x个常用字母)
  3. 使用替代(可索引)算法,例如N-Grams(但我没有关于ngrams与D-L距离的结果质量的详细信息)。

答案 2 :(得分:0)

我头脑中的解决方案可能是将数据库存储在有序集合中(例如,C ++中的std::set),因为在我看来,按字典顺序排序的字符串会比较好。要近似set中给定字符串的位置,请在字符串上使用std::upper_bound,然后在两个方向上从找到的位置向外迭代集合,计算距离,并在何时停止它低于某个阈值。我觉得这个解决方案可能只匹配具有相同起始字符的字符串,但如果你使用该算法进行拼写检查,那么这种限制很常见,或者至少不足为奇。

编辑:如果您正在寻找算法本身的优化,那么这个答案是无关紧要的。

答案 3 :(得分:0)

我使用KNIME进行字符串模糊匹配,结果非常快。在其中制作可视化工作流程也非常容易。只需从https://www.knime.org/安装KNIME免费版,然后使用" String Distance"和"相似性搜索"节点来获得结果。我在这里附加了一个小的模糊匹配smaple工作流程(输入数据来自顶部,在这种情况下搜索的模式来自底部): enter image description here

答案 4 :(得分:-1)

我建议您查看Ankiro

我不确定它是否符合您对精度的要求,但速度很快。