Java 从拼写错误的单词创建可能正确拼写的列表

Java 从拼写错误的单词创建可能正确拼写的列表,java,dictionary,Java,Dictionary,我正在做一个非常酷的家庭作业,通过使用带文本T的字典D,我应该扫描文本T,并且对于T中不在D中的每个单词,至少通过以下一种常见拼写错误生成一个可能正确拼写的列表:交换两个相邻字符,插入一个额外字符,删除单个字符,并将一个字符替换为另一个字符 我不确定如何进行最后一部分,但以下是我到目前为止的情况: 1.)使用任何一种java方法将每个单词分隔成字符串数组I中的一个条目。 2.)使用索引为k的for循环转到I中的每个条目,并使用get(k)查看字典中是否存在该单词。如果没有,请将该单词添加到另一个

我正在做一个非常酷的家庭作业,通过使用带文本T的字典D,我应该扫描文本T,并且对于T中不在D中的每个单词,至少通过以下一种常见拼写错误生成一个可能正确拼写的列表:交换两个相邻字符,插入一个额外字符,删除单个字符,并将一个字符替换为另一个字符

我不确定如何进行最后一部分,但以下是我到目前为止的情况:

1.)使用任何一种java方法将每个单词分隔成字符串数组I中的一个条目。 2.)使用索引为k的for循环转到I中的每个条目,并使用get(k)查看字典中是否存在该单词。如果没有,请将该单词添加到另一个字符串数组拼写错误的单词[]

3.)我怎样才能有效地进行这些常见的拼写错误检查?现在,我只能想一些效率很低的事情,比如随意更改最后一个字母之类的


谢谢

好吧,有几点建议让你开始学习。如果您想高效地存储和检索带有常用前缀的单词,请尝试以下方法。关于拼写检查部分,请阅读


另外,要获得一个简单但实用且解释得很好(而且很简短!)的实现,请参见Norvig。

基本上,您需要计算“坏”字与字典中每个字之间的Levenshtein距离。从计算角度来说,这不是一个“便宜”的过程,但它可以让您轻松地检测到简单的换位/一个字符的差异

简言之,L.D.是通过在每个步骤中仅添加/删除/更改单个字符,将一个字符串转换为另一个字符串所需的“步骤”数

color / colour = LD of 1
mad / min = LD of 2 ( mad -> man -> min

我有一个学校的项目

基本理论是,你要计算单词T和字典D中所有单词之间的距离。然后你给出顶部X的结果,距离越小越好

我同意这个项目是我最喜欢的项目之一。我发现的一个有趣的特性是,生成的表中有一个特殊的对称性,这使得算法可以轻松地进行多线程处理


祝你好运

我能想到的有效解决方法是使用sort。基本上,这是用来找出字谜的方法

  • 你拿着字典,对每个单词进行排序,然后把它放到一个散列中。狗,上帝->分类后->DGO。因此,在DGO中,你将拥有狗和上帝(就像链式哈希)

  • 现在,对拼写错误的单词进行排序,并找到匹配项。然后你把每个字符和所有其他落在同一个桶里的单词进行比较

警告:

如果缺少字母,则无法检测。也许在比较拼写错误的单词时,我们可以考虑任何含有所有字母的桶。如果你在寻求善,而你有上帝(但愿没有上帝这个词)。您将进行排序并获得dgo。您可以查看任何包含超过一半字母的桶。在本例中为2个字母


一旦你创建了散列(一次性成本),你的效率就会很好。请让我知道在这方面是否有任何改进

写一个比较两个单词的算法,并使用老师给你的规则来确定一个单词是否可能是另一个单词的拼写错误。如果你被卡住了,看看哪一个是考虑了转置字符的修改的Levenshtein距离


然后,您需要使用该算法将每个拼写错误的单词与词典中的每个单词进行比较。让算法更高效的一个提示是:您可以在不计算距离函数的情况下删除大量候选词(考虑n个字符的词与n+2个字符的词之间的最小距离)。

这里的问题是mad/min的LD为2(根据任务规定,这不符合潜在拼写错误的条件),mad/mda的LD也为2(但这符合潜在拼写错误的条件)。因此,在计算每个单词的LD时遇到了所有麻烦之后,OP仍然需要应用额外的逻辑。这只适用于字符交换的情况。它不适用于删除的字符、添加的字符或替换的字符。我已经将该情况作为警告提到,我们可以按照我提到的方法处理它重新。