Python中的“大型”拼写检查

时间:2010-08-10 14:22:25

标签: python spell-checking pyenchant

令人惊讶的是,我一直无法找到真正做到这一点的人,但肯定有人有。我正在研究一个python项目,目前涉及拼写检查大约16000个单词。不幸的是,这个词数只会增长。现在我从Mongo中拉出单词,遍历它们,然后用pyenchant拼写检查它们。我已经删除了mongo作为潜在的瓶颈,首先抓住我的所有物品。这让我有大约20分钟的时间处理16k字,这显然比我想花的时间长。这给我留下了一些想法/问题:

  1. 显然我可以利用线程或某种形式的并行性。即使我将其切成4块,我仍然会在大约5分钟内看到最佳性能。

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

  3. 那么,关于如何从中挤出至少更多性能的任何想法?我把它切成并行任务很好,但我仍然希望在我做之前让它的核心部分更快一些。

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

3 个答案:

答案 0 :(得分:5)

我认为我们同意这里的性能瓶颈是附魔;对于这个大小的数据集,它几乎是瞬间做一个布尔isSpeltCorrectly。那么,为什么不呢:

  1. 使用附魔所做的字典或获取自己的字典(例如OpenOffice's)在内存中拼写正确拼写的单词。

    可选地,通过将​​文档放在set中来统一文档的单词。这可能不会为你节省很多。

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

  3. 如果不是,则然后让Enchant为其推荐一个单词。这必然很慢。

  4. 这假设您的大多数单词拼写正确;如果他们不是,你必须更聪明。

答案 1 :(得分:2)

我会使用A 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/

答案 2 :(得分:1)

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

压缩版本应该引用唯一的单词,在其文件中的某个位置,您可能需要查看它们的结构。

然后你可以拼写检查所有独特的单词。我希望你不是用单独的SQL查询或类似的东西来检查它们,你应该以树的形式将字典加载到你的记忆中,然后检查单词。

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

或者你可能不需要经历整个压缩过程,如果拼写检查确实和评论建议一样快,这表明实施错误。