&引用;“大的”;Python中的缩放拼写检查
令人惊讶的是,我一直找不到其他人真正这样做,但肯定有人这样做了。我目前正在从事一个python项目,该项目涉及约16000个单词的拼写检查。不幸的是,这样的字数只会越来越多。现在我正在从Mongo中提取单词,遍历它们,然后用pyenchant检查它们的拼写。我已经消除了mongo的潜在瓶颈,首先从那里抓取我的所有物品。这就给了我大约20分钟的时间来处理16k个单词,这显然比我想花的时间要长。这给我留下了几个想法/问题:&引用;“大的”;Python中的缩放拼写检查,python,spell-checking,pyenchant,Python,Spell Checking,Pyenchant,令人惊讶的是,我一直找不到其他人真正这样做,但肯定有人这样做了。我目前正在从事一个python项目,该项目涉及约16000个单词的拼写检查。不幸的是,这样的字数只会越来越多。现在我正在从Mongo中提取单词,遍历它们,然后用pyenchant检查它们的拼写。我已经消除了mongo的潜在瓶颈,首先从那里抓取我的所有物品。这就给了我大约20分钟的时间来处理16k个单词,这显然比我想花的时间要长。这给我留下了几个想法/问题: 显然,我可以利用线程或某种形式的并行性。即使我把它分成4个部分,我仍然期待着
编辑:对不起,在早上咖啡前发布。。。如果单词拼写错误,Enchant会为我生成一个建议列表。这似乎是我在这个处理部分花费大部分时间的地方 我想我们都同意这里的性能瓶颈是Enchant;对于这种大小的数据集,几乎可以立即正确地执行布尔值
isspeltc
。那么,为什么不:
集合。这可能帮不了你多少忙
O(logn)
其中N是字数?假设按哈希设置存储桶并进行二进制搜索……Python大师可以在这里纠正我。)
这假设你的大部分单词拼写正确;如果没有,你就必须更聪明。也许更好的方法是压缩文档,因为这样可以删除任何重复的单词实例,实际上只需要检查一次拼写。我只是建议这样做,因为它可能比编写自己独特的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我也遇到了这个问题。你用什么作为字典单词的来源?关于您的解决方案,您还可以分享其他细节吗?