欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python+FuzzyWuzzy實(shí)現(xiàn)模糊匹配的示例詳解

 更新時(shí)間:2022年04月27日 16:33:51   作者:Python大數(shù)據(jù)分析  
在日常開發(fā)工作中,經(jīng)常會(huì)遇到這樣的一個(gè)問題:要對(duì)數(shù)據(jù)中的某個(gè)字段進(jìn)行匹配,但這個(gè)字段有可能會(huì)有微小的差異。本文將分享一個(gè)簡(jiǎn)單易用的模糊字符串匹配工具包:FuzzyWuzzy,讓你輕松解決煩惱的匹配問題

在日常開發(fā)工作中,經(jīng)常會(huì)遇到這樣的一個(gè)問題:要對(duì)數(shù)據(jù)中的某個(gè)字段進(jìn)行匹配,但這個(gè)字段有可能會(huì)有微小的差異。比如同樣是招聘崗位的數(shù)據(jù),里面省份一欄有的寫“廣西”,有的寫“廣西壯族自治區(qū)”,甚至還有寫“廣西省”……為此不得不增加許多代碼來處理這些情況。

今天跟大家分享FuzzyWuzzy一個(gè)簡(jiǎn)單易用的模糊字符串匹配工具包。讓你輕松解決煩惱的匹配問題!

1. 前言

在處理數(shù)據(jù)的過程中,難免會(huì)遇到下面類似的場(chǎng)景,自己手里頭獲得的是簡(jiǎn)化版的數(shù)據(jù)字段,但是要比對(duì)的或者要合并的卻是完整版的數(shù)據(jù)(有時(shí)候也會(huì)反過來)

最常見的一個(gè)例子就是:在進(jìn)行地理可視化中,自己收集的數(shù)據(jù)只保留的縮寫,比如北京,廣西,新疆,西藏等,但是待匹配的字段數(shù)據(jù)卻是北京市,廣西壯族自治區(qū),新疆維吾爾自治區(qū),西藏自治區(qū)等,如下。因此就需要有沒有一種方式可以很快速便捷的直接進(jìn)行對(duì)應(yīng)字段的匹配并將結(jié)果單獨(dú)生成一列,就可以用到FuzzyWuzzy庫。

2. FuzzyWuzzy庫介紹

FuzzyWuzzy 是一個(gè)簡(jiǎn)單易用的模糊字符串匹配工具包。它依據(jù) Levenshtein Distance 算法,計(jì)算兩個(gè)序列之間的差異。

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

這里使用的是Anaconda下的jupyter notebook編程環(huán)境,因此在Anaconda的命令行中輸入一下指令進(jìn)行第三方庫安裝。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple FuzzyWuzzy

2.1 fuzz模塊

該模塊下主要介紹四個(gè)函數(shù)(方法),分別為:簡(jiǎn)單匹配(Ratio)、非完全匹配(Partial Ratio)、忽略順序匹配(Token Sort Ratio)和去重子集匹配(Token Set Ratio)

注意: 如果直接導(dǎo)入這個(gè)模塊的話,系統(tǒng)會(huì)提示warning,當(dāng)然這不代表報(bào)錯(cuò),程序依舊可以運(yùn)行(使用的默認(rèn)算法,執(zhí)行速度較慢),可以按照系統(tǒng)的提示安裝python-Levenshtein庫進(jìn)行輔助,這有利于提高計(jì)算的速度。

2.1.1 簡(jiǎn)單匹配(Ratio)

簡(jiǎn)單的了解一下就行,這個(gè)不怎么精確,也不常用

fuzz.ratio("河南省", "河南省")
>>> 100
>
fuzz.ratio("河南", "河南省")
>>> 80

2.1.2 非完全匹配(Partial Ratio)

盡量使用非完全匹配,精度較高

fuzz.partial_ratio("河南省", "河南省")
>>> 100

fuzz.partial_ratio("河南", "河南省")
>>> 100

2.1.3 忽略順序匹配(Token Sort Ratio)

原理在于:以 空格 為分隔符,小寫 化所有字母,無視空格外的其它標(biāo)點(diǎn)符號(hào)

fuzz.ratio("西藏 自治區(qū)", "自治區(qū) 西藏")
>>> 50
fuzz.ratio('I love YOU','YOU LOVE I')
>>> 30

fuzz.token_sort_ratio("西藏 自治區(qū)", "自治區(qū) 西藏") 
>>> 100
fuzz.token_sort_ratio('I love YOU','YOU LOVE I') 
>>> 100

2.1.4 去重子集匹配(Token Set Ratio)

相當(dāng)于比對(duì)之前有一個(gè)集合去重的過程,注意最后兩個(gè),可理解為該方法是在token_sort_ratio方法的基礎(chǔ)上添加了集合去重的功能,下面三個(gè)匹配的都是倒序

fuzz.ratio("西藏 西藏 自治區(qū)", "自治區(qū) 西藏")
>>> 40

fuzz.token_sort_ratio("西藏 西藏 自治區(qū)", "自治區(qū) 西藏")
>>> 80

fuzz.token_set_ratio("西藏 西藏 自治區(qū)", "自治區(qū) 西藏")
>>> 100

fuzz這幾個(gè)ratio()函數(shù)(方法)最后得到的結(jié)果都是數(shù)字,如果需要獲得匹配度最高的字符串結(jié)果,還需要依舊自己的數(shù)據(jù)類型選擇不同的函數(shù),然后再進(jìn)行結(jié)果提取,如果但看文本數(shù)據(jù)的匹配程度使用這種方式是可以量化的,但是對(duì)于我們要提取匹配的結(jié)果來說就不是很方便了,因此就有了process模塊。

2.2 process模塊

用于處理備選答案有限的情況,返回模糊匹配的字符串和相似度。

2.2.1 extract提取多條數(shù)據(jù)

類似于爬蟲中select,返回的是列表,其中會(huì)包含很多匹配的數(shù)據(jù)

choices = ["河南省", "鄭州市", "湖北省", "武漢市"]
process.extract("鄭州", choices, limit=2)
>>> [('鄭州市', 90), ('河南省', 0)]
# extract之后的數(shù)據(jù)類型是列表,即使limit=1,最后還是列表,注意和下面extractOne的區(qū)別

2.2.2 extractOne提取一條數(shù)據(jù)

如果要提取匹配度最大的結(jié)果,可以使用extractOne,注意這里返回的是 元組 類型, 還有就是匹配度最大的結(jié)果不一定是我們想要的數(shù)據(jù),可以通過下面的示例和兩個(gè)實(shí)戰(zhàn)應(yīng)用體會(huì)一下

process.extractOne("鄭州", choices)
>>> ('鄭州市', 90)

process.extractOne("北京", choices)
>>> ('湖北省', 45)

3. 實(shí)戰(zhàn)應(yīng)用

這里舉兩個(gè)實(shí)戰(zhàn)應(yīng)用的小例子,第一個(gè)是公司名稱字段的模糊匹配,第二個(gè)是省市字段的模糊匹配

3.1 公司名稱字段模糊匹配

數(shù)據(jù)及待匹配的數(shù)據(jù)樣式如下:自己獲取到的數(shù)據(jù)字段的名稱很簡(jiǎn)潔,并不是公司的全稱,因此需要進(jìn)行兩個(gè)字段的合并

直接將代碼封裝為函數(shù),主要是為了方便日后的調(diào)用,這里參數(shù)設(shè)置的比較詳細(xì),執(zhí)行結(jié)果如下:

3.1.1 參數(shù)講解:

① 第一個(gè)參數(shù)df_1是自己獲取的欲合并的左側(cè)數(shù)據(jù)(這里是data變量);

② 第二個(gè)參數(shù)df_2是待匹配的欲合并的右側(cè)數(shù)據(jù)(這里是company變量);

③ 第三個(gè)參數(shù)key1是df_1中要處理的字段名稱(這里是data變量里的‘公司名稱’字段)

④ 第四個(gè)參數(shù)key2是df_2中要匹配的字段名稱(這里是company變量里的‘公司名稱’字段)

⑤ 第五個(gè)參數(shù)threshold是設(shè)定提取結(jié)果匹配度的標(biāo)準(zhǔn)。注意這里就是對(duì)extractOne方法的完善,提取到的最大匹配度的結(jié)果并不一定是我們需要的,所以需要設(shè)定一個(gè)閾值來評(píng)判,這個(gè)值就為90,只有是大于等于90,這個(gè)匹配結(jié)果我們才可以接受

⑥ 第六個(gè)參數(shù),默認(rèn)參數(shù)就是只返回兩個(gè)匹配成功的結(jié)果

⑦ 返回值:為df_1添加‘matches’字段后的新的DataFrame數(shù)據(jù)

3.1.2 核心代碼講解

第一部分代碼如下,可以參考上面講解process.extract方法,這里就是直接使用,所以返回的結(jié)果m就是列表中嵌套元祖的數(shù)據(jù)格式,樣式為: [(‘鄭州市’, 90), (‘河南省’, 0)],因此第一次寫入到’matches’字段中的數(shù)據(jù)也就是這種格式

注意,注意: 元祖中的第一個(gè)是匹配成功的字符串,第二個(gè)就是設(shè)置的threshold參數(shù)比對(duì)的數(shù)字對(duì)象

s = df_2[key2].tolist()
m = df_1[key1].apply(lambda x: process.extract(x, s, limit=limit))    
df_1['matches'] = m

第二部分的核心代碼如下,有了上面的梳理,明確了‘matches’字段中的數(shù)據(jù)類型,然后就是進(jìn)行數(shù)據(jù)的提取了,需要處理的部分有兩點(diǎn)需要注意的:

① 提取匹配成功的字符串,并對(duì)閾值小于90的數(shù)據(jù)填充空值

② 最后把數(shù)據(jù)添加到‘matches’字段

m2 = df_1['matches'].apply(lambda x: [i[0] for i in x if i[1] >= threshold][0] if len([i[0] for i in x if i[1] >= threshold]) > 0 else '')
#要理解第一個(gè)‘matches'字段返回的數(shù)據(jù)類型是什么樣子的,就不難理解這行代碼了
#參考一下這個(gè)格式:[('鄭州市', 90), ('河南省', 0)]
df_1['matches'] = m2

return df_1

3.2 省份字段模糊匹配

自己的數(shù)據(jù)和待匹配的數(shù)據(jù)背景介紹中已經(jīng)有圖片顯示了,上面也已經(jīng)封裝了模糊匹配的函數(shù),這里直接調(diào)用上面的函數(shù),輸入相應(yīng)的參數(shù)即可,代碼以及執(zhí)行結(jié)果如下:

數(shù)據(jù)處理完成,經(jīng)過封裝后的函數(shù)可以直接放在自己自定義的模塊名文件下面,以后可以方便直接導(dǎo)入函數(shù)名即可,可以參考將自定義常用的一些函數(shù)封裝成可以直接調(diào)用的模塊方法。

4. 全部函數(shù)代碼

#模糊匹配

def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):
    """
    :param df_1: the left table to join
    :param df_2: the right table to join
    :param key1: key column of the left table
    :param key2: key column of the right table
    :param threshold: how close the matches should be to return a match, based on Levenshtein distance
    :param limit: the amount of matches that will get returned, these are sorted high to low
    :return: dataframe with boths keys and matches
    """
    s = df_2[key2].tolist()

    m = df_1[key1].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][0] if len([i[0] for i in x if i[1] >= threshold]) > 0 else '')
    df_1['matches'] = m2

    return df_1

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

df = fuzzy_merge(data, company, '公司名稱', '公司名稱', threshold=90)
df

以上就是Python+FuzzyWuzzy實(shí)現(xiàn)模糊匹配的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Python FuzzyWuzzy模糊匹配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 用Python?Tkinter庫GUI編程創(chuàng)建圖形用戶界面

    用Python?Tkinter庫GUI編程創(chuàng)建圖形用戶界面

    這篇文章主要為大家介紹了用Python?Tkinter庫GUI編程創(chuàng)建圖形用戶界面,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Python OpenCV學(xué)習(xí)之圖形繪制總結(jié)

    Python OpenCV學(xué)習(xí)之圖形繪制總結(jié)

    在圖像的任務(wù)中,不管是圖像檢測(cè)還是圖像識(shí)別,我們都需要通過繪制圖形和繪制文字對(duì)處理的結(jié)果進(jìn)行說明,本篇就詳細(xì)介紹下OpenCV中的圖形的繪制,感興趣的可以了解一下
    2022-01-01
  • 淺談Python中的數(shù)據(jù)類型

    淺談Python中的數(shù)據(jù)類型

    Python很重要的的那幾個(gè)數(shù)據(jù)類型:字符串,列表,字典,元組,經(jīng)常有網(wǎng)友問他們之間重要的區(qū)別的是什么?能否舉幾個(gè)例子來說明下!下嘛我們就來探討下。
    2015-05-05
  • 用Python將動(dòng)態(tài)GIF圖片倒放播放的方法

    用Python將動(dòng)態(tài)GIF圖片倒放播放的方法

    GIF(Graphics Interchange Format) 是一種可以用來呈現(xiàn)動(dòng)畫效果的圖片格式,原理就是保存很多幀(Frame)靜態(tài)圖像,然后連續(xù)呈現(xiàn)。這篇文章主要介紹了用Python將動(dòng)態(tài)GIF圖片倒放播放的方法,需要的朋友可以參考下
    2016-11-11
  • Python遍歷字典方式就實(shí)例詳解

    Python遍歷字典方式就實(shí)例詳解

    這篇文章主要介紹了Python遍歷字典方式就實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 實(shí)例講解python中的協(xié)程

    實(shí)例講解python中的協(xié)程

    在本篇文章里我們給大家通過實(shí)例講述一下關(guān)于python中的協(xié)程相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以參考下。
    2018-10-10
  • python獲取redis memory使用情況場(chǎng)景分析

    python獲取redis memory使用情況場(chǎng)景分析

    這篇文章主要介紹了python獲取redis memory使用情況,項(xiàng)目研發(fā)過程中,用到Python操作Redis場(chǎng)景,記錄學(xué)習(xí)過程中的心得體會(huì),需要的朋友可以參考下
    2022-12-12
  • Python中Pickling和Unpickling的區(qū)別詳解

    Python中Pickling和Unpickling的區(qū)別詳解

    在本文中,我們將探討 Python 中 pickling 和 unpickling 之間的主要區(qū)別,我們將詳細(xì)討論 Python pickling 和 unpickling 的概念,包括它們的目的、語法、用法以及安全可靠的 pickling 和 unpickling 操作的注意事項(xiàng),需要的朋友可以參考下
    2023-09-09
  • Flask?使用類組織配置詳情

    Flask?使用類組織配置詳情

    這篇文章主要介紹了Flask使用類組織配置,在實(shí)際的項(xiàng)目中,我們一般都會(huì)建立三個(gè)環(huán)境:開發(fā)、測(cè)試和生產(chǎn)環(huán)境,這三種環(huán)境會(huì)使用不同的配置組合,為了能方便地切換配置,我們可以為不同的環(huán)境創(chuàng)建不同的配置文件,下面來看詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • Python發(fā)送郵件封裝實(shí)現(xiàn)過程詳解

    Python發(fā)送郵件封裝實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Python發(fā)送郵件封裝實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評(píng)論