【问题标题】:Spelling correction likelihood拼写更正可能性
【发布时间】:2013-07-20 04:00:05
【问题描述】:

正如大多数拼写纠正导师所说,拼写错误的单词 x 的正确单词 W^ 是:

W^ = argmaxW P(X|W) P(W)

其中 P(X|W) 是可能性,P(W) 是语言模型。

在我学习拼写纠正的教程中,讲师说 P(X|W) 可以通过使用混淆矩阵来计算,该矩阵跟踪我们语料库中的一个字母被错误输入另一个字母的次数.我使用万维网作为我的语料库,不能保证一个字母被错误地键入另一个字母。那么,如果我使用 X 和 W 之间的 Levenshtein 距离而不是使用混淆矩阵,可以吗?有很大的不同吗?

我要计算列夫的方式。 python中的距离是这样的:

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()

See this

这里是让我的问题更清楚的教程:Click here

附言。我正在使用 Python

【问题讨论】:

    标签: python nlp artificial-intelligence spelling


    【解决方案1】:

    有几件事要说。

    1. 您用来预测最可能修正的模型是一个简单的级联概率模型:用户输入W 的概率,以及一个条件概率 拼写错误的X 出现在W 的意思时。 P(X|W) 的正确术语是条件概率,而不是可能性。 (在估计候选概率模型与给定数据的匹配程度时使用似然度。因此,它在您机器学习模型时起作用,而不是在您应用模型来预测校正时。)

    2. 如果您对 P(X|W) 使用 Levenshtein 距离,您将获得介于 0 和 WX 的长度之和之间的整数。这是合适的,因为你应该使用一个概率,它必须在 0 和 1 之间。更糟糕的是,你得到的值会越大候选人与输入的差异更大。这与你想要的相反。

    3. 不过,幸运的是,SequenceMatcher.ratio() 实际上并不是 Levenshtein 距离的实现。它是 相似度度量 的实现,并返回 0 到 1 之间的值。越接近 1,两个字符串的 相似度 越多。所以这是有道理的。

    4. 严格来说,您必须验证 SequenceMatcher.ratio() 实际上是否适合作为概率度量。为此,您必须检查所有可能的W 拼写错误的所有比率的总和是否为 1。SequenceMatcher.ratio() 肯定不是这种情况,所以它实际上不是数学上的有效的选择。

    5. 但是,它仍然会为您提供合理的结果,而且我想说它可以用于拼写检查器的实用和原型实现。但是有一个性能问题:由于 SequenceMatcher.ratio() 应用于一对字符串(候选 W 和用户输入 X),您可能必须将其应用于来自字典以选择最佳匹配。当您的字典很大时,这将非常慢。为了改进这一点,您需要使用内置近似字符串搜索的数据结构来实现您的字典。您可能想查看this existing post 以获得灵感(它适用于 Java,但答案包括一般算法的建议)。

    【讨论】:

    • 总之我可以使用SequenceMatcher.ratio() 来达到我的目的吗?
    • @tenstar 是的。抱歉,如果不清楚。我唯一真正担心的是,当您的字典很大时,您会遇到性能(阅读:速度)问题。
    • 是的,但如果我只生成几个概率最高的候选人,那么我可以解决性能问题吗?
    • @tenstar 是的,没错。 (在这种情况下,我想知道您用于生成这些候选者的方法是否可能无法修改,因此它会与每个候选者一起生成某种相似度分数。如果是这样,您将不再需要SequenceMatcher.ratio()。)
    • 所以你的意思是我生成少数候选人的解决方案会起作用,即使我正在构建类似于谷歌的东西?
    【解决方案2】:

    是的,可以使用 Levenshtein 距离代替拼写错误的语料库。除非您是 Google,否则您将无法访问足够大且足够可靠的拼写错误语料库。还有许多其他指标可以完成这项工作。我使用了根据键盘上不同字母的距离加权的 Levenshtein 距离。这个想法是abcabp 更接近abx,因为p 在我的键盘上比cx 更远。另一种选择涉及考虑交换字符-swap 更可能是对sawp 的更正,而不是saw,因为这是人们打字的方式。他们经常交换字符的顺序,但输入saw 然后在末尾随机插入一个p 需要一些真正的天赋。

    上述规则称为error model- 您正在尝试利用有关实际拼写错误如何发生的知识来帮助您做出决定。你可以(而且人们已经)制定了非常复杂的规则。他们是否有所作为是一个经验问题,您需要尝试看看。有可能某些规则对某些拼写错误更有效,而对其他拼写错误则更糟。谷歌how does aspell work 获取更多示例。

    PS 以上所有示例错误都纯粹是由于使用了键盘造成的。有时,人们不知道如何拼写一个单词——这完全是另一回事。谷歌soundex

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2019-07-02
      • 2019-02-16
      • 2021-12-20
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多