我正在做一个非常酷的家庭作业,通过使用带有文本T的字典D,我应该扫描文本T,并且对于T中的每个单词而不是D,通过至少执行以下操作之一生成可能正确拼写的列表以下常见的拼写错误:交换两个相邻的字符,插入一个额外的字符,删除一个字符,以及将一个字符替换为另一个字符。
我不确定如何处理最后一部分,但这是我到目前为止所做的:
1。)使用任何一种java方法将每个单词分成字符串数组I中的条目。 2.)使用索引为k的for循环转到I中的每个条目,并使用get(k)查看我们的字典中是否存在该单词。如果没有,请将该单词添加到另一个字符串数组MisspelledWords []。
3.)我怎样才能有效地进行常见的拼写错误检查?现在我只能想到效率极低的事情,比如随意改变最后一个字母或其他东西。
谢谢!
答案 0 :(得分:1)
有几个指示可以帮助你入门。如果要有效地存储和检索具有公共前缀的单词,请尝试prefix tree。对于拼写检查部分,请阅读edit distance。
此外,对于一个简单但实用且解释良好(且简短!)的实现,请参阅Norvig的this article。
答案 1 :(得分:1)
基本上你想要计算你的'坏'单词和字典中每个单词之间的Levenshtein距离。它不是一个“廉价”的过程,在计算上,但它可以让你轻松地检测到简单的换位/单字符差异。
简而言之,L.D。是通过在每个步骤中添加/删除/更改单个字符将一个字符串转换为另一个字符串所需的“步骤”数。
color / colour = LD of 1
mad / min = LD of 2 ( mad -> man -> min
答案 2 :(得分:1)
我有一个very similar to this one的学校项目。
基本理论是你想要计算单词T和字典D中所有单词之间的Levenshtein Distance。然后你呈现前X个结果,其中距离越低越好。
我同意这个项目是我最喜欢的项目之一。我发现的一个有趣的特性是在结果表中存在特定的对称性,这允许算法的简单多线程。
祝你好运!答案 3 :(得分:0)
我能想到的答案是有效地使用排序。基本上这是找出字谜的方法。
你拿着你的字典,对每个单词进行排序并将其放入哈希值。例如。狗,上帝 - >排序后 - > DGO。所以在DGO你会有狗和上帝(喜欢链式哈希)。
现在您对拼写错误的单词进行排序并找到匹配的位置。并且您将逐个字符与属于同一个存储桶的所有其他单词进行比较。
警告:
如果缺少字母,则无法检测到。也许在比较拼写错误的单词时,我们可以考虑任何包含所有字母的桶。 (例如)如果你正在寻找好,而你有上帝(希望没有上帝的话)。你会排序并有dgo。你可以看看有超过一半字母的任何桶。在这种情况下,2个字母。
一旦你创建了这个哈希(一次性费用),你的效率就会很高。如果有任何改进,请告诉我。
答案 4 :(得分:0)
编写一个比较两个单词的算法,并使用老师给你的规则来确定一个单词是否可能是另一个单词的拼写错误。如果你遇到困难,请查看Damerau-Levenshtein distance这是一个修改后的Levenshtein距离,它将转置的字符考虑在内。
然后,您需要使用该算法将每个拼写错误的单词与词典中的每个单词进行比较。提示算法效率更高的一个提示:您可以在不计算距离函数的情况下消除大量单词作为候选项(考虑n个字符单词与n + 2个单词的最小距离)。