• 自然语言处理2-2: 拼写纠错


    一.编辑距离

    关于编辑距离,在我的博客https://www.cnblogs.com/loubin/p/13672786.html中已经详细的介绍了。简短的说就是把一个单词修改成另一个单词需要的修改次数。当然,每一次只能增加一个字符,删除一个字符,或者更换一个字符。例如,apple和apply的编辑距离是1,只需要将e改成y即可。dog和pig的编辑距离是2,因为要把‘do’改成‘pi’。

    二.拼写纠错初级版

    其实就是去词典中找与输入的单词编辑距离最小的单词,例如,如果我输入apple,就去词典中对每个单词计算与apple的编辑距离,然后选择编辑距离最小的那个单词。但是,这样的话时间复杂度是O(v),这里v是词典中的单词个数,一般都是非常大的,例如几百万,所以时间复杂度可以说是非常大了。

    三.拼写纠错高级版

    对于输入的单词,  首先列出与其编辑距离为1的所有单词,然后基于这些单词再修改一次,生成与输入单词编辑距离为2的单词(当然,也可能修改回原样,这样编辑距离是0,也有可能修改后编辑距离还是1,但是两次修改之后,编辑距离一定是0,1,2)。然后再从这些单词中选择出最有可能的那个单词。那么具体怎么选择的呢?

    假设输入的单词是s,我们要找到正确的单词$hat{c} $,那么,也就是解决如下的数学问题:

    $$hat{c} = underset{c}{argmax} P(c|s )$$

    利用贝叶斯公式,可以转化为如下形式

    $$hat{c} = underset{c}{argmax} P(frac{c}{s} ) = underset{c}{argmax}frac{P(s|c)P(c)}{P(s)}  $$

    由于P(s)是一个固定的值,所以我们只需要求单词c,使得P(s|c)P(c)最小即可。

    P(c)好求,只需要统计单词c出现次数即可。而对于P(s|c),可以通过查阅历史的输入数据来获得。

    例如,对于单词apple,100个人中,有5个人输入成apply,2个人输入成applr,那么如果s是apply的话,则P(s|c)=1/20,同样,如果s是spplr,那么P(s|c)=1/50

  • 相关阅读:
    js正则表达式常见规则整理
    struts2标签 遍历map集合
    RabbitMQ面试问题
    vue基础学习
    flowableの历史查询
    flowableの日志打印
    flowableのID生成器
    flowableの流程发起人
    SpringBoot+Dubbo(XML配置方式)
    linux安装zookeeper伪分布式
  • 原文地址:https://www.cnblogs.com/loubin/p/13692813.html
Copyright © 2020-2023  润新知