zoukankan      html  css  js  c++  java
  • 自然语言处理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

  • 相关阅读:
    程序集“xxx"中的类型"xxx"的方法“XXXX”没有实现
    关于C# json转object时报错:XXXXXXXXXX需要标记“"”,但找到“XX”。
    System.Reflection.Assembly.GetEntryAssembly()获取的为当前已加载的程序集
    MongoDB 模糊查询,及性能测试
    SignalR介绍与Asp.net,前台即时通信【转】
    mongodb常用命令【转】
    MongoDB update数据语法【转】
    Mongodb在Windows下安装及配置 【转】
    C#(asp.net)备份还原mssql数据库代码【转】
    小记,取GB2312汉字的首字母【转】
  • 原文地址:https://www.cnblogs.com/loubin/p/13692813.html
Copyright © 2011-2022 走看看