Python+fuzzywuzzy計(jì)算兩個(gè)字符串之間的相似度
fuzzywuzzy 可以計(jì)算兩個(gè)字符串之間的相似度,它依據(jù) Levenshtein Distance 算法來進(jìn)行計(jì)算。該算法又叫 Edit Distance 算法,是指兩個(gè)字符串之間,由一個(gè)轉(zhuǎn)成另一個(gè)所需要的最少編輯操作次數(shù)。許可的編輯操作包括將一個(gè)字符替換成另一個(gè)字符,插入一個(gè)字符,刪除一個(gè)字符。一般來說,編輯距離越小,兩個(gè)串的相似度越高。
我們來看一下該模塊的用法,非常簡單:
from?fuzzywuzzy?import?fuzz #?調(diào)用?fuzz.ratio?即可計(jì)算兩個(gè)字符串的相似度 print( ????fuzz.ratio("古明地覺",?"古明地戀") )??#?75 #?我們看到?ratio?是完全匹配的 #?它把字符串的長度也考慮在內(nèi)了 print( ????fuzz.ratio("古明地覺",?"古明地覺aa") )??#?80 #?partial_ratio是非完全匹配 #?如果一方結(jié)束了,那么剩下的就不考慮了 print( ????fuzz.partial_ratio("古明地覺",?"古明地覺,小五蘿莉") )??#?100 #?token_sort_ratio表示忽略順序匹配 #?但前提是多個(gè)詞,以空格進(jìn)行分隔 print( ????fuzz.ratio("古?明?地?覺",?"古?明?地?覺"[::?-1]) )??#?25 print( ????fuzz.token_sort_ratio("古?明?地?覺",?"古?明?地?覺"[::?-1]) )??#?100 #?token_set_ratio表示去重匹配 #?同樣:前提是多個(gè)詞,以空格進(jìn)行分隔 print(fuzz.ratio("a?a?a?he",?"a?he"))??#?67 print( ????fuzz.token_set_ratio("a?a?a?he",?"a?he") )??#?100
當(dāng)我們使用 git 的時(shí)候,如果命令輸錯(cuò)了,那么會(huì)告訴你此命令不是一個(gè) git 命令,這是理所應(yīng)當(dāng)?shù)?。然后重點(diǎn)來了,git 還會(huì)提示一些與你輸錯(cuò)的命令長得非常相似的一些命令。
所以這里面也用到了字符串的相似度原理,找出 git 命令中和你輸錯(cuò)的命令最相似的幾個(gè),然后進(jìn)行提示。
如果我們也寫了一個(gè)類似的程序,需要用戶通過命令行參數(shù)的方式,那么當(dāng)用戶輸入了一個(gè)不存在的命令時(shí),我們也可以這么做。而實(shí)現(xiàn)方法也很簡單,就是將所有的命令和用戶輸錯(cuò)的命令都計(jì)算一個(gè)相似度,然后返回相似度最高的 n 個(gè)即可。
使用上面的 fuzz 完全可以實(shí)現(xiàn),當(dāng)然 fuzzywuzzy 模塊還提供了一個(gè) extract 函數(shù),可以讓我們更加輕松地做到這一點(diǎn)。
from?fuzzywuzzy?import?process words?=?["hello?python",?"hello?java",? ?????????"hello?golang",?"hello?php"] #?會(huì)自動(dòng)和?words?里面的每一個(gè)元素進(jìn)行比較 #?然后按照相似度從高到低排列 print(process.extract("hello?thon",?words)) """ [('hello?python',?91),?('hello?php',?74),? ?('hello?golang',?73),?('hello?java',?64)] """ #?還可以傳入一個(gè)?limit?參數(shù) #?表示只返回前?limit?個(gè),默認(rèn)為5 print( ????process.extract("hello?thon",?words,?limit=2) )? """ [('hello?python',?91),? ?('hello?php',?74)] """ #?返回分?jǐn)?shù)最高的,此時(shí)返回一個(gè)元組 print( ????process.extractOne("hello?thon",?words) )?? """ ('hello?python',?91) """
這個(gè)模塊使用起來還是比較簡單的,當(dāng)然核心是字符串相似度的計(jì)算原理,這才是重點(diǎn),有興趣可以去了解一下。
另外使用 fuzzywuzzy 這個(gè)模塊的時(shí)候,會(huì)彈出一個(gè)警告:
UserWarning: Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning
提示我們可以通過安裝 python-Levenshtein 得到解決,這是一個(gè)用于加速字符串匹配的庫,可提供 4 到 10 倍的加速。當(dāng)然即使沒有這個(gè)庫也是可以的,沒有的話 fuzzywuzzy 底層會(huì)使用標(biāo)準(zhǔn)庫 difflib 進(jìn)行匹配,只是會(huì)彈出警告罷了。
到此這篇關(guān)于Python+fuzzywuzzy計(jì)算兩個(gè)字符串之間的相似度的文章就介紹到這了,更多相關(guān)Python fuzzywuzzy內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyCharm添加Anaconda中的虛擬環(huán)境Python解釋器出現(xiàn)Conda?executable?is?not
這篇文章主要給大家介紹了關(guān)于PyCharm添加Anaconda中的虛擬環(huán)境Python解釋器出現(xiàn)Conda?executable?is?not?found錯(cuò)誤的解決辦法,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02pytorch如何利用ResNet18進(jìn)行手寫數(shù)字識(shí)別
這篇文章主要介紹了pytorch如何利用ResNet18進(jìn)行手寫數(shù)字識(shí)別問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python腳本實(shí)現(xiàn)蝦米網(wǎng)簽到功能
這篇文章主要介紹了Python腳本實(shí)現(xiàn)蝦米網(wǎng)簽到功能的方法,涉及Python調(diào)用URL模塊實(shí)現(xiàn)數(shù)據(jù)傳輸與處理的相關(guān)技巧,需要的朋友可以參考下2016-04-04python用pd.read_csv()方法來讀取csv文件的實(shí)現(xiàn)
本文主要介紹了python用pd.read_csv()方法來讀取csv文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Python實(shí)現(xiàn)中一次讀取多個(gè)值的方法
下面小編就為大家分享一篇Python實(shí)現(xiàn)中一次讀取多個(gè)值的方法,具有很好的參考價(jià)值,我對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04python使用range函數(shù)計(jì)算一組數(shù)和的方法
這篇文章主要介紹了python使用range函數(shù)計(jì)算一組數(shù)和的方法,涉及Python中range函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05python如何利用traceback獲取詳細(xì)的異常信息
異常信息的獲取對(duì)于程序的調(diào)試非常重要,可以有助于快速定位有錯(cuò)誤程序語句的位置。這篇文章主要給大家介紹了關(guān)于python如何利用traceback獲取詳細(xì)的異常信息的相關(guān)資料,需要的朋友可以參考下2021-06-06