2

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

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

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

这意味着我有三套:

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

我需要将这些集合存储在某个地方,因为每次都从头开始构建列表太昂贵了。我认为一个每行一个单词的简单纯文本文件就足够了。

当用户编辑场景时,我们有这些情况:

  1. 她删了一个字。这个词在当前场景中的其他任何地方都没有使用。
  2. 她打出一个新词
  3. 她输入了一个已经存在的单词
  4. 她输入了一个已经存在但打错字的单词
  5. 她更正了第 2 组中一个单词的错字。
  6. 她更正了第 1 组单词中的错字(即错字也在别处)。
  7. 她删除了一个她打算再次使用的词。但是,删除后,该单词不再位于集合#1 和#3 中。

显而易见的策略是在保存场景时重建单词集,并从每个场景的单词列表文件中构建集#1。

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

[编辑] 基于悲伤的评论

4

3 回答 3

2

所以你想写一个拼写检查器。这是Peter Norvig 关于编写拼写校正器的论文。它描述了一个简单而强大的拼写校正器。您可以使用本书已经写好的部分,以及语言模型的参考列表(比如来自免费词典)。我也会去现有的开源拼写检查器,例如aspellhunspell来获得一些想法。

于 2008-12-03T08:49:53.150 回答
0

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

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

于 2008-12-02T16:00:31.363 回答
0

Reminds me of what I have been told about garbage collecting in modern LISP implementations :

data when created is put in "pool 1",

when there is a need to garbage collect the garbage collector look in pool 1 for unused entries and remove them.

Then any remaining entry is moved to pool 2.

Pool 2 is examined only when there is a need to more memory than pool 1 can release.

Data from pool 2 that survive a garbage collection is put in pool 3 and ... so on.

The idea is to put dynamically the data in a pool corresponding to its lifetime...

于 2008-12-02T21:20:52.463 回答