Python中匹配模糊的字符串

如何使用thefuzz 庫,它允許我們在python中進行模糊字符串匹配。此外,我們將學習如何使用process 模塊,該模塊允許我們在模糊字符串邏輯的幫助下有效地匹配或提取字符串。

使用thefuzz 模塊來匹配模糊字符串

這個庫在舊版本中有一個有趣的名字,因爲它有一個特定的名字,這個名字被重新命名。所以現在是由不同的庫來維護;但是,它目前的版本叫做thefuzz ,所以這就是你可以通過下面的命令來安裝的。

pip install thefuzz

但是,如果你在網上看例子,你會發現一些例子的舊名稱是fuzzywuzzy 。所以,它已經不再被維護並且過時了,但是你可能會發現一些用這個名字的例子。

thefuzz 庫是基於 ,所以你必須用這個命令來安裝它。python-Levenshtei

pip install python-Levenshtein

而如果你在安裝過程中遇到一些問題,你可以使用下面的命令,如果再次遇到錯誤,那麼你可以在google上搜索,找到相關的解決方案。

pip install python-Levenshtein-wheels

本質上,模糊匹配字符串就像使用regex或沿着兩個字符串的比較。在模糊邏輯的情況下,你的條件的真值可以是0 和1 之間的任何實數。

因此,基本上,不是說任何東西是True 或False ,你只是給它在0 到1 之間的任何值。它是通過使用距離度量計算兩個字符串之間的不相似性,其形式是一個稱爲距離的值。

使用給定的字符串,你使用一些算法找到兩個字符串之間的距離。一旦你完成了安裝過程,你必須從thefuzz 模塊中導入fuzz 和process 。

from thefuzz import fuzz, process

在使用fuzz ,我們將手動檢查兩個字符串之間的不相似性。

ST1='Just a test'
ST2='just a test'
print(ST1==ST2)
print(ST1!=ST2)

它將返回一個布爾值,但以一種模糊的方式,你會得到這些字符串的相似程度的百分數。

False
True

模糊字符串匹配允許我們以模糊的方式更有效、更快速地完成這項工作。假設我們有一個例子,有兩個字符串,其中一個字符串與大寫的J (如上所述)不相同。

如果我們現在去調用ratio() 函數,它給我們一個相似性的度量,那麼這將爲我們提供一個相當高的比率,即91 ,而不是100 。

from thefuzz import fuzz, process
print(fuzz.ratio(ST1, ST2))

輸出:

91

如果字符串更加延長,例如,如果我們不只是改變一個字符,而是改變一個完全不同的字符串,那麼看看它的回報,看一看。

ST1='This is a test string for test'
ST2='There aresome test string for testing'
print(fuzz.ratio(ST1,ST2))

現在可能會有一些相似之處,但會很75 ;這只是一個簡單的比率,並不複雜。

75

我們還可以繼續嘗試像部分比例這樣的東西。例如,我們有兩個字符串,我們想確定它們的分數。

ST1='There are test'
ST2='There are test string for testing'
print(fuzz.partial_ratio(ST1,ST2))

使用partial_ratio() ,我們會得到100%,因爲這兩個字符串有相同的子字符串(There are test)。

在ST2 ,我們有一些不同的詞(字符串),但這並不重要,因爲我們看的是部分比率或個別部分,但簡單的比率並不類似。

100

假設我們有相似的字符串,但有不同的順序;然後,我們使用另一個度量。

CASE_1='This generation rules the nation'
CASE_2='Rules the nation This generation'

兩種情況下,在該短語的相同含義上有完全相同的文字,但使用ratio() ,就會有相當大的不同,而使用partial_ratio() ,就會有不同。

如果我們通過token_sort_ratio() ,這將是100%,因爲它基本上是完全相同的文字,但順序不同。因此,這就是token_sort_ratio() ,該函數將單個標記進行排序,它們的順序並不重要。

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

現在,如果我們用另一個詞來改變一些詞,我們會有一個不同的數字,但基本上,這是一個比率;它不關心個別標記的順序。

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() 也是不同的,因爲它有更多的詞在裏面,但我們也有一個叫做token_set_ratio() 的東西,一個集合包含每個標記只有一次。

所以,它出現的頻率並不重要;讓我們看看一個例子字符串。

#Python小白學習交流羣:711312441
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))

我們可以看到一些相當低的分數,但是我們使用token_set_ratio() 函數得到了100%的分數,因爲我們有兩個令牌,This 和generation 存在於兩個字符串中。

使用process 模塊,以高效的方式使用模糊字符串匹配

不僅有fuzz ,還有process ,因爲process 是有幫助的,可以使用這種模糊匹配從一個集合中提取出來。

例如,我們準備了幾個列表項來演示。

Diff_items=['programing language','Native language','React language',
        'People stuff', 'This generation', 'Coding and stuff']

其中一些是非常相似的,你可以看到(母語或編程語言),現在我們可以去挑選最好的個別匹配。

我們可以手動操作,只需評估分數,然後挑選出最優秀的人選,但我們也可以用process 。要做到這一點,我們必須調用process 模塊中的extract() 函數。

它需要幾個參數,第一個是目標字符串,第二個是你要提取的集合,第三個是限制,將匹配或提取的內容限制爲兩個。

例如,如果我們想提取像language ,在這種情況下,選擇母語和編程語言。

print(process.extract('language',Diff_items,limit=2))

輸出:

[('programing language', 90), ('Native language', 90)]

問題是,這不是NLP(自然語言處理);這背後沒有智能;它只是看單個標記。因此,舉例來說,如果我們使用programming 作爲目標字符串並運行這個。

第一個匹配將是programming language ,但第二個匹配將是Native language ,這將不是編碼。

即使我們有編碼,因爲從語義上講,編碼更接近於編程,但這並不重要,因爲我們在這裏沒有使用AI。

Diff_items=['programing language','Native language','React language',
        'People stuff', 'Hello World', 'Coding and stuff']
print(process.extract('programing',Diff_items,limit=2))

輸出:

[('programing language', 90), ('Native language', 36)]

另一個最後的例子是這是如何有用的;我們有一個龐大的書庫,想找到一本書,但我們不知道確切的名字或如何調用它。

在這種情況下,我們可以使用extract() ,在這個函數裏面,我們將把fuzz.token_sort_ratio 傳給scorer 參數。

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))

我們只是傳遞它,我們並沒有調用它,現在,我們在這裏得到了最高的結果,我們得到了另一本數據科學書作爲第二個結果。

輸出:

[('The python everyone volume 3 - Data Science', 63), ('Different Data Science book', 61), ('python everyone Algorithms and Data Structure', 47)]

這就是如何是相當準確的,如果你有一個項目,你必須以模糊的方式找到它,它可以相當有幫助。我們也可以用它來實現你的程序自動化。

還有一些額外的資源,你可以使用github和stackoverflow找到更多幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章