&引用;“大的”;Python中的缩放拼写检查

&引用;“大的”;Python中的缩放拼写检查,python,spell-checking,pyenchant,Python,Spell Checking,Pyenchant,令人惊讶的是,我一直找不到其他人真正这样做,但肯定有人这样做了。我目前正在从事一个python项目,该项目涉及约16000个单词的拼写检查。不幸的是,这样的字数只会越来越多。现在我正在从Mongo中提取单词,遍历它们,然后用pyenchant检查它们的拼写。我已经消除了mongo的潜在瓶颈,首先从那里抓取我的所有物品。这就给了我大约20分钟的时间来处理16k个单词,这显然比我想花的时间要长。这给我留下了几个想法/问题: 显然,我可以利用线程或某种形式的并行性。即使我把它分成4个部分,我仍然期待着

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

  • 显然,我可以利用线程或某种形式的并行性。即使我把它分成4个部分,我仍然期待着大约5分钟的最佳表现

  • 有没有办法告诉你pyenchant下面使用了什么拼写库Enchant?Enchant的网站似乎暗示它将在拼写检查时使用所有可用的拼写库/词典。如果是这样的话,那么我可能会对每个单词进行三到四次拼写检查。这可能是我的问题,但我很难证明这是事实。即使是这样,我是否真的可以选择卸载其他库?听起来很不幸

  • 那么,有什么想法可以让我从中挤出至少多一点性能呢?我可以把它分解成并行的任务,但是我仍然希望它的核心部分在我开始之前能快一点


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

    我想我们都同意这里的性能瓶颈是Enchant;对于这种大小的数据集,几乎可以立即正确地执行布尔值
    isspeltc
    。那么,为什么不:

  • 使用Enchant提供的字典或获取您自己的字典(例如),在内存中建立一组拼写正确的单词

    或者,将文档中的单词统一起来,比如说将它们放入
    集合
    。这可能帮不了你多少忙

  • 检查每个单词是否在集合中。这很快,因为它只是一个集合查找。(可能是
    O(logn)
    其中N是字数?假设
    按哈希设置
    存储桶并进行二进制搜索……Python大师可以在这里纠正我。)

  • 如果不是,请让Enchant为其推荐一个词。这必然是缓慢的


  • 这假设你的大部分单词拼写正确;如果没有,你就必须更聪明。

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

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

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

    一旦这样做了,只需解压缩它和嘿普雷斯托它的所有拼写检查。这应该是一个相当快的解决方案


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

    我将使用Peter Norvig风格的拼写检查程序。我已经就此写了一篇完整的文章

    下面是一段代码,查看要检查的单词的可能编辑

    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)
    
    您应该通过不断增长的单词数据文件进行迭代,以非常快地使用此代码进行检查。有关更多信息,请参阅全文:


    20分钟只花1.6万个单词听起来太长了。你能把你的单词加载到Python字典中,然后对每一个单词进行查找吗?这肯定需要不到20分钟的时间。(可能写起来也不到20分钟。)你是在使用Enchant的全部功能,还是只是检查一个单词的拼写是否正确(例如,在以前已知的词典中)?如果是后者,按照
    ggg
    所说的去做,做你自己的拼写检查器;我只是在一本60k字典上查了100k单词,比按enter键所用的时间还短。你需要一个更好的算法。检查一个单词是否拼写正确,然后在单词拼写不正确时创建替换建议。这就是我利用enchant的主要原因。否则我同意,只要写点东西告诉我它是否正确就会相当有效。呃,我不确定我是否理解。你的意思是压缩文档并解析二进制压缩文件吗?你确定这行得通吗?唯一合理的方法是制作一棵赫夫曼式的树,其中的词素是整个单词。这在计算上相当于KatrieleAlex的答案。任何其他在子单词级别上运行的压缩都会非常复杂,但不会增加任何实用程序。按照这条路线最多需要6分钟。它仍然很长,但它更好。在爬网时会发现很多拼写错误:)您也可以尝试并行化Enchant查找,甚至可以使用一个单独的进程作为Enchant处理缓存的接口运行。@f4nt我也遇到了这个问题。你用什么作为字典单词的来源?关于您的解决方案,您还可以分享其他细节吗?