Norvig的拼写检查器,他如何实现条件概率?

时间:2014-05-08 15:19:06

标签: python spell-checking

在定义条件概率时,他选择了一条捷径:

  

所以我选择了一个快捷方式:我定义了一个简单的模型,它说编辑距离1的所有已知单词比编辑距离2的已知单词更可能,并且比编辑距离0的已知单词无限可能。 #34;已知单词"我的意思是我们在语言模型训练数据中看到的一个词 - 字典中的一个词。我们可以按如下方式实施这一策略:

def known(words): return set(w for w in words if w in NWORDS)
def correct(word):
    candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
    return max(candidates, key=NWORDS.get)

我不知道这段代码是如何实现他的策略的。对我来说,返回的最后一行只是重新计算单词具有最高计数/先验,而不是模型中的优先级列表。

以及定义他的单词计数字典:

def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
    model[f] += 1
return model

为什么他从0开始?我的意思是不应该将default_factory设为(lambda:0)或(int)?

有人可以解释一下吗?您可以在此处找到完整的文章:http://norvig.com/spell-correct.html

谢谢

2 个答案:

答案 0 :(得分:3)

优先级列表由or实施。如果known([word])为非空集,则其值为表达式的值。如果它是空的,则右侧

known(edits1(word)) or known_edits2(word) or [word]
评估

。 E.g。

>>> [1, 2, 3] or [4, 5, 6]
[1, 2, 3]
>>> [] or [4, 5, 6]
[4, 5, 6]
  

为什么他从0开始?

那是Laplace smoothing。它实际上在文章中进行了解释。

答案 1 :(得分:0)

关于第一个问题,优先顺序是在行中实现的。

candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]

它只会实现其中一个列表,而不是它们的并集。这是一个更简单的例子,展示了它是如何工作的。

>>> n1 = [1,2,3]
>>> n2 = [2,3,4]
>>> n1 or n2
[1, 2, 3]
>>> [] or n2
[2, 3, 4]
>>> 

不确定defaultdict部分,但看起来像larsmans已经回答了这个问题。