我有一个约150'000个单词和一个模式(任何一个单词)的数据库,我希望从数据库中获得所有单词,其中Damerau-Levenshtein与它之间的距离较小比给定的数字。我需要这样做非常快。你能建议什么算法?如果Damerau-Levenshtein距离没有好的算法,那么也欢迎Levenshtin距离。
感谢您的帮助。
P.S。我不打算使用SOUNDEX。
答案 0 :(得分:2)
我将从一个SQL函数开始计算Levenshtein距离(在T-SQl或.Net中)(是的,我是一个MS人......),其最大距离参数会导致提前退出。 / p>
然后可以使用此函数将输入与每个字符串进行比较,以检查distanve,如果它突破阈值,则转到下一个。
我也在想你可以,例如,将最大距离设置为2,然后过滤掉长度大于1的所有单词,而第一个字母不同。使用索引可能会稍快一些。
你也可以快捷方式带回所有完美匹配的字符串(索引会提高速度),因为这些实际需要更长的时间来计算Levenshtein距离为0。
只是一些想法......
答案 1 :(得分:1)
我认为你不能在没有实际列举所有行的情况下计算出这种功能 所以解决方案是:
答案 2 :(得分:0)
我头脑中的解决方案可能是将数据库存储在有序集合中(例如,C ++中的std::set
),因为在我看来,按字典顺序排序的字符串会比较好。要近似set
中给定字符串的位置,请在字符串上使用std::upper_bound
,然后在两个方向上从找到的位置向外迭代集合,计算距离,并在何时停止它低于某个阈值。我觉得这个解决方案可能只匹配具有相同起始字符的字符串,但如果你使用该算法进行拼写检查,那么这种限制很常见,或者至少不足为奇。
编辑:如果您正在寻找算法本身的优化,那么这个答案是无关紧要的。
答案 3 :(得分:0)
我使用KNIME进行字符串模糊匹配,结果非常快。在其中制作可视化工作流程也非常容易。只需从https://www.knime.org/安装KNIME免费版,然后使用" String Distance"和"相似性搜索"节点来获得结果。我在这里附加了一个小的模糊匹配smaple工作流程(输入数据来自顶部,在这种情况下搜索的模式来自底部):
答案 4 :(得分:-1)
我建议您查看Ankiro。
我不确定它是否符合您对精度的要求,但速度很快。