我正在尝试编写一个函数来检测用户输入特定短语/句子/单词/单词的准确程度。我的目标是构建一个应用程序来训练用户对某些短语的打字准确性。
我最初的直觉是使用基本的levenshtein距离算法(主要是因为这是我头脑中唯一知道的算法)。
但经过一番研究后,我发现Jaro-Winkler是一个稍微有趣的算法,因为它考虑了换位。
我甚至找到了一个链接,讨论了这些算法之间的差异:
Difference between Jaro-Winkler and Levenshtein distance?
阅读完所有内容后,除了各自的维基百科帖子外,对于哪种算法最符合我的目标,我仍然有点无能为力。
答案 0 :(得分:4)
由于您正在评估打字质量,并且您希望训练学生犯错误,您应该使用Levenshtein距离,因为它不太宽容。
此外,Levenshtein得分比Jaro-Winkler结果更直观易懂,更易于图形化表示。您可以修改Levenshtein算法以单独报告插入,删除和错误,并向最终用户显示更正列表。另一方面,Jaro-Winkler给你一个难以向最终用户展示的分数,因为中间拼写错误的惩罚低于最后的惩罚。
答案 1 :(得分:3)
轻微的诙谐,但只是轻微的:建立一个生成键入的生成模型,提供高(先验)概率击中正确的字母,并分配出一次击中两个相邻键的概率,来自不同的两个键手按错误的顺序,同一只手的两个按键顺序错误,正确的一个按键附近,一个远离正确的按键等等。或者可能不那么特别:给你的模型一个给定序列的概率给出了继续通过所需的当前密钥对的按键。你可以用这样的模型做很多事情;例如,您可以通过给出学习者实际表现的可能性得分来获得类似“距离”的指标。但更好的方法是给他们一份报告,总结他们最有利于哪种错误 - 毕竟,为什么许多数字会把他们的表现降到一个数字呢?如果你从大量真实打字员的工作中学习不同类型错误的可能性,那么奖励积分。
答案 2 :(得分:1)
我大多同意dasblinkenlight给出的答案,但是,建议使用Damerau-Levenshtein distance而不是仅使用Levenshtein,即包括换位。换位是相当频繁的,并且在打字时很容易进行,并且没有充分的理由说明为什么他们应该对其他可能的错误(插入,删除和替换)产生双倍距离惩罚。