python比較字串相似度
python自帶比較相似度的模組,difflib。比較兩個字串的模組是difflib.SequenceMatcher,使用起來很簡單:
import difflib
def string_similar(s1, s2): return difflib.SequenceMatcher(None, s1, s2).quick_ratio()
print string_similar('愛爾眼科滬濱醫院', '滬濱愛爾眼科醫院')
print string_similar('安定區婦幼保健站', '定西市安定區婦幼保健站')
print string_similar('廣州市醫院', '廣東省中醫院')
執行結果:
1.0
0.842105263158
0.606060606061
最主要的是,python原生的模組的效率都比較好。其中None的位置是一個函式,用來去掉自己不想算在內的元素。比如我想把空格排除在外:
seq = difflib.SequenceMatcher(lambda x:x=" ", a, b)
ratio = seq.ratio()
準備做一個小功能,需要計算字串的相似度,提前做點功課。
演算法
字串相似度的演算法以及有很多資料了。最常見的理解就是:把一個字串通過插入、刪除或替換這樣的編輯操作,變成另外一個字串,所需要的最少編輯次數。AKA,兩個字串之間的距離。解這樣一個問題,可以使用窮舉法,也可以使用動態規劃,大家可以自行搜尋。貪婪法不適合這個問題。
python-Levenshtein
我需要使用python完成相似度的計算,因而選擇了python-Levenshtein。python-Levenshtein的常用函式包括:
1) Levenshtein.hamming(str1, str2)
計算 漢明距離。 要求str1和str2必須長度一致。是描述兩個等長字串之間 對應 位置上 不同 字元的個數。
2)Levenshtein.distance(str1, str2)
計算 編輯距離 (也稱為Levenshtein距離 )。是描述由一個字串轉化成另一個字串最少的操作次數,在其中的操作包括 插入 、 刪除 、 替換 。
3)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,就可以解決這個問題。