Python中匹配模糊的字符串問(wèn)題分析
如何使用thefuzz 庫(kù),它允許我們?cè)趐ython中進(jìn)行模糊字符串匹配。此外,我們將學(xué)習(xí)如何使用process 模塊,該模塊允許我們?cè)谀:址壿嫷膸椭掠行У仄ヅ浠蛱崛∽址?/p>
使用thefuzz 模塊來(lái)匹配模糊字符串
這個(gè)庫(kù)在舊版本中有一個(gè)有趣的名字,因?yàn)樗幸粋€(gè)特定的名字,這個(gè)名字被重新命名。所以現(xiàn)在是由不同的庫(kù)來(lái)維護(hù);但是,它目前的版本叫做thefuzz ,所以這就是你可以通過(guò)下面的命令來(lái)安裝的。
pip install thefuzz
但是,如果你在網(wǎng)上看例子,你會(huì)發(fā)現(xiàn)一些例子的舊名稱是fuzzywuzzy 。所以,它已經(jīng)不再被維護(hù)并且過(guò)時(shí)了,但是你可能會(huì)發(fā)現(xiàn)一些用這個(gè)名字的例子。
thefuzz 庫(kù)是基于 ,所以你必須用這個(gè)命令來(lái)安裝它。python-Levenshtei
pip install python-Levenshtein
而如果你在安裝過(guò)程中遇到一些問(wèn)題,你可以使用下面的命令,如果再次遇到錯(cuò)誤,那么你可以在google上搜索,找到相關(guān)的解決方案。
pip install python-Levenshtein-wheels
本質(zhì)上,模糊匹配字符串就像使用regex或沿著兩個(gè)字符串的比較。在模糊邏輯的情況下,你的條件的真值可以是0 和1 之間的任何實(shí)數(shù)。
因此,基本上,不是說(shuō)任何東西是True 或False ,你只是給它在0 到1 之間的任何值。它是通過(guò)使用距離度量計(jì)算兩個(gè)字符串之間的不相似性,其形式是一個(gè)稱為距離的值。
使用給定的字符串,你使用一些算法找到兩個(gè)字符串之間的距離。一旦你完成了安裝過(guò)程,你必須從thefuzz 模塊中導(dǎo)入fuzz 和process 。
from thefuzz import fuzz, process
在使用fuzz ,我們將手動(dòng)檢查兩個(gè)字符串之間的不相似性。
ST1='Just a test' ST2='just a test' print(ST1==ST2) print(ST1!=ST2)
它將返回一個(gè)布爾值,但以一種模糊的方式,你會(huì)得到這些字符串的相似程度的百分?jǐn)?shù)。
False True
模糊字符串匹配允許我們以模糊的方式更有效、更快速地完成這項(xiàng)工作。假設(shè)我們有一個(gè)例子,有兩個(gè)字符串,其中一個(gè)字符串與大寫的J (如上所述)不相同。
如果我們現(xiàn)在去調(diào)用ratio() 函數(shù),它給我們一個(gè)相似性的度量,那么這將為我們提供一個(gè)相當(dāng)高的比率,即91 ,而不是100 。
from thefuzz import fuzz, process print(fuzz.ratio(ST1, ST2))
輸出:
91
如果字符串更加延長(zhǎng),例如,如果我們不只是改變一個(gè)字符,而是改變一個(gè)完全不同的字符串,那么看看它的回報(bào),看一看。
ST1='This is a test string for test' ST2='There aresome test string for testing' print(fuzz.ratio(ST1,ST2))
現(xiàn)在可能會(huì)有一些相似之處,但會(huì)很75 ;這只是一個(gè)簡(jiǎn)單的比率,并不復(fù)雜。
75
我們還可以繼續(xù)嘗試像部分比例這樣的東西。例如,我們有兩個(gè)字符串,我們想確定它們的分?jǐn)?shù)。
ST1='There are test' ST2='There are test string for testing' print(fuzz.partial_ratio(ST1,ST2))
使用partial_ratio() ,我們會(huì)得到100%,因?yàn)檫@兩個(gè)字符串有相同的子字符串(There are test)。
在ST2 ,我們有一些不同的詞(字符串),但這并不重要,因?yàn)槲覀兛吹氖遣糠直嚷驶騻€(gè)別部分,但簡(jiǎn)單的比率并不類似。
100
假設(shè)我們有相似的字符串,但有不同的順序;然后,我們使用另一個(gè)度量。
CASE_1='This generation rules the nation' CASE_2='Rules the nation This generation'
兩種情況下,在該短語(yǔ)的相同含義上有完全相同的文字,但使用ratio() ,就會(huì)有相當(dāng)大的不同,而使用partial_ratio() ,就會(huì)有不同。
如果我們通過(guò)token_sort_ratio() ,這將是100%,因?yàn)樗旧鲜峭耆嗤奈淖?,但順序不同。因此,這就是token_sort_ratio() ,該函數(shù)將單個(gè)標(biāo)記進(jìn)行排序,它們的順序并不重要。
print(fuzz.ratio(CASE_1,CASE_2)) print(fuzz.partial_ratio(CASE_1,CASE_2)) print(fuzz.token_sort_ratio(CASE_1,CASE_2))
輸出:
47
64
100
現(xiàn)在,如果我們用另一個(gè)詞來(lái)改變一些詞,我們會(huì)有一個(gè)不同的數(shù)字,但基本上,這是一個(gè)比率;它不關(guān)心個(gè)別標(biāo)記的順序。
CASE_1='This generation rules the nation' CASE_2='Rules the nation has This generation' print(fuzz.ratio(CASE_1,CASE_2)) print(fuzz.partial_ratio(CASE_1,CASE_2)) print(fuzz.token_sort_ratio(CASE_1,CASE_2))
輸出:
44
64
94
token_sort_ratio() 也是不同的,因?yàn)樗懈嗟脑~在里面,但我們也有一個(gè)叫做token_set_ratio() 的東西,一個(gè)集合包含每個(gè)標(biāo)記只有一次。
所以,它出現(xiàn)的頻率并不重要;讓我們看看一個(gè)例子字符串。
CASE_1='This generation' CASE_2='This This generation generation generation generation' print(fuzz.ratio(CASE_1,CASE_2)) print(fuzz.partial_ratio(CASE_1,CASE_2)) print(fuzz.token_sort_ratio(CASE_1,CASE_2)) print(fuzz.token_set_ratio(CASE_1,CASE_2))
我們可以看到一些相當(dāng)?shù)偷姆謹(jǐn)?shù),但是我們使用token_set_ratio() 函數(shù)得到了100%的分?jǐn)?shù),因?yàn)槲覀冇袃蓚€(gè)令牌,This 和generation 存在于兩個(gè)字符串中。
使用process 模塊,以高效的方式使用模糊字符串匹配
不僅有fuzz ,還有process ,因?yàn)閜rocess 是有幫助的,可以使用這種模糊匹配從一個(gè)集合中提取出來(lái)。
例如,我們準(zhǔn)備了幾個(gè)列表項(xiàng)來(lái)演示。
Diff_items=['programing language','Native language','React language', 'People stuff', 'This generation', 'Coding and stuff']
其中一些是非常相似的,你可以看到(母語(yǔ)或編程語(yǔ)言),現(xiàn)在我們可以去挑選最好的個(gè)別匹配。
我們可以手動(dòng)操作,只需評(píng)估分?jǐn)?shù),然后挑選出最優(yōu)秀的人選,但我們也可以用process 。要做到這一點(diǎn),我們必須調(diào)用process 模塊中的extract() 函數(shù)。
它需要幾個(gè)參數(shù),第一個(gè)是目標(biāo)字符串,第二個(gè)是你要提取的集合,第三個(gè)是限制,將匹配或提取的內(nèi)容限制為兩個(gè)。
例如,如果我們想提取像language ,在這種情況下,選擇母語(yǔ)和編程語(yǔ)言。
print(process.extract('language',Diff_items,limit=2))
輸出:
[('programing language', 90), ('Native language', 90)]
問(wèn)題是,這不是NLP(自然語(yǔ)言處理);這背后沒(méi)有智能;它只是看單個(gè)標(biāo)記。因此,舉例來(lái)說(shuō),如果我們使用programming 作為目標(biāo)字符串并運(yùn)行這個(gè)。
第一個(gè)匹配將是programming language ,但第二個(gè)匹配將是Native language ,這將不是編碼。
即使我們有編碼,因?yàn)閺恼Z(yǔ)義上講,編碼更接近于編程,但這并不重要,因?yàn)槲覀冊(cè)谶@里沒(méi)有使用AI。
Diff_items=['programing language','Native language','React language', 'People stuff', 'Hello World', 'Coding and stuff'] print(process.extract('programing',Diff_items,limit=2))
PYTHON 復(fù)制 全屏
輸出:
[('programing language', 90), ('Native language', 36)]
另一個(gè)最后的例子是這是如何有用的;我們有一個(gè)龐大的書庫(kù),想找到一本書,但我們不知道確切的名字或如何調(diào)用它。
在這種情況下,我們可以使用extract() ,在這個(gè)函數(shù)里面,我們將把fuzz.token_sort_ratio 傳給scorer 參數(shù)。
LISt_OF_Books=['The python everyone volume 1 - Beginner', 'The python everyone volume 2 - Machine Learning', 'The python everyone volume 3 - Data Science', 'The python everyone volume 4 - Finance', 'The python everyone volume 5 - Neural Network', 'The python everyone volume 6 - Computer Vision', 'Different Data Science book', 'Java everyone beginner book', 'python everyone Algorithms and Data Structure'] print(process.extract('python Data Science',LISt_OF_Books,limit=3,scorer=fuzz.token_sort_ratio))
我們只是傳遞它,我們并沒(méi)有調(diào)用它,現(xiàn)在,我們?cè)谶@里得到了最高的結(jié)果,我們得到了另一本數(shù)據(jù)科學(xué)書作為第二個(gè)結(jié)果。
輸出:
[('The python everyone volume 3 - Data Science', 63), ('Different Data Science book', 61), ('python everyone Algorithms and Data Structure', 47)]
這就是如何是相當(dāng)準(zhǔn)確的,如果你有一個(gè)項(xiàng)目,你必須以模糊的方式找到它,它可以相當(dāng)有幫助。我們也可以用它來(lái)實(shí)現(xiàn)你的程序自動(dòng)化。
還有一些額外的資源,你可以使用github和stackoverflow找到更多幫助。
到此這篇關(guān)于Python中匹配模糊的字符串的文章就介紹到這了,更多相關(guān)Python匹配模糊的字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 圖片轉(zhuǎn)數(shù)組,二進(jìn)制互轉(zhuǎn)操作
這篇文章主要介紹了Python 圖片轉(zhuǎn)數(shù)組,二進(jìn)制互轉(zhuǎn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03關(guān)于Python 中的時(shí)間處理包datetime和arrow的方法詳解
這篇文章主要介紹了關(guān)于Python 中的時(shí)間處理包datetime和arrow的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03python獲取網(wǎng)頁(yè)中所有圖片并篩選指定分辨率的方法
下面小編就為大家分享一篇python獲取網(wǎng)頁(yè)中所有圖片并篩選指定分辨率的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03django-rest-swagger的優(yōu)化使用方法
今天小編就為大家分享一篇django-rest-swagger的優(yōu)化使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Python實(shí)現(xiàn)識(shí)別圖像中人物的示例代碼
這篇文章主要介紹了通過(guò)face_recognition提供的demo代碼,簡(jiǎn)單調(diào)整了一下,從而實(shí)現(xiàn)識(shí)別圖像中人物的功能,感興趣的可以跟隨小編一起試試2022-01-01