代码之家  ›  专栏  ›  技术社区  ›  Aaron Digulla

文本中单词的自动拼写检查

  •  2
  • Aaron Digulla  · 技术社区  · 16 年前

    简而言之:你如何编写一个自动拼写检查器?其思想是,检查器从已知的良好来源(词典)构建一个单词列表,并在足够频繁使用时自动添加新单词。已经有一段时间没有用过的词应该被淘汰。因此,如果我删除包含“Mungrohyperiofier”的场景的一部分,检查器应该会记住一段时间,并且当我在另一个场景中键入“Mung<Ctrl+Space>”时,检查器应该会再次提供它。如果我不使用这个词,比如说,几天,它应该忘记它。

    同时,我希望避免在字典中添加拼写错误。[/EDIT]

    我想为科幻小说写一个文本编辑器。编辑应该为当前故事中任何地方使用的单词提供单词补全。它将只提供故事的一个场景供编辑(因此您可以轻松地移动场景)。

    这意味着我有三套:

    1. 所有其他场景中所有单词的集合
    2. 当前场景中的单词集 之前 我开始编辑了
    3. 当前编辑器中的一组词

    我需要把这些设备存放在某个地方,因为每次从头开始建立列表都太贵了。我认为一个简单的纯文本文件每行一个单词就足够了。

    当用户编辑场景时,会出现以下情况:

    1. 她删掉了一个字。此词在当前场景中的其他任何地方都不使用。
    2. 她键入一个新单词
    3. 她键入一个已经存在的词
    4. 她键入一个已经存在但又打字的单词。
    5. 她纠正了第二组单词的错别字。
    6. 她纠正了第1集中某个单词的错别字(也就是说,错别字也在其他地方)。
    7. 她删除了一个她打算再使用的词。删除后,这个词不再出现在1和3组中。

    最明显的策略是在保存场景时重建单词集,并从每个场景的单词列表文件构建集合1。

    所以我的问题是:是否有一个聪明的策略来保留那些不再使用但仍然能够逐步淘汰拼写错误的单词?如果可能的话,这个策略应该在后台工作,用户甚至不会注意到正在发生的事情(即,我想避免不得不抓住鼠标从菜单中选择“将单词添加到字典”)。

    [编辑]基于来自的评论 grieve

    3 回复  |  直到 8 年前
        1
  •  2
  •   Yuval F    16 年前

    所以你想写一个拼写检查器。这是 Peter Norvig's paper about writing a spelling corrector . 它描述了一个简单而健壮的拼写校正器。你可以使用书中已经写好的部分,再加上语言模型的参考列表(比如从免费字典中)。 我也会去现有的开源拼写检查器,如 aspell hunspell ,以获得一些想法。

        2
  •  0
  •   leppie    16 年前

    您应该使用的结构是trie。尾部/后缀压缩将有助于记忆。您可以使用伪引用计数GC来跟踪使用情况。

    对于实际的节点,您可能只需要32位整数,对于unicode只需要21位,而对于其他各种标记和信息则需要21位。

        3
  •  0
  •   siukurnin    16 年前

    让我想起在现代LISP实现中关于垃圾收集的一些事情:

    创建时的数据放入“池1”,

    当需要垃圾收集时,垃圾收集器会在池1中查找未使用的条目并将其删除。

    然后将剩余的条目移动到池2。

    只有当需要的内存超过池1可以释放的内存时,才会检查池2。

    来自池2的数据在垃圾收集后仍然存在,这些数据被放入池3,然后。。。等等。

    其思想是动态地将数据放入与其生存期相对应的池中。。。

    推荐文章