诺威格的拼写检查器,如何实现条件概率?

1 投票
2 回答
989 浏览
提问于 2025-04-18 05:51

在定义条件概率的时候,他走了一条捷径:

所以我走了一条捷径:我定义了一个简单的模型,认为所有编辑距离为1的已知单词比编辑距离为2的已知单词的概率要高得多,而比编辑距离为0的已知单词的概率要低得多。这里的“已知单词”是指我们在语言模型训练数据中见过的单词——也就是字典里的单词。我们可以这样实现这个策略:

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开始呢?我的意思是,默认的工厂函数应该是(lambda:0)或者(int)吗?

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

谢谢

2 个回答

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已经回答过这个问题了。

3

优先级列表是通过 or 来实现的。如果 known([word]) 这个集合不是空的,那么它的值就是这个表达式的值。如果它是空的,就会去计算右边的内容。

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

举个例子:

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

他为什么不从0开始呢?

这就是 拉普拉斯平滑。其实在文章里有解释。

撰写回答