在定义条件概率时,他选择了一条捷径:
所以我选择了一个快捷方式:我定义了一个简单的模型,它说编辑距离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
谢谢
答案 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已经回答了这个问题。