String 快速从数据库中获取模糊字符串匹配
我有一个约15万单词的数据库和一个模式(任何单个单词),我想从数据库中获取所有单词,该数据库与模式之间的距离小于给定数字。我需要做得非常快。你能推荐什么算法?如果没有好的达梅劳-列文施泰因距离算法,也欢迎使用列文施泰因距离 谢谢你的帮助String 快速从数据库中获取模糊字符串匹配,string,fuzzy-search,String,Fuzzy Search,我有一个约15万单词的数据库和一个模式(任何单个单词),我想从数据库中获取所有单词,该数据库与模式之间的距离小于给定数字。我需要做得非常快。你能推荐什么算法?如果没有好的达梅劳-列文施泰因距离算法,也欢迎使用列文施泰因距离 谢谢你的帮助 另外,我不打算使用SOUNDEX。我建议您调查一下 我不确定它是否满足您对精度的要求,但它很快 我认为如果不实际枚举所有行,就无法计算此类函数。 因此,解决办法是: 使其成为一个非常快速的枚举(但这并不能真正扩展) 以某种方式过滤初始变量(按字母索引,至少x个常
另外,我不打算使用SOUNDEX。我建议您调查一下
我不确定它是否满足您对精度的要求,但它很快 我认为如果不实际枚举所有行,就无法计算此类函数。
因此,解决办法是:
我脑海中浮现的一个解决方案可能是将数据库存储在一个排序集中(例如,C++中的
std::set
),因为在我看来,按字典排序的字符串会比较好。若要近似给定字符串在集合中的位置,请在字符串上使用std::upper_bound
,然后从找到的位置开始在两个方向上向外迭代集合,计算移动时的距离,当距离低于某个阈值时停止。我有一种感觉,这种解决方案可能只会匹配具有相同起始字符的字符串,但是如果您使用算法进行拼写检查,那么这种限制很常见,或者至少不令人惊讶
编辑:如果您正在寻找算法本身的优化,那么这个答案是不相关的。我将从一个SQL函数开始计算Levenshtein距离(在T-SQL或.Net中)(是的,我是MS person…),其中的最大距离参数将导致提前退出
然后可以使用此函数将您的输入与每个字符串进行比较,以检查距离,如果它超出阈值,则继续下一步
例如,我还认为您可以将最大距离设置为2,然后过滤长度超过1的所有单词,同时第一个字母不同。有了索引,这可能会稍微快一点
您还可以使用快捷方式返回所有完全匹配的字符串(索引将加快速度),因为计算0的Levenshtein距离实际上需要更长的时间
只是一些想法……我使用KNIME进行字符串模糊匹配,并得到了非常快的结果。在其中创建可视化工作流也非常容易。只需从安装KNIME free edition,然后使用“字符串距离”和“相似性搜索”节点即可获得结果。我在这里附加了一个小的模糊匹配示例工作流(在本例中,输入数据来自顶部,要搜索的模式来自底部):
无特殊要求。算法越快越好。我试着用standart算法计算距离(如下图所示),并决定我需要更快的速度。。。或者不可见。你应该用几句话来解释,并给出更具体的链接!