最小编辑距离或莱文斯坦距离(Levenshtein),指由字符串A转化为字符串B的最小编辑次数。允许的编辑操作有:删除,插入,替换。具体内容可参见:维基百科—莱文斯坦距离。一般代码实现的方式都是通过动态规划算法,找出从A转化为B的每一步的最小步骤。从Google图片借来的图,
Python代码实现, (其中要注意矩阵的下标从1开始,而字符串的下标从0开始):
def normal_leven(str1, str2): len_str1 = len(str1) + 1 len_str2 = len(str2) + 1 #create matrix matrix = [0 for n in range(len_str1 * len_str2)] #init x axis for i in range(len_str1): matrix[i] = i #init y axis for j in range(0, len(matrix), len_str1): if j % len_str1 == 0: matrix[j] = j // len_str1 for i in range(1, len_str1): for j in range(1, len_str2): if str1[i-1] == str2[j-1]: cost = 0 else: cost = 1 matrix[j*len_str1+i] = min(matrix[(j-1)*len_str1+i]+1, matrix[j*len_str1+(i-1)]+1, matrix[(j-1)*len_str1+(i-1)] + cost) return matrix[-1]
最近看文章看到Python库提供了一个包difflib实现了从对象A转化对象B的步骤,那么计算最小编辑距离的代码也可以这样写了:
def difflib_leven(str1, str2): leven_cost = 0 s = difflib.SequenceMatcher(None, str1, str2) for tag, i1, i2, j1, j2 in s.get_opcodes(): #print('{:7} a[{}: {}] --> b[{}: {}] {} --> {}'.format(tag, i1, i2, j1, j2, str1[i1: i2], str2[j1: j2])) if tag == 'replace': leven_cost += max(i2-i1, j2-j1) elif tag == 'insert': leven_cost += (j2-j1) elif tag == 'delete': leven_cost += (i2-i1) return leven_cost
代码地址
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
更新日志
2024年11月25日
2024年11月25日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]