在编写拼写检查器时我们应该考虑哪些事项?

时间:2009-04-30 13:22:04

标签: spell-checking

我想写一个非常简单的拼写检查器。拼写检查器将尝试将输入单词与字典中的等效单词匹配。

如何找到那些'等同词'?可以对两个单词进行哪些分析来标记它们等效?

5 个答案:

答案 0 :(得分:5)

在投入太多试图解开之前我首先考虑已有的实施,如Aspellnetspell,主要有两个原因

  1. 重新发明轮子没什么意义。拼写检查比最初出现的要复杂得多,建立已经完成的工作是有意义的
  2. 如果您有兴趣了解如何做到这一点,那么如果您决定实施自己的方式,源代码和社区将是一个很大的好处

答案 1 :(得分:3)

很大程度上取决于您的使用案例。例如:

  • 你的字典很小(约二十个字)?在这种情况下,最好预先计算所有可能的附近错误单词并使用表/散列查找。
  • 你的错误模型是什么? Aspell至少有两个(一个用于键盘上附近字母引起的拼写错误,另一个用于单词听起来引起的拼写错误)。
  • 你的词典有多动态?为了获得有效的检索,你能负担得起大量的准备工作吗?
  • 除编辑距离外,您可能需要Double Metaphone之类的“字等值”度量。
  • 通过阅读Peter Norvig's great description of spelling correction,您可以获得一些感受。
  • 当然,只要有可能,窃取代码。不要在没有理由的情况下重新发明轮子 - 原因可能是一个非常特殊的领域,一种特殊的方式,你的用户会犯拼写错误,或者只是为了了解它是如何完成的。

答案 2 :(得分:1)

Edit Distance 是编写拼写检查程序所需的理论。你还需要一本字典。大多数UNIX系统都附带了已为您的语言环境安装的字典。

答案 3 :(得分:1)

我刚刚完成了一个拼写检查程序并使用了以下组合来获取“建议”单词列表

  • “拼错”单词的拼音哈希查找相同字典的散列哈希真实单词(对于java,请查看Apache Commons Codec以获取合适的库)。您的字典文件的语音哈希可以预先计算。
  • 编辑输入和电位之间的距离(这是相当昂贵的,所以你需要首先使用语音散列减少列表,假设更高的音量负载 - 在我的情况下,基于服务器的拼写检查)
  • 常见拼写错误的已知列表,例如接受与接受。
  • 英语中最常用单词的有序列表

基本上,我主要根据编辑距离和共性对每个潜在词进行加权。例如如果单词概率是百分比,那么

weight = edit-distance *  100 / probability

(较低的权重更好)

但是我也用已知的常见拼写错误覆盖任何结果(即这些结果总是浮动到顶部的建议结果)。

可能有更好的方法,但这很有效。

您可能还希望忽略所有CAPS单词,缩写等,因此选择要忽略的内容也是值得思考的问题。

答案 4 :(得分:0)

在linux / unix下你有aspell。为什么重新发明轮子。