语音识别维特比解码_自然语言处理之维特比算法

简介

鉴于维特比算法可解决多步骤中每步多选择模型的最优选择问题,本文简要介绍了维特比算法的基本理论,并从源代码角度对维特比算法进行剖析,并对源码中涉及的要点进行了解读,以便能快速应用该算法解决自然语言处理中的问题。

理论

维特比算法是一个特殊但应用最广的动态规划算法,利用动态规划,可以解决任何一个图中的最短路径问题。而维特比算法是针对一个特殊的图——篱笆网络的有向图(Lattice )的最短路径问题而提出的。 凡是使用隐含马尔可夫模型描述的问题都可以用它来解码,包括今天的数字通信、语音识别、机器翻译、拼音转汉字、分词等。——摘自《数学之美》

给定某一个观察者序列Y= {y1, y2, ..., yn}, 而产生它们的隐含状态为X={x1, x2, ..., xn}, 其中在任意时刻t(即观察者)下,其对应的隐含状态存在多种可能;若将每个观察者视为一步,则每步是一个多选择问题。如图-1所示为维特比算法的数学表达式, 其目标即为获取最大概率值下的隐含状态序列:

图-1 维比特算法数学表达式

此外,若将上述隐含状态序列按值进行展开,则会得到常见的篱笆网络结构,如图-2所示:

图-2 篱笆网络

维特比算法利用动态规划思想求解概率最大路径(可理解为求图最短路径问题), 其时间复杂度为O(N*L*L),其中N为观察者序列长度,L为隐含状态大小。该算法的核心思想是:通过综合状态之间的转移概率和前一个状态的情况计算出概率最大的状态转换路径,从而推断出隐含状态的序列的情况,即在每一步的所有选择都保存了前继所有步骤到当前步骤当前选择的最小总代价(或者最大价值)以及当前代价的情况下后续步骤的选择。依次计算完所有步骤后,通过回溯的方法找到最优选择路径。

简单来说,在计算第t+1时刻的最短路径时,只需要考虑从开始到当前t时刻下k个状态值的最短路径和当前状态值到第t+1状态值的最短路径即可。如求t=3时的最短路径,等于求t=2时的所有状态结点x2t(见上图-2所示)的最短路径再加上t=2到t=3的各节点的最短路径。

以下将从源代码的角度,对维比特算法进行剖析,分别从wikipedia、HanLP以及个人冗余代码3种实现方式进行剖析。

源码之Wiki(有改动)

public classViterbi {private static classTNode {public int[] v_path; //节点路径

public double v_prob; //概率累计值

public TNode( int[] v_path, doublev_prob) {this.v_path =copyIntArray(v_path);this.v_prob =v_prob;

}

}private stat

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值