宽松的字符串比较

时间:2013-12-16 16:47:56

标签: javascript string

我想在JavaScript中执行permissive / lenient字符串比较,如下所示:

Morocco = Moroco = Moroko = Morokko = Marocco = Maroco
Russia = Rusia
US = USA
Bucharest = Buharest
Afghanistan = Afganistan
Bangkok = Bankok
etc..

使用第三方API时将使用这些比较。我不会在我的应用程序中做出任何选择,但我的目标是为用户提供最佳选择。用户将决定什么对他来说没问题。

你能指出正确的方法吗?我想到的唯一想法是使用字符校验和并比较它们。也许有更好的方法?

获得一个“匹配整数”会更好:

var n = compare("Morocco", "Marocco"); // n = 95
var m = compare("Morocco", "Marokko"); // n = 85

但该怎么做?

感谢。

3 个答案:

答案 0 :(得分:2)

我怀疑你会得到校验和的东西。

如果您不想要库而只需要一个简单的算法,则可以计算Levenshtein distance。它可能是简单的无词典中的最佳解决方案。

如果你想要更强大的东西,我建议你开始学习approximate string matching并搜索relevant libraries

答案 1 :(得分:2)

对于类似这样的事情,最好的选择是使用拼写检查库。这个库(http://www.javascriptspellcheck.com/)就是一个可行的例子。进一步了解该特定API,您可以通过AJAX阅读建议,如下所示:

o = $Spelling.AjaxSpellCheckFields(Fields)
o.onValidate = function(result) { }

我确信还有其他优秀的库可以执行类似的操作。

在算法方面,基本思想是计算用户输入的内容与字典中的单词列表之间的距离。我读到了“Bloom Filter”是一个不错的选择。有关详细信息,请参阅“What algorithm gives suggestions in a spell checker?”。

总的来说,您的算法需要能够处理以下输入:

  • 用户输入字符 - 明显但重要
  • 过去的选择 - 基本上随着时间的推移,某些错误会很常见。记住最常选择的任何错误建议或用户如何纠正自己的错误可以真正提高算法的质量。甚至可以以用户特定的方式保存此信息
  • 上下文 - 如果您知道用户应输入国家/地区代码,您的字典可能会显着缩小,这意味着您应该能够提供更好的建议

我认为通过更多的研究,这应该会让你走上正轨。祝你好运!

答案 2 :(得分:0)

您应该尝试使用类似Damerau-Levenshtein距离的相似性算法来比较这些值。这是javascript中的一个实现:

Sort an array by the "Levenshtein Distance" with best performance in Javascript