【Python】比較字符串相似度


字符串相似度應用場景:拼寫糾錯、文本去重、上下文相似性、不同來源數據對比等。
評價字符串相似度最常見的辦法就是:把一個字符串通過插入、刪除或替換這樣的編輯操作,變成另外一個字符串,所需要的最少編輯次數,這種就是編輯距離(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM