String 用拼写错误匹配字符串的快速方法

String 用拼写错误匹配字符串的快速方法,string,algorithm,performance,match,fuzzy-comparison,String,Algorithm,Performance,Match,Fuzzy Comparison,我有一个巨大的字符串列表(城市名称),我想找到一个城市的名称,即使用户输入了错误 例子 用户输入“chcago”,系统会找到“Chicago” 当然,我可以为列表中的所有字符串计算查询的Levenshtein距离,但这会非常慢 有什么有效的方法来执行这种字符串匹配吗?我认为基本的想法是使用Levenshtein距离,但是在名称的子集上。如果名称足够长,一种有效的方法是使用n-gram。您可以存储n-gram,然后使用更有效的技术来表示至少x个n-gram需要匹配。唉,你的例子拼错了5个字母中有2

我有一个巨大的字符串列表(城市名称),我想找到一个城市的名称,即使用户输入了错误

例子 用户输入“chcago”,系统会找到“Chicago”

当然,我可以为列表中的所有字符串计算查询的Levenshtein距离,但这会非常慢


有什么有效的方法来执行这种字符串匹配吗?

我认为基本的想法是使用Levenshtein距离,但是在名称的子集上。如果名称足够长,一种有效的方法是使用n-gram。您可以存储n-gram,然后使用更有效的技术来表示至少x个n-gram需要匹配。唉,你的例子拼错了5个字母中有2个字母与芝加哥的3个字母匹配(除非你在开头和结尾都计算了partials)

对于较短的名称,另一种方法是在每个名称中存储字母。所以,“芝加哥”会变成6个“元组”:“c”,“h”,“i”,“a”,“g”,“o”。您可以对输入的名称执行相同的操作,然后要求4或5个匹配项。这是一个相当简单的匹配操作,因此它可以运行得相当快


然后,在这个缩减集上,应用Levenshtein距离来确定最接近的匹配是什么。

您要求在不使用Levenshtein的情况下确定Levenshtein

您必须先确定单词偏离的程度,然后才能识别,并查看是否可以接受应用这种不太准确的算法。例如,您可以查找常用类型的字母,并将其限制在该范围内。或应用此中的首字母/末字母规则。您还可以假设前几个字母是正确的,并在排序列表中查找城市,如果找不到,则将Levenshtein应用于n-1和n+1单词,其中n是最后一次查找的位置(或其变体)


有几种想法,但如果没有更多的假设,我认为没有一种最佳解决方案可以满足您的要求。

基于Levenshtein距离(或任何其他符合三角形不等式的度量)搜索文本字符串上模糊匹配的有效方法是。它是用Java语言实现的,特别是用C语言实现的。这种方法工作速度很快,但实现这一想法非常复杂——我可以将n固定在一个上限,只在一个小的子集上执行levenshtein。