【问题标题】:Norvig's spell checker, how he implements the conditional probability?Norvig 的拼写检查器,他是如何实现条件概率的?
【发布时间】:2015-05-06 08:17:02
【问题描述】:

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

所以我选择了一条捷径:我定义了一个简单的模型,它说编辑距离为 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开始?我的意思是 default_factory 不应该是 (lambda:0) 还是 (int)?

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

谢谢

【问题讨论】:

    标签: python spell-checking


    【解决方案1】:

    优先级列表由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开始?

    那是Laplace smoothing。文章里其实已经解释过了。

    【讨论】:

    • 我认为 'or' 和 '|' 是同一个运算符用于设置操作。很好地使用了“或”的快捷属性。谢谢!
    【解决方案2】:

    关于第一个问题,在行中执行优先顺序。

    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 已经回答了。

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2015-02-14
      相关资源
      最近更新 更多