Answers:
您要问的是在编辑距离下的近邻搜索问题。您没有提到您对理论结果还是启发式技术感兴趣,因此我将回答前者。
对于构建近邻搜索结构,编辑距离有些麻烦。主要问题是,作为度量标准,出于维和逼近的目的,它的行为类似于等其他众所周知的不良度量标准。关于此主题,有大量的工作需要阅读,并且最好的资料来源是Alex Andoni的论文集:通过追随往后的指针(例如,从他的FOCS 2010论文中得出),您将获得大量的资料来源。
Levenshtein自动机:http : //en.wikipedia.org/wiki/Levenshtein_automaton
如果您会容忍少量的误编辑,则可以尝试使用点缀后缀树。免责声明:我写了这篇论文,但是它可以解决您想要的东西:它具有很高的磁盘空间成本,但是查询确实非常快。
通常,最好以另一种方式查看它:您拥有字典中所有单词的索引。现在,对于输入单词w,如果它在词典中,请停止。否则,生成距离1处的所有变化并寻找这些变化。如果不存在,请寻找距离2的变化,依此类推...
此基本思想有一些改进。
我在cs.stackexchange.com(/cs//a/2096/1490)上写了一个非常类似的问题的答案,然后我发现了这个问题。答案是在编辑距离内进行近似的近邻搜索(即算法输出的字符串与查询字符串的最近邻居近似接近查询字符串)。我在这里发布,是因为我在这里给出的答案中找不到我在此给出的任何参考。
我想你想要的是瓦格纳-菲舍尔算法:https://en.wikipedia.org/wiki/Wagner%E2%80%93Fischer_algorithm的关键结论是,因为你是通过遍历字典进行排序,连续两个词很有可能共享一个长前缀,因此您无需为每次距离计算更新整个矩阵。
您可以使用您的意思吗?
然后使用“动态编程”找到“您的意思是”返回的答案与输入字符串之间的Levenshtein距离。
Did you mean?
功能。除了Did you mean?
返回与给定输入非常接近的单词,还可以非常有效地完成该操作。:)
一种方法是训练机器学习模型,以将单词映射到向量,并将levenshtein距离映射到欧氏距离。然后,您可以从向量中为您要使用的字典构建一个KDTree。我创建了一个在这里执行此操作的jupyter笔记本:https ://gist.github.com/MichaelSnowden/9b8b1e662c98c514d571f4d5c20c3a03
根据DW的评论:
模型结构摘要:
我的训练数据只是随机字符串,但是我认为,如果训练数据是(错别字/正确的单词)对,结果确实可以改善。我最终只使用了/usr/share/dict/words
它,因为它是普遍可用的。