动态规划 维特比 viterbi python实现

**

动态规划

**

最近在做关于拼音纠错的项目, 需要用到大量算分的步骤,笛卡尔积是在太慢, 在网上查一下,维特比比较好用, 于是找一找搜一搜原理
看到了这个仁兄的https://blog.csdn.net/athemeroy/article/details/79339546
于是动手写个python 实现

def viterbi(data, get_score, big=True):
    def most(some):
        if big:
            return max(some)
        else:
            return min(some)
    short_data = []
    for left_index, right_index in enumerate(range(1, len(data))):
        before = data[left_index]
        after = data[right_index]
        if left_index == 0:
            for before_one in before:
                for after_one in after:
                    k = before_one + '_' + after_one
                    short_data.append((get_score(k), after_one, [before_one, after_one]))
        else:
            temp_data = []
            for after_one in after:
                temp_short_data = []
                for before_one in short_data:
                    k = before_one[1] + '_' + after_one
                    temp_short_data.append((before_one[0] + get_score(k), after_one, before_one[2] + [after_one]))
                temp_data.append(most(temp_short_data))
            short_data = temp_data
    return max(short_data)[2]


if __name__ == '__main__':
    data = [
        ['a'],
        ['b1', 'b2', 'b3'],
        ['c1', 'c2', 'c3'],
        ['d1', 'd2', 'd3'],
        ['e'],
    ]


    def get_score(k):
        try:
            relation_score = {
                'a_b1': 6, 'a_b2': 7, 'a_b3': 5, 'b1_c1': 5, 'b1_c2': 6, 'b1_c3': 9,
                'b2_c1': 4, 'b2_c2': 3, 'b2_c3': 7, 'b3_c1': 4, 'b3_c2': 6, 'b3_c3': 6, 'c1_d1': 7, 'c1_d2': 8, 'c1_d3': 3,
                'c2_d1': 5, 'c2_d2': 4, 'c2_d3': 3, 'c3_d1': 5, 'c3_d2': 7, 'c3_d3': 6, 'd1_e': 4, 'd2_e': 8, 'd3_e': 5, }
            score = relation_score[k]
        except:
            score = 0
        return score

    print(viterbi(data=data, get_score=get_score, big=False))

参数名还算清楚,
get_score函数可以自己改动成其他的获取方式
big=True就是最大路径,False就是最小路径
数据就是按照我上面那个链接里的仁兄的数据写的
本来想把实现附在他的评论区得,可是由于字数限制, 就自己发一篇吧
请各位跑过去点赞~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值