1. 程式人生 > >如何求兩個序列的相似度

如何求兩個序列的相似度

引入

衡量兩個序列的相似度,可以用馬氏距離,歐氏距離等距離公式來度量。

但對兩個字串,比如kittensitting的相似度是多少?

如果是兩個等長字串,也可以用one-hot對每個字母編碼,然後用馬氏、歐式距離也可以計算。但對不等長的兩個字串,怎麼計算相似度呢?

更一般的說法,如何計算兩個不等長陣列的相似度呢?

萊文斯坦(Levenshtein)距離

萊文斯坦距離就用是來解決這個問題的。先看它的公式:

這裡寫圖片描述

其中ab是兩個陣列(字串),i/j是陣列下標。萊文斯坦距離的含義,是求將a變成b(或將b變成a),所需要做的最少次數的變換。

舉個例子,字串”kitten”與”sitting”的萊文斯坦距離

是3, 應為將一個字串變為另一個字串,最小需要做三次變換:

  • 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