拼写检查器如何工作?

时间:2008-12-06 20:50:30

标签: c spell-checking

我需要在C中实现拼写检查。基本上,我需要所有标准操作...我需要能够拼写检查一个文本块,提出单词建议并动态地向索引添加新单词。 / p>

我有点想写这个,我真的不知道从哪里开始。

7 个答案:

答案 0 :(得分:26)

阅读Tree Traversal。基本概念如下:

  1. 将字典文件读入内存(此文件包含给定语言可能/通用的正确拼写单词的完整列表)。您可以在线下载免费的字典文件。一个例子是java.sun.com
  2. 将此词典文件解析为搜索树,以使实际文本搜索尽可能高效。我不会描述这种类型的树结构的所有脏细节,但树将由节点组成,这些节点具有(最多)26个到子节点的链接(每个字母一个),加上一个标志来表示或者不是当前节点是有效单词的结尾。
  3. 遍历文档中的所有单词,并针对搜索树检查每个单词。如果到达树中的节点,其中单词中的下一个字母不是当前节点的有效子节点,则该单词不在字典中。此外,如果到达单词的末尾,并且未在该节点上设置“有效词尾”标志,则该单词不在词典中。
  4. 如果在词典中找不到单词,请通知用户。在这个阶段,你也可以建议替代拼写,但这有点复杂。您将不得不循环遍历单词中的每个字符,替换替换字符并针对搜索树测试每个字符。可能有更高效的算法来查找推荐的单词,但我不知道它们是什么。

一个非常简短的例子:

词典:

apex apple的任命

树:( *表示有效的结尾) 更新:感谢Curt Sampson指出此数据结构称为Patricia Tree

A -> P -> E -> X*
      \\-> P -> L -> E*
           \\-> O -> I -> N -> T* -> E -> D*

文件:

apple appint ape

结果:

  • “apple”将在树中找到,因此被认为是正确的。
  • “appint”将被标记为不正确。遍历树时,您将关注A -> P -> P,但第二个P没有I子节点,因此搜索失败。
  • “ape”也会失败,因为E中的A -> P -> E节点没有设置“有效词尾”标志。

编辑:有关拼写建议的更多详细信息,请查看Levenshtein Distance,它会衡量将一个字符串转换为另一个字符串时必须进行的最小更改次数。最好的建议是与错误拼写单词的Levenshtein距离最小的字典单词。

答案 1 :(得分:3)

鉴于你不知道从哪里开始,我建议使用现有的解决方案。例如,请参阅aspell (GLPL许可)。如果您真的必须自己实施,请告诉我们原因。

答案 2 :(得分:1)

应该看一下前缀和后缀。

突然=突然+ ly。

通过删除ly,你可以远离存储根词。

同样 preallocate = pre + allocate。

lovely = love + ing + ly 因为 ing 的英语规则被调用,所以会变得有点复杂。

还可以使用某种散列函数来映射根词 特定位是一个大位映射,作为确定根单词是否拼写正确的恒定时间方法。

通过尝试为拼写错误的单词提供可能正确拼写的备用列表,您可以变得更加复杂。您可以研究soundex算法以获得一些想法。

我会建议使用一小组单词进行原型设计。进行大量测试,然后进行扩展。 这是一个很好的教育问题。

答案 3 :(得分:0)

将一个单词拆分为根和后缀是一个知道的“Porter Stemming算法”,它是将英语ditionary装入一个非常小的内存的好方法。
它对搜索也很有用,所以“拼写检查”也会找到“拼写检查”和“拼写检查”

答案 4 :(得分:0)

我在课堂上做过这个

你应该考虑特定的python Natural Language Toolkit NLTK来处理这个问题。

它还允许创建文本解释器,例如chatbots

答案 5 :(得分:0)

Open Office拼写检查器Hunspell可以是一个很好的起点。这是主页: Hunspell at Sourceforge

答案 6 :(得分:0)

对于如何判断单词是否有效,E James给出了一个很好的答案。它可能取决于拼写检查器如何确定可能的拼写错误。

一种这样的方法,我将使用的方法是Levenshteinn String Similarity,它查看为了制作另一个单词,必须在一个单词中添加,删除或交换多少个字母。

如果你说spelled:Country as Contry。 levenshtein字符串相似性为1,因为你只需要添加1个字母就可以将contry转换为country。

然后,您可以遍历所有可能正确的单词拼写(只有171,000个英语单词,其中3000个占95%的文本)。确定具有最低levenshtein字符串相似度值的那些,然后返回与拼写错误的单词最相似的前X个单词。

有一个很棒的python包名为Fuzzy Wuzzy,可以有效地实现这一点,并根据这个公式在两个单词或句子之间产生%相似性。