Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 拼写纠正可能性_Python_Nlp_Artificial Intelligence_Spelling - Fatal编程技术网

Python 拼写纠正可能性

Python 拼写纠正可能性,python,nlp,artificial-intelligence,spelling,Python,Nlp,Artificial Intelligence,Spelling,正如大多数拼写纠正老师所说,拼写错误的单词x的正确单词W^是: W^=argmaxW p(X|W)p(W) 其中p(X | W)是可能性,p(W)是语言模型 在我学习拼写纠正的教程中,老师说p(X | W)可以通过使用混淆矩阵来计算,该矩阵跟踪我们语料库中的一个字母被错误键入另一个字母的次数。我使用万维网作为我的语料库,不能保证一封信被误打成另一封信。如果我使用X和W之间的Levenshtein距离,而不是使用混淆矩阵,可以吗?这有什么不同吗 我将要计算Lev的方法。python中的距离是: f

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

W^=argmaxW 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()

下面是让我的问题更清楚的教程:


另外,我正在使用Python

是的,可以使用Levenshtein距离而不是拼写错误的语料库。除非你是谷歌,否则你将无法访问大量可靠的拼写错误语料库。还有许多其他指标可以完成这项工作。我使用了Levenshtein距离,它由键盘上不同字母的距离加权。这个想法是
abc
abp
更接近
abx
,因为
p
c
离我键盘上的
x
更远。另一个选项涉及到交换字符的核算——
swap
更可能是对
saw
sawp
的更正,因为这是人们键入字符的方式。他们经常交换字符的顺序,但是需要一些真正的人才来键入
saw
,然后在末尾随机插入一个
p

上述规则称为
错误模型
——您试图利用关于现实世界中拼写错误如何发生的知识来帮助您做出决策。你可以(而且人们已经)制定非常复杂的规则。它们是否会产生影响是一个经验性的问题,你需要试试看。有些规则可能对某些拼写错误更有效,而对其他拼写错误更有效。谷歌
aspell如何工作
了解更多示例


PS上面所有的示例错误都纯粹是由于使用了键盘。有时,人们不知道如何拼写一个单词——这是另一整罐蠕虫。谷歌
soundex

有几件事要说

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

  • 如果对p(X | W)使用Levenshtein距离,则会得到0与
    W
    X
    长度之和之间的整数。这是不合适的,因为你应该使用一个概率,它必须在0和1之间。更糟糕的是,您得到的值越大,候选对象与输入的差异就越大。这与你想要的正好相反

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

  • 严格地说,您必须验证
    SequenceMatcher.ratio()
    是否确实适合作为概率度量。为此,您必须检查针对
    W
    所有可能的拼写错误得到的所有比率之和是否为1。对于
    SequenceMatcher.ratio()
    ,情况肯定不是这样,因此它实际上不是一个数学上有效的选择

  • 但是,它仍然会给您提供合理的结果,我认为它可以用于拼写检查器的实际原型实现。不过,还有一个性能问题:由于
    SequenceMatcher.ratio()
    应用于一对字符串(候选
    W
    和用户输入
    X
    ),因此您可能必须将其应用于来自字典的大量可能候选,以选择最佳匹配。当你的字典很大的时候,这会很慢。为了改进这一点,您需要使用内置了近似字符串搜索的数据结构来实现字典。您可能希望从中获得灵感(这是针对Java的,但答案包括对通用算法的建议)


  • 总之,我可以使用
    SequenceMatcher.ratio()
    来完成我的任务吗?@tenstar是的。对不起,如果不清楚的话。我唯一真正关心的是,当你的字典很大时,你会遇到性能问题。是的,但如果我只生成几个概率最高的候选,那么我就可以解决性能问题。@tenstar是的,没错。(在这种情况下,我想知道您用于生成这些候选对象的方法是否可能无法修改,因此它会与每个候选对象一起生成某种相似性分数。如果是这样,您就不再需要
    SequenceMatcher.ratio()
    了。)因此,您的意思是生成少量候选对象的解决方案可行,即使我正在构建类似于谷歌的东西?