fuzzywuzzy:計算兩個字符串之間的相似度


 
 
fuzzywuzzy 是用來計算兩個字符串之間的相似度的,它是依據Levenshtein Distance算法來進行計算的。

Levenshtein Distance 算法,又叫 Edit Distance 算法,是指兩個字符串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符,刪除一個字符。一般來說,編輯距離越小,兩個串的相似度越高。

from fuzzywuzzy import fuzz

# 調用fuzz.ratio即可計算兩個字符串之間的相似度
print(fuzz.ratio("古明地覺", "古明地戀"))  # 75

# 我們看到ratio是完全匹配的,它把字符串的長度也考慮在內了
print(fuzz.ratio("古明地覺", "古明地覺aa"))  # 80

# partial_ratio是非完全匹配,如果一方結束了,那么剩下的就不考慮了
print(fuzz.partial_ratio("古明地覺", "古明地覺也叫小五蘿莉"))  # 100

# token_sort_ratio表示忽略順序匹配,但前提是多個詞,以空格進行分隔。所以明顯是針對英文的
print(fuzz.ratio("古 明 地 覺", "古 明 地 覺"[:: -1]))  # 25
print(fuzz.token_sort_ratio("古 明 地 覺", "古 明 地 覺"[:: -1]))  # 100

# token_set_ratio表示去重匹配,同樣:前提是多個詞,以空格進行分隔
print(fuzz.ratio("a a a he", "a he"))  # 67
print(fuzz.token_set_ratio("a a a he", "a he"))  # 100

當我們使用 git 的時候,如果命令輸錯了,那么會告訴你此命令不是一個 git 命令,這是理所應當的。然后重點來了,並且 git 還會提示一些與你輸錯的命令長得非常相似的一些命令。

所以這里面也用到了字符串的相似度原理,找出 git 命令中和你輸錯的命令最相似的幾個,然后進行提示。

如果我們也寫了一個類似的程序,需要用戶通過命令行參數的方式,那么當用戶輸入了一個不存在的命令,我們也可以這么做。而實現方法也很簡單,就是將所有的命令和用戶輸錯的命令都計算一個字符串相似度,然后返回相似度最高的 n 個即可。

使用上面的 fuzz 函數完全可以實現,當然 fuzzywuzzy 模塊還提供了一個 extract 函數,可以讓我們更加輕松地做到這一點。

from fuzzywuzzy import process

words = ["hello python", "hello java", "hello golang", "hello php"]
# 會自動和words里面的每一個元素進行比較,然后按照相似度從高到低排列
print(process.extract("hello thon", words))
# [('hello python', 91), ('hello php', 74), ('hello golang', 73), ('hello java', 64)]

# 還可以傳入一個limit參數,表示只返回前limit個,默認為5
print(process.extract("hello thon", words, limit=2))  # [('hello python', 91), ('hello php', 74)]

# 返回分數最高的
print(process.extractOne("hello thon", words))  # ('hello python', 91)

這個模塊使用起來還是比較簡單的,當然核心是字符串相似度的計算原理,這才是重點,有興趣可以去了解一下。

另外使用fuzzywuzzy這個模塊的時候,會彈出一個警告:

UserWarning: Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning

提示我們可以通過 pip install python-Levenshtein得到解決,python-Levenshtein 是一個用於加速字符串匹配的庫,可提供 4 到 10 倍的加速。另外這個庫在 Windows 上通過 pip 安裝會失敗,如果你本地沒有 vscode 的話,不過我們可以去 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 這個網站上面下載。當然即使沒有這個庫也是可以的,沒有的話 fuzzywuzzy 底層會使用 Python 的標准庫 difflib 進行匹配,只是會彈出警告罷了。


免責聲明!

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



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