我需要在 C 中实现一个拼写检查器。基本上,我需要所有标准操作......我需要能够对一段文本进行拼写检查,提出单词建议并动态地将新单词添加到索引中。
我有点想自己写这个,虽然我真的不知道从哪里开始。
我需要在 C 中实现一个拼写检查器。基本上,我需要所有标准操作......我需要能够对一段文本进行拼写检查,提出单词建议并动态地将新单词添加到索引中。
我有点想自己写这个,虽然我真的不知道从哪里开始。
阅读树遍历。基本概念如下:
一个非常简短的例子:
字典:
apex 苹果任命
树:(*
表示有效的词尾)
更新:感谢 Curt Sampson 指出这种数据结构称为Patricia 树
A -> P -> E -> X*
\\-> P -> L -> E*
\\-> O -> I -> N -> T* -> E -> D*
文档:
苹果appint猿
结果:
A -> P -> P
,但是第二个P
没有I
子节点,所以搜索失败。
E
in 中的节点A -> P -> E
没有设置 "valid end of word" 标志。
编辑:有关拼写建议的更多详细信息,请查看Levenshtein Distance,它测量将一个字符串转换为另一个字符串所必须进行的最少更改次数。最好的建议是与拼写错误的单词之间的 Levenshtein 距离最小的字典单词。
鉴于您不知道从哪里开始,我建议您使用现有的解决方案。例如,请参见aspell (获得 GLPL 许可)。如果您真的必须自己实现它,请告诉我们原因。
应该查看前缀和后缀。
突然 = 突然 + ly。
通过删除 ly's 你可以摆脱只存储根词。
同样preallocate = pre + allocate。
而lovely = love + ing + ly 会变得更复杂一些,因为ing的英语规则被调用了。
也有可能使用某种散列函数将根词映射到特定位是一个大位图,作为确定根词是否拼写正确的恒定时间方法。
通过尝试为拼写错误的单词提供可能正确拼写的替代列表,您可能会变得更加复杂。您可能会研究 soundex 算法以获得一些想法。
我建议用一小组单词进行原型设计。做大量测试,然后扩大规模。这是一个奇妙的教育问题。
将单词分成词根和后缀被称为“Porter Stemming Algorithm”,它是一种将英文词典放入极小的记忆的好方法。
它对 seach 也很有用,所以“拼写检查”也会找到“拼写检查”和“拼写检查”
Open Office Spell checker Hunspell 是一个很好的起点。这是主页: Sourceforge 的 Hunspell
E James 为如何判断一个词是否有效给出了一个很好的答案。这可能取决于拼写检查器如何确定可能的拼写错误。
一种这样的方法,我将使用的一种方法是Levenshteinn 字符串相似度,它查看必须在一个单词中添加、删除或交换多少个字母才能生成另一个单词。
如果你说拼写:Country as Contry。levenshtein 字符串相似度为 1,因为您只需添加 1 个字母即可将国家/地区转换为国家/地区。
然后,您可以遍历所有可能的正确拼写单词(只有 171,000 个英文单词,其中 3000 个占文本的 95%)。确定那些具有最低 levenshtein 字符串相似度值的词,然后返回与拼写错误的词最相似的前 X 个词。
有一个很棒的 python 包,叫做Fuzzy Wuzzy,它有效地实现了这一点,并根据这个公式在两个单词或句子之间生成 % 相似度。