如何求兩個序列的相似度
阿新 • • 發佈:2019-02-06
引入
衡量兩個序列的相似度,可以用馬氏距離,歐氏距離等距離公式來度量。
但對兩個字串,比如kitten
與sitting
的相似度是多少?
如果是兩個等長字串,也可以用one-hot對每個字母編碼,然後用馬氏、歐式距離也可以計算。但對不等長的兩個字串,怎麼計算相似度呢?
更一般的說法,如何計算兩個不等長陣列的相似度呢?
萊文斯坦(Levenshtein)距離
萊文斯坦距離就用是來解決這個問題的。先看它的公式:
其中a
,b
是兩個陣列(字串),i/j是陣列下標。萊文斯坦距離
的含義,是求將a
變成b
(或將b
變成a
),所需要做的最少次數的變換。
舉個例子,字串”kitten”與”sitting”的萊文斯坦距離
- kitten → sitten (字元k變為s)
- sitten → sittin (字元e變成i)
- sittin → sitting (在末尾插入字元g)
python實現
(1)安裝Levenshtein模組
pip install python-Levenshtein
(2)計算兩個字串的相似度
import Levenshtein
s1 = 'kitten'
s2 = 'sitting'
ratio = Levenshtein.ratio(s1, s2)
dist = Levenshtein.distance (s1, s2)
print('ratio={0}, dist={1}'.format(ratio, dist))
# ratio=0.6153846153846154, dist=3
(3)計算兩個字串list的相似度
import Levenshtein
a = ['1','2','3','4','5']
b = ['2','3','4']
Levenshtein.seqratio(a, b)# 0.75