6

令人惊讶的是,我一直找不到其他人真正做到这一点,但肯定有人做到了。我目前正在研究一个涉及拼写检查约 16000 个单词的 python 项目。不幸的是,这个词的数量只会增加。现在我正在从 Mongo 中提取单词,遍历它们,然后用 pyenchant 对它们进行拼写检查。通过首先从那里抓取我的所有物品,我已经消除了 mongo 作为潜在瓶颈。这让我有大约 20 分钟的时间来处理 16k 个单词,这显然比我想要花费的时间要长。这给我留下了几个想法/问题:

  1. 显然,我可以利用线程或某种形式的并行性。即使我把它切成 4 块,假设性能达到峰值,我仍然在看大约 5 分钟。

  2. 有没有办法知道 Enchant 在 pyenchant 下使用的是什么拼写库?Enchant 的网站似乎暗示它将在拼写检查时使用所有可用的拼写库/字典。如果是这样,那么我可能会通过三四个拼写字典来运行每个单词。这可能是我的问题,但我很难证明是这样。即使是这样,我真的可以选择卸载其他库吗?听起来很不幸。

那么,关于如何从中挤出至少一点性能的任何想法?我可以将它分成并行任务,但我仍然希望在我做之前让它的核心部分更快一点。

编辑:抱歉,在早上喝咖啡之前发帖……如果单词拼写错误,Enchant 会为我生成一个建议列表。这似乎是我在这个处理部分花费大部分时间的地方。

4

3 回答 3

5

我认为我们同意这里的性能瓶颈是 Enchant;对于这种大小的数据集,几乎可以立即执行 boolean isSpeltCorrectly。那么,为什么不:

  1. 使用 Enchant 提供的字典或获取您自己的字典(例如OpenOffice 的),在内存中构建一个拼写正确的单词集。

    或者,将文档的单词唯一化,例如将它们放在set. 这可能不会为您节省太多。

  2. 检查每个单词是否在集合中。这很快,因为它只是一个集合查找。(可能O(log N)在哪里 N 是单词的数量?假设set通过哈希存储桶并进行二进制搜索...... Python 大师可以在这里纠正我。)

  3. 如果不是,请让 Enchant 为它推荐一个词。这必然很慢。

这假设您的大部分单词拼写正确;如果他们不是,你将不得不更聪明。

于 2010-08-10T14:52:44.067 回答
2

我会使用 Peter Norvig 风格的拼写检查器。我已经写了一篇完整的文章。

http://blog.mattalcock.com/2012/12/5/python-spell-checker/

这是一段代码,它查看了要检查的单词的可能编辑。

def edits1(word):
    s = [(word[:i], word[i:]) for i in range(len(word) + 1)]
    deletes    = [a + b[1:] for a, b in s if b]
    transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1]
    replaces   = [a + c + b[1:] for a, b in s for c in alphabet if b]
    inserts    = [a + c + b     for a, b in s for c in alphabet]
    return set(deletes + transposes + replaces + inserts)

您应该遍历您不断增长的单词数据文件,以便使用此代码快速检查。有关更多信息,请参阅完整帖子:

http://blog.mattalcock.com/2012/12/5/python-spell-checker/

于 2013-01-26T17:56:35.307 回答
1

也许更好的方法是压缩文档,因为这将删除任何重复的单词实例,实际上您只需要进行一次拼写检查。我只建议这样做,因为它可能比编写自己的独特单词查找器执行得更快。

压缩版本应该在其文件中的某处引用独特的单词,您可能需要查看它们的结构。

然后,您可以对所有唯一单词进行拼写检查。我希望你不要用单独的 SQL 查询或类似的东西来检查它们,你应该以树的形式将字典加载到你的内存中,然后对照它检查单词。

完成此操作后,只需将其解压缩并立即进行所有拼写检查。这应该是一个相当快的解决方案。

或者,如果拼写检查确实像评论建议的那样快,那么您可能不需要完成整个压缩过程,这表明实现错误。

于 2010-08-10T14:53:19.137 回答