我需要为某个需求编写解决方案代码,我想知道是否有人熟悉可以实现它的现成库,或者可以指导我进行最佳实践。说明:
用户输入一个应该是几个固定选项之一的单词(我在列表中保存选项)。我知道输入必须在列表中的成员中,但由于它是用户输入,他/她可能犯了一个错误。我正在寻找一种算法,告诉我用户最可能的单词是什么意思。我没有任何上下文,我不能强迫用户从列表中选择(即他必须能够自由和手动输入单词)。
例如,说该列表包含“水”,“季度”,“啤酒”,“甜菜”,“地狱”,“你好”和“土豚”等字样。
解决方案必须考虑到不同类型的“正常”错误:
显而易见的解决方案是逐个字母地比较,并给每个不同的字母,额外的字母和遗失的字母赋予“惩罚权重”。但是这个解决方案忽略了数千个“标准”错误,我肯定会在某处列出。我确信那里有针对所有案例的启发式方法,包括具体和一般情况,可能使用标准不匹配的大型数据库(我对数据量大的解决方案持开放态度)。
我在Python编码,但我认为这个问题与语言无关。
任何建议/想法?
答案 0 :(得分:10)
您想了解Google如何执行此操作:http://norvig.com/spell-correct.html
编辑:有些人提到了定义用户给定单词和候选单词(levenshtein,soundex)之间的度量的算法。然而,这不是问题的完整解决方案,因为人们还需要数据结构来有效地执行非欧几里得最近邻搜索。这可以通过例如完成。封面树:http://hunch.net/~jl/projects/cover_tree/cover_tree.html
答案 1 :(得分:6)
常见的解决方案是计算输入和固定文本之间的Levenshtein distance。两个字符串的Levenshtein距离只是简单操作的数量 - 单个字符的插入,删除和替换 - 将其中一个字符串转换为另一个字符串。
答案 2 :(得分:2)
您是否考虑过通过语音来比较的算法,例如soundex?生成单词列表的soundex表示,存储它们,然后获取用户输入的soundex并找到最接近的匹配应该不会太难。
答案 3 :(得分:1)
寻找Bitap算法。它很适合您想要做的事情,甚至还附带了维基百科中的源代码示例。
答案 4 :(得分:1)
如果您的数据集非常小,只需将所有项目上的Levenshtein距离进行独立比较就足够了。但是,如果它更大,则需要使用BK-Tree或类似的索引系统。我链接的文章描述了如何在给定的Levenshtein距离内找到匹配,但是适应最近邻搜索是相当简单的(并留给读者做练习)。
答案 5 :(得分:0)
虽然它可能无法解决整个问题,但您可能需要考虑使用soundex算法作为解决方案的一部分。快速谷歌搜索“soundex”和“python”显示了该算法的一些python实现。
答案 6 :(得分:0)
尝试搜索“Levenshtein距离”或“编辑距离”。它计算将一个单词转换为另一个单词所需的编辑操作(删除,插入,更改字母)的数量。这是一种常见的算法,但根据问题,您可能需要针对不同类型的拼写错误使用不同权重的特殊内容。