正如大多数拼写校正导师所说的,拼写错误的单词x的正确单词W ^是:
W ^ = argmax W P(X | W)P(W)
其中P(X | W)是似然,P(W)是语言模型。
在我正在学习拼写校正的教程中,教师说P(X | W)可以通过使用混淆矩阵来计算,该矩阵记录我们语料库中的一个字母错误地输入另一个字母的次数。我使用万维网作为我的语料库,并且无法保证一封信被错误地输入另一封信。如果我使用X和W之间的Levenshtein距离,而不是使用混淆矩阵,那么可以吗?这有什么不同吗?
我计算Lev的方式。 python中的距离是这样的:
from difflib import SequenceMatcher
def similar(a, b):
return SequenceMatcher(None, a, b).ratio()
这是让我的问题更清晰的教程:Click here
PS。我正在使用Python
答案 0 :(得分:0)
是的,可以使用Levenshtein距离而不是拼写错误的语料库。除非你是谷歌,否则你将无法获得足够大且可靠的拼写错误。还有许多其他指标可以完成这项工作。我使用Levenshtein距离加权键盘上不同字母的距离。我们的想法是abc
更接近abx
而不是abp
,因为p
在键盘上比x
更远离c
。另一个选项涉及交换字符的计算 - swap
更可能更正sawp
saw
,因为这是人们输入的方式。它们经常交换字符的顺序,但输入saw
然后在结尾处随机插入p
需要一些真正的才能。
上述规则称为error model
- 您正试图利用有关真实世界拼写错误的知识来帮助您做出决定。你可以(和人们一样)拥有非常复杂的规则。他们是否有所作为是一个经验问题,你需要试着看。有些规则可能会对某些拼写错误更有效,对其他拼写则更糟糕。 Google how does aspell work
了解更多示例。
PS上面的所有示例错误纯粹是由于使用了键盘。有时候,人们不知道如何拼写一个单词 - 这是其他可能的蠕虫。 Google soundex
。
答案 1 :(得分:0)
有几件事要说。
用于预测最可能的校正的模型是一个简单的级联概率模型:用户输入W
的概率和条件概率< / em>表示在X
出现时出现拼写错误W
。 P(X | W)的正确术语是条件概率,而不是似然。 (当估计候选概率模型与给定数据的匹配程度时,会使用似然。因此,当您机器学习模型时,它不起作用,而不是在应用模型来预测校正时。)< / p>
如果你使用Levenshtein距离作为P(X | W),你会得到0到W
和X
长度之和的整数。这不是合适的,因为你应该使用概率,它必须介于0和1之间。更糟糕的是,你得到的值会越大候选人来自输入的更多不同。这与你想要的相反。
然而,幸运的是,SequenceMatcher.ratio()
实际上并不是Levenshtein距离的实现。它是相似性度量的实现,返回0到1之间的值。越接近1,两个字符串的相似越多。所以这很有道理。
严格地说,您必须验证SequenceMatcher.ratio()
实际上是否适合作为概率测量。为此,您必须检查W
所有可能的拼写错误所获得的所有比率的总和是否为1. SequenceMatcher.ratio()
当然不是这种情况,因此它不是实际上是数学上有效的选择。
但是,它仍会给你合理的结果,我会说它可以用于拼写检查器的实际和原型实现。但是有一个性能问题:由于SequenceMatcher.ratio()
应用于一对字符串(候选W
和用户输入X
),您可能必须将其应用于一个庞大的数字可能的候选人来自字典以选择最佳匹配。当你的字典很大时,这将非常慢。要改进这一点,您需要使用内置近似字符串搜索的数据结构来实现字典。您可能需要查看this existing post的灵感(它是针对Java的,但答案包括一般算法的建议)。