我有一个巨大的字符串列表(城市名称),我想找到一个城市的名字,即使用户输入错字。
实施例
用户输入“chcago”,系统找到“Chicago”
当然,我可以计算列表中所有字符串的查询的Levenshtein距离,但这可能会非常慢。
有没有有效的方法来执行这种字符串匹配?
答案 0 :(得分:4)
我认为基本思想是使用Levenshtein距离,但是使用名称的子集。如果名称足够长,一种方法是使用n-gram。您可以存储n-gram,然后使用更有效的技术来表示至少x n-gram需要匹配。唉,你的示例拼写错误有3个匹配3克,芝加哥5个(除非你在开始和结束时计算部分)。
对于较短的名称,另一种方法是将字母存储在每个名称中。所以,"芝加哥"会变成6"元组":" c"," h","我"," a",& #34; g"," o"。您将对输入的名称执行相同操作,然后要求4或5匹配。这是一个相当简单的匹配操作,所以它可以非常快。
然后,在这个缩小的集上,应用Levenshtein距离来确定最接近的匹配。
答案 1 :(得分:1)
你要求在不使用Levenshtein的情况下确定Levenshtein。
在确定单词之前,您必须确定单词可以偏离多远,并确定应用这种不太准确的算法是否可以接受。例如,您可以查找常用的切换类型字母并将其限制为该字母。或者应用此paper中的第一个/最后一个字母规则。您还可以假设前几个字母是正确的并在排序列表中查找城市,如果您没有找到它,请将Levenshtein应用于n-1和n + 1个单词,其中n是最后查找的位置(或其中的一些变体)。
有几个想法,但我认为没有一个最佳解决方案可以满足您的要求,而无需更多假设。
答案 2 :(得分:1)
基于Levenshtein距离(或服从三角不等式的任何其他度量)在文本字符串上搜索模糊匹配的有效方法是Levenshtein automaton。它以Lucene project(Java)实现,特别是Lucene.net project(C#)。此方法运行速度很快,但实现起来非常复杂