1

我有我写的这个拼写检查器:

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 的正确拼写的概率。

我可以通过某种方式删除循环来加速我的代码吗?

现在我知道这个问题可能没有答案,如果我不能告诉我我不能!

4

3 回答 3

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]
于 2013-06-30T09:24:53.857 回答
0

您可以简单地缓存 的结果correct,以便在与同一个世界的下一次调用中,您无需任何计算就已经知道答案。

于 2013-06-30T09:09:24.680 回答
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”的预计算长度。

于 2013-06-30T12:15:07.027 回答