2

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

可以做些什么来找到那些“等价词”?可以对两个单词进行什么分析以将它们标记为等效?

4

5 回答 5

5

在投入太多试图解开之前,我首先要看一下已经存在的实现,比如Aspellnetspell,主要有两个原因

  1. 重新发明轮子没有多大意义。拼写检查比最初看起来要复杂得多,并且在已经完成的工作的基础上进行构建是有意义的
  2. 如果您的兴趣是找出如何去做,如果您决定实现自己的源代码和社区将是一个很大的好处
于 2009-04-30T13:25:53.647 回答
3

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

  • 你的字典是不是很小(大约二十个字)?在这种情况下,最好预先计算附近所有可能的错误单词并使用表/哈希查找。
  • 你的错误模型是什么?Aspell 至少有两个(一个用于由键盘上附近的字母引起的拼写错误,另一个用于由单词发音方式引起的拼写错误)。
  • 你的字典有多动态?你能负担得起为了获得有效的检索而做大量的准备工作吗?
  • 除了编辑距离之外,您可能还需要像Double Metaphone这样的“词等效”度量。
  • 您可以通过阅读Peter Norvig 对拼写更正的精彩描述获得一些感受。
  • 当然,只要有可能,就窃取代码。不要无缘无故地重新发明轮子——原因可能是一个非常特殊的领域,你的用户犯拼写错误的特殊方式,或者只是为了了解它是如何完成的。
于 2009-04-30T13:47:48.167 回答
1

编辑距离是编写拼写检查器所需的理论。你还需要一本字典。大多数 UNIX 系统都带有已经为您的语言环境安装的字典。

于 2009-04-30T13:27:02.850 回答
1

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

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

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

weight = edit-distance *  100 / probability

(权重越小越好)

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

可能有更好的方法,但这工作得很好。

您可能还希望忽略所有大写单词、首字母等,因此选择要忽略的内容也是需要考虑的事情。

于 2009-04-30T13:50:08.987 回答
0

在 linux/unix 下你有 ispell。为什么要彻底改造。

于 2009-04-30T13:43:31.873 回答