**
动态规划
**
最近在做关于拼音纠错的项目, 需要用到大量算分的步骤,笛卡尔积是在太慢, 在网上查一下,维特比比较好用, 于是找一找搜一搜原理
看到了这个仁兄的https://blog.youkuaiyun.com/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就是最小路径
数据就是按照我上面那个链接里的仁兄的数据写的
本来想把实现附在他的评论区得,可是由于字数限制, 就自己发一篇吧
请各位跑过去点赞~