字串相似度應用場景:拼寫糾錯、文字去重、上下文相似性、不同**資料對比等。評價字串相似度最常見的辦法就是:把乙個字串通過插入、刪除或替換這樣的編輯操作,變成另外乙個字串,所需要的最少編輯次數,這種就是編輯距離(edit distance)度量方法,也稱為levenshtein距離。
方法1、difflib模組
1#優點:python自帶模組,效率比較高
2def
similar_diff_ratio(str1, str2):
3return
difflib.sequencematcher(none, str1, str2).ratio()45
#quick_ratio()比ratio()計算效率更高,計算結果一致
6def
similar_diff_qk_ratio(str1, str2):
7return
difflib.sequencematcher(none, str1, str2).quick_ratio()89
#none引數是乙個函式,用來去掉不需要比較的字元。比如,列表lst_str表示計算相似度時不需要比較的字元
10def
similar_diff_ratio_filter(lst_str, str1, str2):
11return difflib.sequencematcher(lambda x: x in
lst_str, str1, str2).ratio()
1213
print(similar_diff_ratio("
臨安區中小企業創業基地
", "
臨安區電子商務科技園"))
14print(similar_diff_qk_ratio("
臨安區中小企業創業基地
", "
臨安區電子商務科技園"))
15#16 lst_str = ['
臨安區', '
創業', '
為什麼', '
忽略', '
某些字元之後
', '
相似度還是一致']
17print(similar_diff_ratio_filter(lst_str, "
臨安區中小企業創業基地
", "
臨安區電子商務科技園
"))
0.2857142857142857
0.2857142857142857
0.2857142857142857
方法2、通過在長度較短的字串末尾補充空格,將2個字串處理成等長,然後從左至右比較同位置字串
1defsimilar_left(str1, str2):
2 str1 = str1 + '
' * (len(str2) -len(str1))
3 str2 = str2 + '
' * (len(str1) -len(str2))
4return sum(1 if i == j else 0 for i, j in zip(str1, str2)) /float(len(str1))56
print(similar_left("
臨安區中小企業創業基地
", "
臨安區電子商務科技園"))
7print(similar_left("
臨安區電子商務科技園
", "
園技科務商子電區安臨
"))
0.2727272727272727
0.0
方法3、levenshtein模組3.1、相似度
1#萊文斯坦比
2def
similar_lvst_ratio(str1, str2):
3return
levenshtein.ratio(str1, str2)45
#jaro距離
6def
similar_lvst_jaro(str1, str2):
7return
levenshtein.jaro(str1, str2)89
#jaro–winkler距離
10def
similar_lvst_winkler(str1, str2):
11return
levenshtein.jaro_winkler(str1, str2)
1213
print(similar_lvst_ratio("
臨安區中小企業創業基地
", "
臨安區電子商務科技園"))
14print(similar_lvst_jaro("
臨安區中小企業創業基地
", "
臨安區電子商務科技園"))
15print(similar_lvst_winkler("
臨安區中小企業創業基地
", "
臨安區電子商務科技園
"))
0.2857142857142857
0.5242424242424243
0.666969696969697
3.2、相似性度量
188#distance編輯距離(也稱為levenshtein距離 )。是描述由乙個字串轉化成另乙個字串最少的操作次數,在其中的操作包括插入、刪除、替換。
2def
similar_lvst_distance(str1, str2):
3return
levenshtein.distance(str1, str2)45
#hamming漢明距離是編輯距離的一種特殊情況。 要求str1和str2必須長度一致,描述兩個等長字串之間對應位置上不同字元的個數。
6def
similar_lvst_hamming(str1, str2):
7return
levenshtein.hamming(str1, str2)89
print(similar_lvst_distance("
臨安區中小企業創業基地
", "
臨安區電子商務科技園"))
10print(similar_lvst_hamming("
臨安區中小企業創業基地
", "
臨安區電子商務科技園區
"))
其他常用相似性度量方法還有 jaccard distance、j-w距離(jaro–winkler distance)、余弦相似性(cosine similarity)、歐氏距離(euclidean distance)等。若想對以上方法有更深入研究,可參考大佬部落格:
python比較字串相似度
python自帶比較相似度的模組,difflib。比較兩個字串的模組是difflib.sequencematcher,使用起來很簡單 import difflib def string similar s1,s2 return difflib.sequencematcher none,s1,s2 q...
Php 比較字串相似度
除了利用cookies ip限制等技術外,我們可以利用php自身帶的similar text函式來判斷使用者發帖內容的相似度。similar text 函式計算兩個字串的匹配字元的數目,也可以計算兩個字串的相似度 以百分比計 similar text string1,string2,percent ...
字串相似度
這個演算法 於網上,但忘記了出處,對其使使用了 issame封裝,然後用在了自己的網頁資料抓取 中。求解兩個字串的相似度int calculatestringdistance const string stra,const string strb intret c lena 1 lenb 1 for...