字符串相似度應用場景:拼寫糾錯、文本去重、上下文相似性、不同來源數據對比等。
評價字符串相似度最常見的辦法就是:把一個字符串通過插入、刪除或替換這樣的編輯操作,變成另外一個字符串,所需要的最少編輯次數,這種就是編輯距離(edit distance)度量方法,也稱為Levenshtein距離。
方法1、difflib模塊
1 # 優點:python自帶模塊,效率比較高 2 def similar_diff_ratio(str1, str2): 3 return difflib.SequenceMatcher(None, str1, str2).ratio() 4 5 # quick_ratio()比ratio()計算效率更高,計算結果一致 6 def similar_diff_qk_ratio(str1, str2): 7 return difflib.SequenceMatcher(None, str1, str2).quick_ratio() 8 9 # None參數是一個函數,用來去掉不需要比較的字符。比如,列表lst_str表示計算相似度時不需要比較的字符 10 def similar_diff_ratio_filter(lst_str, str1, str2): 11 return difflib.SequenceMatcher(lambda x: x in lst_str, str1, str2).ratio() 12 13 print(similar_diff_ratio("臨安區中小企業創業基地", "臨安區電子商務科技園")) 14 print(similar_diff_qk_ratio("臨安區中小企業創業基地", "臨安區電子商務科技園")) 15 # 有一點疑問,將不需要比較的字符加入后,相似度計算結果沒變化,歡迎大佬留言解惑,謝謝! 16 lst_str = ['臨安區', '創業', '為什么', '忽略', '某些字符之后', '相似度還是一致'] 17 print(similar_diff_ratio_filter(lst_str, "臨安區中小企業創業基地", "臨安區電子商務科技園"))
0.2857142857142857
0.2857142857142857
0.2857142857142857
方法2、通過在長度較短的字符串末尾補充空格,將2個字符串處理成等長,然后從左至右比較同位置字符串
1 def similar_left(str1, str2): 2 str1 = str1 + ' ' * (len(str2) - len(str1)) 3 str2 = str2 + ' ' * (len(str1) - len(str2)) 4 return sum(1 if i == j else 0 for i, j in zip(str1, str2)) / float(len(str1)) 5 6 print(similar_left("臨安區中小企業創業基地", "臨安區電子商務科技園")) 7 print(similar_left("臨安區電子商務科技園", "園技科務商子電區安臨"))
0.2727272727272727
0.0
方法3、Levenshtein模塊
3.1、相似度
1 # 萊文斯坦比 2 def similar_lvst_ratio(str1, str2): 3 return Levenshtein.ratio(str1, str2) 4 5 # jaro距離 6 def similar_lvst_jaro(str1, str2): 7 return Levenshtein.jaro(str1, str2) 8 9 # Jaro–Winkler距離 10 def similar_lvst_winkler(str1, str2): 11 return Levenshtein.jaro_winkler(str1, str2) 12 13 print(similar_lvst_ratio("臨安區中小企業創業基地", "臨安區電子商務科技園")) 14 print(similar_lvst_jaro("臨安區中小企業創業基地", "臨安區電子商務科技園")) 15 print(similar_lvst_winkler("臨安區中小企業創業基地", "臨安區電子商務科技園"))
0.2857142857142857
0.5242424242424243
0.666969696969697
3.2、相似性度量
1 # distance編輯距離(也稱為Levenshtein距離 )。是描述由一個字串轉化成另一個字串最少的操作次數,在其中的操作包括插入、刪除、替換。 2 def similar_lvst_distance(str1, str2): 3 return Levenshtein.distance(str1, str2) 4 5 # hamming漢明距離是編輯距離的一種特殊情況。 要求str1和str2必須長度一致,描述兩個等長字串之間對應位置上不同字符的個數。 6 def similar_lvst_hamming(str1, str2): 7 return Levenshtein.hamming(str1, str2) 8 9 print(similar_lvst_distance("臨安區中小企業創業基地", "臨安區電子商務科技園")) 10 print(similar_lvst_hamming("臨安區中小企業創業基地", "臨安區電子商務科技園區"))
8
8
其他常用相似性度量方法還有 Jaccard distance、J-W距離(Jaro–Winkler distance)、余弦相似性(cosine similarity)、歐氏距離(Euclidean distance)等。
若想對以上方法有更深入研究,可參考大佬博客:https://www.cnblogs.com/wt869054461/p/5777782.html