拼音转汉字算法(隐马尔科夫、维特比算法)

来源:互联网 发布:小型网络机柜 编辑:程序博客网 时间:2024/05/17 07:50

问题:根据用户输入的拼音串得到用户想要输入的语句。

隐马尔科夫模型:

可以把这个问题看做是通信问题,即拼音串是接收到的信号,目的是推测出真正的信号。这时就可以使用隐马尔科夫模型。

是用户输入的拼音,每个拼音对应一个汉字,那么整个拼音串就对应一句话。

是用户想要输入的语句,那么现在的问题可以转化为:

,w取所有可能。这其实就是一个模型求参数的问题!

根据贝叶斯公式、独立输出假设和马尔科夫假设,上述问题可以变化为:

求使概率最大的

由于在拼音转汉字的问题中某个汉字对应的拼音是固定的,也就是说的值为1(个人理解)。所以主要问题就是如何求的最大值。这就需要使用到维特比算法了!

维特比算法:

由于每个拼音会对应多个汉字,即,所以构成了一个特殊的网络,晶格网络(Lattice),如下图:


那么求的最大值就可以看做求这个网络最短路径(或最长路径)的问题,而维特比算法就是求解Lattice网络最短路径的一个动态规划算法。

先看暴力求解,即遍历所有可能的路径,然后找到最短路径(对应于拼音转汉字中的最大概率)。假设假设网络的宽度是D(每一层有多少个节点),网络的长度是N(有多少层),那么暴力遍历所有路径的时间复杂度是

维特比算法的思想其实很简单,就是假设到达某一个节点的最短路径已经求出并存储在该节点上,那么计算某一层的节点时,只需要计算前一层所有节点到该节点的路径长度加上起点到前一层节点的最短路径中的最小值就是起点到该节点的最短路径。以求第二层节点的最短路径为例,维特比算法可以表示为:

,这里表示求第2层第i个节点的最短路径,S表示起点。可以看出求第二层某个节点的最短路径要遍历第一层所有的节点。假设第二层有n2个节点,那么计算一层节点的最短路径的操作数为n2*n1。所以维特比算法的时间复杂度是。可以看出这要比暴力求解快很多。


更正:

上面提到的一句话是错误的,即每个汉字对应的拼音是固定的,这显然是不对的,因为存在多音字!所以每个汉字会对应多个拼音,这就是观测概率。相应的在进行维特比算法计算最优路径时也需要进行修改,下面形式化的介绍维特比算法,与上面的介绍并不矛盾!

定义:

状态:i,即用户想要输入的汉字w(是无法观测的)。

观测:o,即用户输入的拼音(可以观测)。

状态转移概率:,从状态i转移到状态j的概率,即用户输入汉字之后想要输入的概率。

观测概率:,处于状态i时观测到输入ot的概率,即当用户想要输入,对应的拼音是的概率。

状态转移概率和观测概率和初始概率都需要学习得到。

在时刻t状态为i的所有单个路径中概率的最大值为:


其递推公式为:


在时刻t状态为i的所有单个路径中概率最大的路径的第t-1个节点(就是当前节点的前一个节点)为:


这下描述维特比算法就比较简单了:

(1)初始化

(2)对于t=2,3,...,T,求

(3)终止,选择概率最大的节点。

(4)根据求出概率最大的路径!






0 0
原创粉丝点击