(3条消息) Python Levenshtein 计算文本之间的距离

莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种。 指两个字串之間,由一个转成另一个所需的最少编辑操作次数。 允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,刪除一个字符。

GitHub 提供了计算莱文斯坦距离的包。
安装方法:

用法:

  1. Levenshtein.hamming(str1, str2)
    计算汉明距离。要求str1和str2必须长度一致。是描述两个等长字串之间对应位置上不同字符的个数。如

>>> Levenshtein.hamming('hello', 'world')4>>> Levenshtein.hamming('abc', 'abd')1
  1. Levenshtein.distance(str1, str2)
    计算编辑距离(也成Levenshtein距离)。是描述由一个字串转化成另一个字串最少的操作次数,在其中的操作包括插入删除替换。如

>>> Levenshtein.distance('hello', 'world')4>>> Levenshtein.distance('abc', 'abd')1>>> Levenshtein.distance('abc', 'aecfaf')4
  1. Levenshtein.ratio(str1, str2)
    计算莱文斯坦比。计算公式 r = (sum - ldist) / sum, 其中sum是指str1 和 str2 字串的长度总和,ldist是类编辑距离
    注意:这里的类编辑距离不是2中所说的编辑距离,2中三种操作中每个操作+1,而在此处,删除、插入依然+1,但是替换+2
    这样设计的目的:ratio('a', 'c'),sum=2,按2中计算为(2-1)/2 = 0.5,’a’,'c’没有重合,显然不合算,但是替换操作+2,就可以解决这个问题。

>>> Levenshtein.ratio('hello', 'world')0.2>>> Levenshtein.ratio('abc', 'abd')0.6666666666666666>>> Levenshtein.ratio('abc', 'aecfaf')0.4444444444444444
  1. Levenshtein.jaro(s1, s2)
    计算jaro距离, d j = { 0 i f m = 0 1 3 ( m ∣ s 1 ∣ + m ∣ s 2 ∣ + m − t m ) o t h e e r w i s e d_{j}=\left\{

    013(m|s1|+m|s2|+m−tm)amp;ifm=0amp;otheerwise0amp;ifm=013(m|s1|+m|s2|+m−tm)amp;otheerwise

    \right. dj={031(∣s1∣m+∣s2∣m+mm−t)ifm=0otheerwise
    其中m为 s 1 s_{1} s1, s 2 s_{2} s2的匹配长度,当位置的认为匹配当该位置字符相同,或者在不超过 ⌊ m a x ( ∣ s 1 ∣ , ∣ s 2 ∣ ) 2 ⌋ − 1 \left \lfloor \frac{max\left ( \left | s_{1} \right |, \left| s_{2} \right | \right )}{2} \right \rfloor-1 ⌊2max(∣s1∣,∣s2∣)⌋−1
    t是调换次数的一半

>>> Levenshtein.jaro('hello', 'world')0.43333333333333335>>> Levenshtein.jaro('abc', 'abd')0.7777777777777777>>> Levenshtein.jaro('abc', 'aecfaf')0.6666666666666666
  1. Levenshtein.jaro_winkler(s1, s2)
    计算Jaro–Winkler距离 d w = d j + ( l p ( 1 − d j ) ) d_{w} = d_{j}+(lp(1-d_{j})) dw=dj+(lp(1−dj))

>>> Levenshtein.jaro_winkler('hello', 'world')0.43333333333333335>>> Levenshtein.jaro_winkler('abc', 'abd')0.8222222222222222>>> Levenshtein.jaro_winkler('abc', 'aecfaf')0.7
(0)

相关推荐