python-编辑比例计算
python-Levenshtein ratio calculation
我有以下两个字符串:
a = 'bjork gudmundsdottir'
b = 'b. gudmundsson gunnar'
两者之间的编辑距离为12
。当我对 Levenshtein 距离使用以下公式时,我得到 0.01
与 python-Levenshtein
库的差异:
>>> Ldist / max(len( a ), len( b ))
>>> float(12)/21
0.5714285714285714
# python-Levenshtein
Levenshtein.ratio(a,b)
0.5853658536585366
# difflib
>>> seq=difflib.SequenceMatcher(a=a,b=b)
>>> seq.ratio()
0.5853658536585366
造成这种差异的原因是什么?我在计算中做错了什么。请注意,我已经查看了这个 How python-Levenshtein.ratio is computed 类似的问题,但它并没有完全回答我的问题。
有人可以解释一下用于计算上述比率的公式吗?
根据 Lukas 的评论,这样做的原因是 ratio()
使用 2 的成本进行替换操作,而不是 的正常成本1 表示 Levenshtein 距离。这是一个示例计算:
a = 'bjork gudmundsdottir'
b = 'b. gudmundsson gunnar'
>>> Levenshtein.editops(a,b)
[('delete', 1, 1), ('delete', 2, 1), ('delete', 3, 1), ('replace', 4, 1), ('replace', 14, 11), ('insert', 16, 13), ('insert', 16, 14), ('insert', 16, 15), ('insert', 16, 16), ('replace', 16, 17), ('replace', 17, 18), ('replace', 18, 19)]
>>> ldist = sum([2 for item in Levenshtein.editops(a,b) if item[0] == 'replace'])
+ sum([1 for item in Levenshtein.editops(a,b) if item[0] != 'replace']) # 17
ln = len(a) + len(b) # 41
>>> (41.0-17.0)/41.0
0.5853658536585366
>>> Levenshtein.ratio(a,b)
0.5853658536585366
我有以下两个字符串:
a = 'bjork gudmundsdottir'
b = 'b. gudmundsson gunnar'
两者之间的编辑距离为12
。当我对 Levenshtein 距离使用以下公式时,我得到 0.01
与 python-Levenshtein
库的差异:
>>> Ldist / max(len( a ), len( b ))
>>> float(12)/21
0.5714285714285714
# python-Levenshtein
Levenshtein.ratio(a,b)
0.5853658536585366
# difflib
>>> seq=difflib.SequenceMatcher(a=a,b=b)
>>> seq.ratio()
0.5853658536585366
造成这种差异的原因是什么?我在计算中做错了什么。请注意,我已经查看了这个 How python-Levenshtein.ratio is computed 类似的问题,但它并没有完全回答我的问题。
有人可以解释一下用于计算上述比率的公式吗?
根据 Lukas 的评论,这样做的原因是 ratio()
使用 2 的成本进行替换操作,而不是 的正常成本1 表示 Levenshtein 距离。这是一个示例计算:
a = 'bjork gudmundsdottir'
b = 'b. gudmundsson gunnar'
>>> Levenshtein.editops(a,b)
[('delete', 1, 1), ('delete', 2, 1), ('delete', 3, 1), ('replace', 4, 1), ('replace', 14, 11), ('insert', 16, 13), ('insert', 16, 14), ('insert', 16, 15), ('insert', 16, 16), ('replace', 16, 17), ('replace', 17, 18), ('replace', 18, 19)]
>>> ldist = sum([2 for item in Levenshtein.editops(a,b) if item[0] == 'replace'])
+ sum([1 for item in Levenshtein.editops(a,b) if item[0] != 'replace']) # 17
ln = len(a) + len(b) # 41
>>> (41.0-17.0)/41.0
0.5853658536585366
>>> Levenshtein.ratio(a,b)
0.5853658536585366