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

String 快速从数据库中获取模糊字符串匹配,string,fuzzy-search,String,Fuzzy Search,我有一个约15万单词的数据库和一个模式(任何单个单词),我想从数据库中获取所有单词,该数据库与模式之间的距离小于给定数字。我需要做得非常快。你能推荐什么算法?如果没有好的达梅劳-列文施泰因距离算法,也欢迎使用列文施泰因距离 谢谢你的帮助 另外,我不打算使用SOUNDEX。我建议您调查一下 我不确定它是否满足您对精度的要求,但它很快 我认为如果不实际枚举所有行,就无法计算此类函数。 因此,解决办法是: 使其成为一个非常快速的枚举(但这并不能真正扩展) 以某种方式过滤初始变量(按字母索引,至少x个常

我有一个约15万单词的数据库和一个模式(任何单个单词),我想从数据库中获取所有单词,该数据库与模式之间的距离小于给定数字。我需要做得非常快。你能推荐什么算法?如果没有好的达梅劳-列文施泰因距离算法,也欢迎使用列文施泰因距离

谢谢你的帮助


另外,我不打算使用SOUNDEX。

我建议您调查一下


我不确定它是否满足您对精度的要求,但它很快

我认为如果不实际枚举所有行,就无法计算此类函数。
因此,解决办法是:

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

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


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

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

    然后可以使用此函数将您的输入与每个字符串进行比较,以检查距离,如果它超出阈值,则继续下一步

    例如,我还认为您可以将最大距离设置为2,然后过滤长度超过1的所有单词,同时第一个字母不同。有了索引,这可能会稍微快一点

    您还可以使用快捷方式返回所有完全匹配的字符串(索引将加快速度),因为计算0的Levenshtein距离实际上需要更长的时间


    只是一些想法……

    我使用KNIME进行字符串模糊匹配,并得到了非常快的结果。在其中创建可视化工作流也非常容易。只需从安装KNIME free edition,然后使用“字符串距离”和“相似性搜索”节点即可获得结果。我在这里附加了一个小的模糊匹配示例工作流(在本例中,输入数据来自顶部,要搜索的模式来自底部):

    无特殊要求。算法越快越好。我试着用standart算法计算距离(如下图所示),并决定我需要更快的速度。。。或者不可见。你应该用几句话来解释,并给出更具体的链接!