Python實現(xiàn)字符串模糊匹配詳解
Python實現(xiàn)字符串模糊匹配及其在實戰(zhàn)中的應(yīng)用
在實際開發(fā)中,經(jīng)常需要根據(jù)一個字段的值來查找另一個表格中對應(yīng)的值,這時候就可以使用表格關(guān)聯(lián)函數(shù)VLOOKUP。但是,在實際數(shù)據(jù)處理中,我們經(jīng)常遇到輸入的字符串有一些變體,這對于精確匹配是很困難的。因此,在本篇文章中,我們將探討如何使用 Python 實現(xiàn)字符串模糊匹配,并介紹其在實際應(yīng)用中的具體案例。
字符串模糊匹配的核心思想
字符串模糊匹配的核心思想是利用字符串的相似度計算函數(shù),根據(jù)輸入的字符串和已知的字符串進行比較,并返回一個相似度得分。其中,常用的相似度計算方法包括:
- Levenshtein Distance(編輯距離)
- Jaccard Similarity(Jaccard相似系數(shù))
- Cosine Similarity(余弦相似度)
本文將使用編輯距離作為相似度計算的方法,編輯距離定義為把一個字符串轉(zhuǎn)化成另一個字符串所需的最少操作次數(shù)。
針對字符串模糊匹配的Python庫:fuzzywuzzy
由于字符串模糊匹配在實際應(yīng)用中較為普遍,因此在 Python 中也有相應(yīng)的庫來支持字符串模糊匹配。其中,fuzzywuzzy 是比較常用的一個庫。
安裝方法:
pip install fuzzywuzzy pip install python-Levenshtein
代碼實現(xiàn)
使用Python實現(xiàn)vlookup 字符串模糊匹配
下面我們將通過示例來演示如何使用 Python 實現(xiàn) vlookup 字符串模糊匹配。
首先,我們需要導入必要的庫:
from fuzzywuzzy import fuzz import pandas as pd
然后,我們定義一個函數(shù) fuzzy_merge,該函數(shù)使用編輯距離來計算兩個字符串之間的相似度。具體代碼如下所示:
def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):
"""
使用編輯距離比較兩列字符串,并返回相似度高于閾值的結(jié)果
:param df_1: 需要合并的 DataFrame #1
:param df_2: 需要合并的 DataFrame #2
:param key1: 在 DataFrame #1 中進行比較的列名
:param key2: 在 DataFrame #2 中進行比較的列名
:param threshold: 設(shè)定的相似度閾值,默認為 90
:param limit: 指定最多允許匹配的數(shù)量,默認為 2
:return: 合并后的 DataFrame
"""
s = df_2[key2].tolist()
m = pd.Series(df_1[key1].tolist()).apply(lambda x: process.extract(x, s, limit=limit))
df_1['matches'] = m
m2 = df_1['matches'].apply(lambda x: [i[0] for i in x if i[1] >= threshold] if len(x) > 0 else [])
df_1 = df_1.assign(matches=m2)
return df_1
以上代碼中,我們使用了 fuzz.extract 函數(shù)來計算兩個字符串之間的相似度,并返回相似度得分。這里的 process 對象是 fuzzywuzzy 庫中的一個模塊,我們需要將輸入的字符串與目標字符串列表一一比較,以求得最相似的結(jié)果。通過設(shè)置閾值和限制,我們可以控制匹配結(jié)果的質(zhì)量和數(shù)量。
為了檢驗函數(shù)的正確性,我們還可以創(chuàng)建以下示例數(shù)據(jù):
data1 = {'Name': ['Bill Smith', 'Mary Brown', 'John Johnson', 'Lisa Simpson'],
'Age': [30, 25, 40, 20]}
data2 = {'Name': ['John Jonson', 'Lisa Simpson', 'Alison Jameson', 'Steve White'],
'Income': [50000, 40000, 60000, 55000]}
df1 = pd.DataFrame(data1, columns=['Name', 'Age'])
df2 = pd.DataFrame(data2, columns=['Name', 'Income'])
然后我們就可以使用 fuzzy_merge 函數(shù)將兩個 DataFrame 進行合并了。
result = fuzzy_merge(df1, df2, 'Name', 'Name', threshold=80)
最終輸出的結(jié)果如下所示:
| Name | Age | matches | Income |
|---|---|---|---|
| Bill Smith | 30 | [] | NaN |
| Mary Brown | 25 | [] | NaN |
| John Johnson | 40 | [‘John Jonson’] | 50000 |
| Lisa Simpson | 20 | [‘Lisa Simpson’] | 40000 |
可以看到,我們成功地根據(jù)相似度進行了匹配,并將匹配后的結(jié)果和原始數(shù)據(jù)合并在了一起。
應(yīng)用案例:基于字符串模糊匹配的公司合并
除了 VLOOKUP 函數(shù)的應(yīng)用,字符串模糊匹配在實際數(shù)據(jù)處理中還有許多應(yīng)用場景。比如,在公司合并、收購等業(yè)務(wù)中,經(jīng)常需要將兩個公司的數(shù)據(jù)進行合并。在這種情況下,由于兩個公司名稱可能存在輕微的變化(比如大小寫、連字符等),直接使用精確匹配往往會導致一些數(shù)據(jù)漏掉。
為了解決這個問題,我們可以使用 fuzzywuzzy 庫來計算公司名稱之間的相似度,并進行合并。以下是一個簡單的示例,以說明如何利用字符串模糊匹配來實現(xiàn)公司數(shù)據(jù)的合并。
我們可以定義一個函數(shù) fuzzy_company_merge 來完成這個任務(wù):
def fuzzy_company_merge(df, company1, company2):
"""
使用模糊匹配方法合并兩個公司的數(shù)據(jù)
:param df: 包含兩個公司數(shù)據(jù)的 DataFrame
:param company1: 第一個公司的名稱
:param company2: 第二個公司的名稱
:return: 合并后的 DataFrame
"""
mask1 = df['公司名稱'].apply(lambda x: fuzz.partial_ratio(x, company1)) > 80
mask2 = df['公司名稱'].apply(lambda x: fuzz.partial_ratio(x, company2)) > 80
sub_df1 = df[mask1]
sub_df2 = df[mask2]
result = pd.concat([sub_df1, sub_df2], axis=0)
return result
以上代碼中,我們使用了 fuzz.partial_ratio 函數(shù)來計算公司名稱之間的相似度,并將相似度得分大于 80 的結(jié)果篩選出來進行合并。
接下來,我們使用以下示例數(shù)據(jù)來演示函數(shù)的使用方法:
data = {'公司名稱': ['Apple Inc.', 'Google Inc.', 'Amazon.com Inc.', 'Microsoft Corporation', 'Alphabet Inc.'],
'市值(億美元)': [2076, 1364, 1558, 1642, 1543]}
df = pd.DataFrame(data, columns=['公司名稱', '市值(億美元)'])
現(xiàn)在,如果我們想合并 Apple 和 Alphabet 兩家公司的數(shù)據(jù),只需要調(diào)用 fuzzy_company_merge 函數(shù)即可:
result = fuzzy_company_merge(df, 'Apple Inc.', 'Alphabet Inc.')
最終輸出的結(jié)果如下所示:
| 公司名稱 | 市值(億美元) |
|---|---|
| Apple Inc. | 2076 |
| Alphabet Inc. | 1543 |
可以看到,我們成功地將兩個公司的數(shù)據(jù)合并在了一起。
到此這篇關(guān)于Python實現(xiàn)字符串模糊匹配詳解的文章就介紹到這了,更多相關(guān)Python字符串模糊匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實現(xiàn)的守護進程(Daemon)用法實例
這篇文章主要介紹了python實現(xiàn)的守護進程(Daemon)用法,實例分析了Python進程操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06
Pytorch+PyG實現(xiàn)EdgeCNN過程示例詳解
這篇文章主要為大家介紹了Pytorch+PyG實現(xiàn)EdgeCNN過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04
PyCharm創(chuàng)建Django項目的簡單步驟記錄
PyCharm是一種Python?IDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時提高其效率的工具,下面這篇文章主要給大家介紹了關(guān)于利用PyCharm創(chuàng)建Django項目的簡單步驟,需要的朋友可以參考下2022-07-07
分析Python中設(shè)計模式之Decorator裝飾器模式的要點
這篇文章主要介紹了Python中設(shè)計模式之Decorator裝飾器模式模式,文中詳細地講解了裝飾對象的相關(guān)加鎖問題,需要的朋友可以參考下2016-03-03
python 實現(xiàn)存儲數(shù)據(jù)到txt和pdf文檔及亂碼問題的解決
這篇文章主要介紹了python 實現(xiàn)存儲數(shù)據(jù)到txt和pdf文檔及亂碼問題的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
python tkinter圖形界面代碼統(tǒng)計工具(更新)
這篇文章主要為大家詳細介紹了python tkinter圖形界面代碼統(tǒng)計工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09
python 將json數(shù)據(jù)提取轉(zhuǎn)化為txt的方法
今天小編就為大家分享一篇python 將json數(shù)據(jù)提取轉(zhuǎn)化為txt的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
python機器學習之神經(jīng)網(wǎng)絡(luò)(三)
這篇文章主要為大家詳細介紹了python機器學習之神經(jīng)網(wǎng)絡(luò)第三篇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12

