喵喵喵,细心的你有没有发现小夕已经将卧室和书房精装修了呢~
可以输入口令【ho】,或者点击主页的“旧的故事”标签进入哦。
一个小现象
小夕今天给大家讲一个自然语言处理/信息检索领域的小现象~
细心的同学可能发现啦,每当你在使用某度进行搜索时,一旦打了错别字,往往不会影响你的搜索结果,它会帮你自动校正。如下图所示~小夕把“搜狗”打成了“馊狗”
可以看到某度自动将馊狗给校正成搜狗了。
同样的现象还会发生在输入法、word等一系列自然语言文本输入的场合中。那么看起来如此不可思议的事情是怎么做到的呢?
小原理
可能有机智的喵喵会想到,只要将用户输入的词在字典里查一下不就好咯~查不到的词就是错词呀~
说的很对哦,但是更详细的说:
分词
在汉语纠错的时候还会有一个“分词”的过程,就是将用户输入的一串文本切分成一个个的词语。
比如用户输入了“搜狗搜索厉害吗”,那么负责分词的代码就会将其分成“搜狗|搜索|厉害|吗”。
如何分的呢?小夕以后讲哦~为了缩小本文规模,小夕以此处不需要分词的英文为例来讲解一下拼写校正技术。纠正
首先在词典中查找,确认该词是否为错词。但注意,在不同的应用中,词典的定义可能不一样呐。
比如在输入法中,词典是拼音词典,只要合乎拼音语法,基本就可以确定该词就是好词(除非有更智能的优化)。但在web搜索引擎中,词典是搜索热度词典,也就是记录用户输入某个词可能性的词典。比如上文中,“馊狗”的搜索热度很低,即罕见词。而与之相近的“搜狗”的热度会比“馊狗”的热度大很多,此时就可以将“馊狗”看作是错词,而实际上“馊狗”这个词语完全可能存在。
小夕为了缩小本文规模,不讨论分词过程哦,因此以英文单词为例讲解。(英文中的空格自带分词属性,2333)
小难点
而第二步的关键点,或者说难点在哪里呢?显然,查找某个词是否是罕见词很容易,就去词典里翻一翻就好了。但是如何确定与该错词的正确形式呢?或者说如何确定用户心里真正想输入的那个词呢?这就是关键啦。
一个很简单的例子是计算该错词与其他正常词的相似度,这个相似度叫编辑距离。然后我们得到编辑距离最小,也就是相似度最大的词,就是该错词的正确形式啦~
编辑距离有多种计算方法,其中最常用的是计算Levenshtein距离。
Levenshtein
这Levenshtein距离怎么计算呢?首先了解一下编辑操作:
1、 将一个字符插入字符串
2、 从字符串中去除一个字符
3、 将字符串中的一个字符替换成另外一个字符。
令上述操作的每一步的代价都为1,则一个单词变换成另一个单词的最小代价,也就是最少编辑操作次数,就为这两个单词的Levenshtein距离。
那么如何用算法实现两个单词之间的Levenshtein距离计算呢?
小算法
还记不记得小夕在上一篇文章中教给你的方法吖?要从算法问题中提炼算法思想哦,然后将算法思想再用于新的算法问题!
假如我们要计算paris和alice的Levenshtein距离,利用上一节提炼出来的枚举法、分治法等思想,是不是很轻松就出来思路啦?但是呢,小夕在这里不用这么low的算法啦,小夕要用动态规划(DP)思想来解决这个问题!
DP思想呢,小夕的解释就是DP会记忆你之前已经走过的道路,因此不会像枚举法+分治一样来来回回的对同一种情况反复计算。之前完全不了解DP的喵喵,小夕强烈建议你去看《算法导论》上的讲解哦,炒鸡清晰!
好,在开始之前,我们先画一张表格,用来记录走过的路~
这张表的每个元素都代表着两个串的编辑距离。比如上图中的元素N就代表着“pa”到“al”的编辑距离,最右下角的元素就代表着“paris”到“alice”的编辑距离,最左上角的元素代表着null到null的编辑距离。
显然呀,要从左上角按照某种轨迹走到右下角呢~(想不明白的请面壁,喵喵喵)
null到null的距离当然是0啦。所以第一个元素填0。
然后我们从左往右走,一行走完就从下一行的最左边开始走,直到走到右下角。
显然第二个元素代表从null到p的距离,我们只需要在它左边的元素的基础是,也就是null到null的基础上,将第二个null添加一个字符p(回忆一下前面的三种编辑操作)。所以代价增加1,所以第二个元素等于0+1=1。同理写出第一行的其他元素值。
第二行的第一个元素,只需要在它头上的元素的基础上加个a,所以是0+1。
而第二个元素开始就复杂些了,它(1)可以在左边元素的基础上修改,(2)也可以在上边元素的基础上修改。(3)万一遇到两个字符串末尾元素相同的情况,则编辑距离要等于左上角元素。比如pred到had的编辑距离与pre到ha的编辑距离相等!所以我们额外定义一下,如果两串末尾的元素不相等,则编辑距离还可以等于左上角元素的值+1。
然后我们计算出这三种情况后,取最小值为该元素的最终值。如图
该格子的左上角的1是基于左上角元素+1得到;右上角的2是基于上边的元素+1得到;左下角的2是基于左边的元素+1得到;右下角为前面这三种情况的最小值。
于是按照这种思路,整个表格就画成啦~
所以呀,前面讲过了,最右下角元素的右下角的值,就是paris与alice的最小编辑距离啦~即为4。
有人觉得,诶?计算量看起来也蛮大的嘛。好咯,你可以用蛮力法+分治画一张图试试,你就知道这张表格多小啦!
Completed!
看吧~人工智能大领域中的NLP领域的一个任务,最核心的就是你们算法课上学的动态规划啦~千万不要书到用时方恨少哦,跟小夕一起学算法吧,喵喵喵~
所以,要不要考虑给小夕买好吃的呀o(≧v≦)o