1. Levenshtein包
1.1 计算编辑距离
三类编辑动作{替换, 删除, 插入}的cost均为1。
它等价于公式
d
=
l
e
n
(
s
t
r
1
)
+
l
e
n
(
s
t
r
2
)
−
s
a
m
e
l
e
n
(
s
t
r
1
,
s
t
r
2
)
d=len(str1)+len(str2)-samelen(str1, str2)
d=len(str1)+len(str2)−samelen(str1,str2)。
>>> import Levenshtein
>>> Levenshtein.distance('lewenstein', 'levenshtein')
2 # w->v, ∅->h
1.2. 计算相似度
不同于1.1,此处编辑动作{删除, 插入}的cost仍为1、但{替换}的cost为2。分母是两个字符串长度之和,相似度的分子是两个字符串长度之和减去编辑动作cost之和。
它等价于公式
s
i
m
=
1
−
Σ
(
c
o
s
t
)
/
Σ
(
l
e
n
)
sim=1-\Sigma(cost)/\Sigma(len)
sim=1−Σ(cost)/Σ(len)。
>>> Levenshtein.ratio('lewenstein', 'levenshtein')
0.8571 # w->v, ∅->h # 1-(2+1)/(10+11)
2. rapidfuzz包
2.1 Indel
- 计算编辑距离
编辑动作{删除, 插入}的cost为1,{替换}的cost为2。
>>> from rapidfuzz.distance import Indel
>>> Indel.distance('lewenstein', 'levenshtein')
3
- 计算相似度
编辑动作{删除, 插入}的cost为1,{替换}的cost为2。分母是两个字符串长度之和,相似度的分子是两个字符串长度之和减去编辑动作cost之和。
它与1.2的Levenshtein.ratio公式相同。
>>> Indel.normalized_similarity('lewenstein', 'levenshtein')
0.8571 # 1-3/(11+10)
2.2 Levenshtein
- 计算编辑距离
三类编辑动作{替换, 删除, 插入}的cost均为1。
它与1.1的Levenshtein.distance公式相同。
>>> from rapidfuzz.distance import Levenshtein
>>> Levenshtein.distance('lewenstein', 'levenshtein')
2
- 计算相似度
三类编辑动作{替换, 删除, 插入}的cost均为1。分母是两个字符串长度较大值,相似度的分子是两个字符串长度较大值减去编辑动作cost之和。
>>> Levenshtein.normalized_similarity('lewenstein', 'levenshtein')
0.8182 # 1- 2/11