前言
上一篇博客中简单介绍了下维特比算法,但是没有细纠其中的细节,本文将会以一个分词的例子来讲解维特比算法。
分词
分词已经是目前比较成熟的技术了,市面上也有很多优秀的包供大家使用,但是你真的明白了其中的原理吗。分词的方式有基于匹配规则的,也有基于语言模型,深度学习模型来的,但是其原理终究还是离不开上一篇博客介绍的那个流程即预分词+语言模型。
本文将会给大家先简单介绍一下基于匹配规则的分词方式,最大匹配。
最大匹配原理很简单,其包括两种方式,前向最大匹配与后向最大匹配,先以前向为例讲解。
首先我们需要预先定义好一个词典,词典中包含了所有常见的分词。假如我们有一个词典[我们,经常,有,有意见,意见,分歧]
,当拿到句子我们经常有意见分歧
时,我们需要先设置一个超参数maxlen,假设我们这里设置的是5,就会先从句子的左边开始,选择出五个字符我们经常有
,然后把选择出来的值和字典进行匹配,看是否能匹配到对应的词,如果没有,就把选择出来的字符串末尾的字符去除只剩下我们经常
,再和词典匹配,以此类推直到匹配到对应的词我们
,然后再从匹配到词的下一个位置选出5个字符经常有意见
继续进行匹配。最终我们就能拿到分词后的结果我们,经常,有意见,分歧
如果是反向最大匹配,那么就是从尾部选择maxlen个字符与字典进行匹配,没有匹配到就把头部的一个字符去除继续匹配,如果是上面的例子那么反向匹配的结果为我们,经常,有意见,分歧
不同的分词方式可能会得到不同的分词结果,还是拿上面的句子为例经常有意见分词
,实际上可以分为经常,有意见,分歧
与经常,有,意见,分歧
,这个时候我们就需要考虑到底是哪种分词更好,聪明的你一定发现了,可以使用我们之前介绍的语言模型,哪个概率高最后就选择哪一个的分词。
Vertbi维特比详解
分词和机器翻译都有一样的问题,在语言模型阶段时间复杂度太高,怎么解决呢,这就需要用到维特比算法。
还是举刚才的例子,经常有意见分词
,我们的词典与对应的概率如下
词典:[经常,经,有,有意见,意见,分歧,见,意,见分歧,歧]
概率:[0.1,0.05,0.1,0.1,0.2,0.2,0.05,0.05,0.05,0.1]
log(x):[2.3,3,2.3,2.3,1.6,1.6,3,3,3,2.3]
其中概率值指的是对应的词在文本中出现的概率,这个是事先在大量文本中统计出来的。因为概率值是一个小于1的值,如果词典中的词很多,那么每个词的概率值会很小,相乘的结果可能导致下溢,所以加上log函数,log是一个单调递增的函数因此不会影响我们需要的结果。
对于没有在词典中出现的词,我们可以假设他是一个概率值很接近于0的值,这里我们设其log后的值为20
有了词典和概率值后,我们定义一个有向无环图,把对应的句子所有的分词形式标注在图中,并添加上对应的权重。
最终我们把问题转变为了求最短路径问题,再采用DP算法即可得到最短的路径,根据最短的路径找到对应的词即是我们要的分词结果。