在ms word中查看此示例; 我故意拼错'complemet'这个词来向你展示我的意思;
我想知道ms的词是如何选择与我输入的词最相似的词(我的意思是算法)
这不是拼写检查的情况,但找到最相似的单词(如图片中的结果)
我想实现一个算法,这样我就可以找到与用户已输入的内容最相似的单词;
答案 0 :(得分:0)
这称为Levensthein Distance。它衡量两个随机单词在删除,插入和替换单个字符方面的差异。
(为了提高效率,您可能不希望将任何单词与整个单词列表进行比较。您可能希望使用一种或多种其他方法快速剔除以剔除可能的替代方法。)
(编辑)
这很有趣! :)只是为了看它是如何工作的我在C中实现了这个,使用OSX的默认words
列表和Wikibooks上的算法的C版本。以下是您的“complment”的前10个点击:
'complment' -> LD=compliment(1)
LD=complement(1)
LD=component(2)
LD=couplement(2)
LD=comment(2)
LD=compellent(2)
LD=competent(2)
LD=compilement(2)
LD=complacent(2)
LD=complaint(2)
比较例程保留了一小部分'迄今为止最好'的匹配,当数组填满时,最高值被丢弃。 对列表中的每个单词(235,886个单词)进行全距离计算需要0.370秒。
我添加了一个快速剔除程序,检查输入中的每个字母在比较字中是否至少出现过一次(简单的位测试),以及每个其他字母依次出现。这大大缩短了第三个时间:0.150秒。
我尝试了一些随机的其他单词(并非显示所有可能的解决方案):
'unforutntately' -> LD=unfortunately(3) LD=infortunately(4) LD=fortunately(5)
'abcacadabra' -> LD=abracadabra(1) LD=barracuda(7)
'athtahn' -> LD=Ethan(3) LD=thawn(3) LD=Pathan(3) LD=attaghan(3)
'jongware' ->
...最后一个产生的没有匹配。只有在删除我的One-Character-Off例程后我才能获得
'jongware' -> LD=nonglare(2)
LD=congiary(3)
LD=henware(3)
LD=hogward(3)
LD=honeyware(3)
哦,好吧。
(进一步编辑)自从你写了
这不是拼写检查的情况,而是查找最相似的单词
我用'恭维'拼写正确再次运行它。这就是结果:
'compliment' -> LD=compliment(0)
LD=complement(1)
LD=complimenter(2)
LD=compliant(2)
LD=complicant(2)
LD=complacent(2)
LD=couplement(2)
如您所见,第一个值为'0' - 完全匹配 - 其他词是'相似'。