我有这个拼写检查器,我写了:
import operator
class Corrector(object):
def __init__(self,possibilities):
self.possibilities = possibilities
def similar(self,w1,w2):
w1 = w1[:len(w2)]
w2 = w2[:len(w1)]
return sum([1 if i==j else 0 for i,j in zip(w1,w2)])/float(len(w1))
def correct(self,w):
corrections = {}
for c in self.possibilities:
probability = self.similar(w,c) * self.possibilities[c]/sum(self.possibilities.values())
corrections[c] = probability
return max(corrections.iteritems(),key=operator.itemgetter(1))[0]
这里的可能性是一个字典,如:
{word1:value1}
其中value是单词在语料库中出现的次数。
相似函数返回单词之间相似概率:w1和w2。
在correct
函数中,您会看到软件循环遍历所有可能的结果,然后计算每个结果是w的正确拼写的概率。
我可以通过某种方式移除循环来加速我的代码吗?
现在我知道这个问题可能没有答案,如果我不能告诉我,我不能!
答案 0 :(得分:1)
你走了......
from operator import itemgetter
from difflib import SequenceMatcher
class Corrector(object):
def __init__(self, possibilities):
self.possibilities = possibilities
self.sums = sum(self.possibilities.values())
def correct(self, word):
corrections = {}
sm = SequenceMatcher(None, word, '')
for w, t in self.possibilities.iteritems():
sm.b = w
corrections[w] = sm.ratio() * t/self.sums
return max(corrections.iteritems(),key=itemgetter(1))[0]
答案 1 :(得分:0)
你可以简单地缓存correct
的结果,这样在下一次使用相同世界的调用时你就可以知道答案而无需任何计算。
答案 2 :(得分:0)
您通常不希望针对所有语料库中的令牌检查提交的令牌。减少必要计算(从而减少for
循环中的调用)的“经典”方法是维护文档集合中存在的所有(三)克的索引。基本上,您在一侧维护集合中所有标记的列表,另一方面,维护一个哈希表,其中键是克,哪些值是列表中标记的索引。这可以通过类似DBM的数据库来保持持久性。
然后,当检查单词的拼写时,将其拆分为克,搜索集合中包含相同克的所有标记,按提交标记的克相似性对它们进行排序,然后然后,你执行距离计算。
此外,您的代码的某些部分可以简化。例如,这个:
def similar(self,w1,w2):
w1 = w1[:len(w2)]
w2 = w2[:len(w1)]
return sum([1 if i==j else 0 for i,j in zip(w1,w2)])/float(len(w1))
可以简化为:
def similar(self, w1, w2, lenw1):
return sum(i == j for i, j in zip(w1,w2)) / lenw1
其中lenw1是预先计算的长度“w1”。