一、详细过程
拼写纠错任务目标是找到概率最大的 p(correct|incorrect)比如:incorrect='appl',而correct 可以为任何词,我们的目的就是要找到哪个词作为correct时,能使的p(correct|incorrect)最大,但是,当没有任何日志的时候,我们无法直接得到max(p(correct|incorrect)),因此可以根据贝叶斯定律:
p(correct|incorrect)=p(incorrect|correct)*p(correct)
那么求max(p(correct|incorrect))就变成求max(p(incorrect|correct)*p(correct)),理论我们要计算所有的词写成appl的概率,显然这个是不现实,根据先验知识,哪些词较大概率写成appl呢?,当然是和appl编辑距离为1的单词,所以我们可以把与appl编辑距离为1的单词列举出来并过滤到不是正确单词的词,作为候选集(相当于推荐中的召回,从所有的单词中,召回编辑距离为1的单词)。
在没有日志前,可以把所有编辑距离为1的单词的写错成appl的概率认为相同的,那么p(correct)最大,那么这个correct就是最可能是appl对应的正确的词。
关键是p(correct)是怎么计算的到的呢?
p(correct)计算需要通过语言模型,语言模型可以通过语料统计而来,uigram语言模型就是能计算p(word)
的概率(其实就是根据词频),而bigram语言模型就是能计算p(word1|word2)的概率,同理trigram,就是能计算p(word1|word2,word3)的概率,举个例子:
假如我们的语料库是:I like it, beacuse it is very interesting.
根据这个语料库,我们得到的uigram模型是:p(word)=每个单词出现的次数/语料库总词数
得到的bigram模型:p(word1|word2)=每个单词word1出现在word2之后的次数/word1在语料库出现的总次数
比如:p(it|like)=1/2而 p(like|I)=1
那么言归正传 p(correct)的计算,就是根据已经训练好的模型,依次计算每个候选的correct单词的P(correct),假如是采用uigram模型,那就是计算哪个correct单词在语料库出现的次数多,哪个就是最可能正确的单词,显然这种不是很准,我们一般采用bigram或trigram语言模型来计算p(correct),也就是我们要考虑appl之前是什么单词,如果前一个单词是乔布斯,则就是计算p(correct|乔布斯),根据语言模型得到哪个候选correct最大。
二、总结一下,拼写纠错的一般步骤:
1、首先检测出 是哪个单词发生了拼写错误
这可以通过查字典来实现,比如依次扫描每个单词,若该单词不在词典中(未被词典收录),则认为它是一个拼写错误的单词。显然,词典越大,词典收录的单词越多,我们就越能正确检测出错误的单词。
2、其次,找到一组候选集
常用的就可以通过“编辑距离算法”来实现
3、根据贝叶斯从候选词中找到最有可能能的正确单词
p(correct|incorrect)=p(incorrect|correct)*p(correct)=候选词写错成incorrect的概率*候选词在语言模型中合理的概率
三、实战举例:
输入:
This is a useful appl
1、根据字典匹配发现 appl是拼写错的单词
2、根据编辑距离,找到正确的候选集:app,apple,apply...
3、如果有点击日志,可以得到p(appl|app),p(appl|apple),p(appl|apply)的概率,没有的话,因为编辑距离都为1,那么可认为相等再比较p(app|上下文),p(apple|上下文),p(apply|上下文),假如使用uigram模型,则根据预训练的语言模型,可得到P(app|useful),P(apple|useful),P(apply|useful)的概率,最后比较logp(appl|app)+logp(app|useful)、logp(appl|apple)+logp(apple|useful)和logp(appl|apply)+logp(apply|useful)的值,最终就得到结果。