91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

兩個(gè)好用到爆的Python模塊 輕松解決煩惱的匹配問(wèn)題

Android編程精選 ? 來(lái)源:Android編程精選 ? 2023-08-03 11:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

前言

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

最常見的一個(gè)例子就是:在進(jìn)行地理可視化中,自己收集的數(shù)據(jù)只保留的縮寫,比如北京,廣西,新疆,西藏等,但是待匹配的字段數(shù)據(jù)卻是北京市,廣西壯族自治區(qū),新疆維吾爾自治區(qū),西藏自治區(qū)等,如下。

因此就需要有沒有一種方式可以很快速便捷的直接進(jìn)行對(duì)應(yīng)字段的匹配并將結(jié)果單獨(dú)生成一列,就可以用到FuzzyWuzzy庫(kù)。

eb55a010-2d41-11ee-815d-dac502259ad0.png

FuzzyWuzzy庫(kù)介紹

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

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

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

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庫(kù)進(jìn)行輔助,這有利于提高計(jì)算的速度。

eb7224b0-2d41-11ee-815d-dac502259ad0.png

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

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

fuzz.ratio("河南省","河南省")

output

100

fuzz.ratio("河南","河南省")

output

80

1.2 非完全匹配(Partial Ratio)

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

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

output

100

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

output

100

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

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

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

output

50

fuzz.ratio('IloveYOU','YOULOVEI')

output

30

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

output

100

fuzz.token_sort_ratio('IloveYOU','YOULOVEI')

output

100

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

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

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

output

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

output

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

output

100

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

process模塊

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

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

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

choices=["河南省","鄭州市","湖北省","武漢市"]
process.extract("鄭州",choices,limit=2)

output

[('鄭州市',90),('河南省',0)]

extract之后的數(shù)據(jù)類型是列表,即使limit=1,最后還是列表,注意和下面extractOne的區(qū)別

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

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

process.extractOne("鄭州",choices)

output

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

output

('湖北省',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è)字段的合并

eb7d1ece-2d41-11ee-815d-dac502259ad0.png

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

eb92f640-2d41-11ee-815d-dac502259ad0.png

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è)閾值來(lái)評(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(lambdax: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(lambdax:[i[0]foriinxifi[1]>=threshold][0]iflen([i[0]foriinxifi[1]>=threshold])>0else'')
#要理解第一個(gè)‘matches’字段返回的數(shù)據(jù)類型是什么樣子的,就不難理解這行代碼了
#參考一下這個(gè)格式:[('鄭州市', 90), ('河南省', 0)]
df_1['matches']=m2
returndf_1

3.2 省份字段模糊匹配

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

eba7ee4c-2d41-11ee-815d-dac502259ad0.png

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

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

#模糊匹配

deffuzzy_merge(df_1,df_2,key1,key2,threshold=90,limit=2):
"""
:paramdf_1:thelefttabletojoin
:paramdf_2:therighttabletojoin
:paramkey1:keycolumnofthelefttable
:paramkey2:keycolumnoftherighttable
:paramthreshold:howclosethematchesshouldbetoreturnamatch,basedonLevenshteindistance
:paramlimit:theamountofmatchesthatwillgetreturned,thesearesortedhightolow
dataframewithbothskeysandmatches
"""
s=df_2[key2].tolist()

m=df_1[key1].apply(lambdax:process.extract(x,s,limit=limit))
df_1['matches']=m

m2=df_1['matches'].apply(lambdax:[i[0]foriinxifi[1]>=threshold][0]iflen([i[0]foriinxifi[1]>=threshold])>0else'')
df_1['matches']=m2

returndf_1

fromfuzzywuzzyimportfuzz
fromfuzzywuzzyimportprocess

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    20262

    瀏覽量

    252636
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    596

    瀏覽量

    23172
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4877

    瀏覽量

    90108
  • 3D封裝
    +關(guān)注

    關(guān)注

    9

    文章

    149

    瀏覽量

    28314

原文標(biāo)題:兩個(gè)好用到爆的 Python 模塊,建議收藏!

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    兩個(gè)RS485(Modbus RTU)主站與主站之間如何通訊

    本產(chǎn)品能很好解決Master-1主站向模塊寫入數(shù)據(jù),Master-2主站讀取數(shù)據(jù);Master-2主站向模塊寫入數(shù)據(jù),Master-1主站讀取數(shù)據(jù)。由此解決兩個(gè)主站之間的互相讀通信難題。
    的頭像 發(fā)表于 02-08 15:32 ?673次閱讀
    <b class='flag-5'>兩個(gè)</b>RS485(Modbus RTU)主站與主站之間如何通訊

    兩個(gè)RS485-Modbus主站如何通訊

    本產(chǎn)品能很好解決Master-1主站向模塊寫入數(shù)據(jù),Master-2主站讀取數(shù)據(jù);Master-2主站向模塊寫入數(shù)據(jù),Master-1主站讀取數(shù)據(jù)。由此解決兩個(gè)主站之間的互相讀通信難題。
    發(fā)表于 02-08 15:32 ?0次下載

    曙光存儲(chǔ)連續(xù)斬獲兩個(gè)行業(yè)獎(jiǎng)項(xiàng)

    近期,曙光存儲(chǔ)連續(xù)斬獲兩個(gè)行業(yè)獎(jiǎng)項(xiàng),自研技術(shù)產(chǎn)品在國(guó)產(chǎn)突破、AI行業(yè)應(yīng)用等方面的成果獲得廣泛關(guān)注。
    的頭像 發(fā)表于 01-15 16:28 ?2566次閱讀

    沒有專利的opencv-python 版本

    3.4.x 無(wú)專利版) 如果因代碼兼容性需使用 3.4.x 系列,且要無(wú)專利風(fēng)險(xiǎn),需滿足兩個(gè)條件: 降級(jí) Python 到 3.9 及以下(3.4.x 最高支持 Python 3.9); 僅安裝核心
    發(fā)表于 12-13 12:37

    Python調(diào)用API教程

    兩個(gè)不同系統(tǒng)之間的信息交互。在這篇文章中,我們將詳細(xì)介紹Python調(diào)用API的方法和技巧。 一、用Requests庫(kù)發(fā)送HTTP請(qǐng)求 使用Python調(diào)用API的第一步是發(fā)送HTTP請(qǐng)求,通常
    的頭像 發(fā)表于 11-03 09:15 ?927次閱讀

    鋰電池生產(chǎn)“發(fā)熱”難題?這兩個(gè)模塊輕松搞定!

    在鋰電池生產(chǎn)與測(cè)試過(guò)程中,溫度管理是確保品質(zhì)與安全的關(guān)鍵環(huán)節(jié)。本文將探討鋰電池生產(chǎn)測(cè)試中的溫度挑戰(zhàn),并推薦款適合的測(cè)溫模塊,幫助工程師更好地進(jìn)行溫度監(jiān)測(cè)與管理,提升鋰電池生產(chǎn)的品質(zhì)與安全性。前言在
    的頭像 發(fā)表于 10-10 11:38 ?441次閱讀
    鋰電池生產(chǎn)“發(fā)熱”難題?這<b class='flag-5'>兩個(gè)</b><b class='flag-5'>模塊</b><b class='flag-5'>輕松</b>搞定!

    使用studio,最高版本的系統(tǒng)是4.0.3,用到LVGL,但是可選的版本是9.1的,不匹配怎么解決?

    使用studio搭建的系統(tǒng),選的是4.0.3版本,需要用到LVGL,但是版本沒的選,只有9.1最高的版本,系統(tǒng)不匹配怎么辦?
    發(fā)表于 09-29 09:56

    個(gè)硬件SPI兩個(gè)CS操作兩個(gè)norflash,怎么互斥操作兩個(gè)norflash?

    個(gè)硬件SPI兩個(gè)CS操作兩個(gè)norflash,怎么互斥操作兩個(gè)norflash,有一個(gè)norflash被模擬成U盤,會(huì)在中斷中操作spi。
    發(fā)表于 09-26 06:18

    基本半導(dǎo)體連獲兩個(gè)行業(yè)獎(jiǎng)項(xiàng)

    近日,基本半導(dǎo)體憑借在碳化硅模塊領(lǐng)域的突出表現(xiàn),連獲“國(guó)產(chǎn)SiC模塊TOP企業(yè)獎(jiǎng)”和“年度優(yōu)秀功率器件產(chǎn)品獎(jiǎng)”兩個(gè)行業(yè)獎(jiǎng)項(xiàng)。
    的頭像 發(fā)表于 09-05 16:31 ?1123次閱讀

    科普:無(wú)源晶振的電容匹配與問(wèn)題

    匹配電容并不是絕對(duì)的或者固定值,無(wú)源晶振的匹配電容一般最好選擇兩個(gè)一樣電容,在很多的方案設(shè)計(jì)中一般常用的電容有12pF、15pF、22pPF、33pF等,大致都是一個(gè)20pF量級(jí)。
    的頭像 發(fā)表于 08-29 11:27 ?2056次閱讀
    科普:無(wú)源晶振的電容<b class='flag-5'>匹配</b>與問(wèn)題

    圖中兩個(gè)按鍵開關(guān)是兩個(gè)干簧管,為什么不直接對(duì)GND設(shè)計(jì)來(lái)檢測(cè)這個(gè)干簧管通斷呢?

    圖中兩個(gè)按鍵開關(guān)是兩個(gè)干簧管,為什么不直接對(duì)GND設(shè)計(jì)來(lái)檢測(cè)這個(gè)干簧管通斷呢? 這樣設(shè)計(jì)的原理是什么?
    發(fā)表于 06-17 06:30

    看到STM8L152用兩個(gè)IO用兩個(gè)或非門檢測(cè)兩個(gè)通斷,是什么原理呢?

    圖中兩個(gè)按鍵開關(guān)是兩個(gè)干簧管,為什么不直接對(duì)GND設(shè)計(jì)來(lái)檢測(cè)這個(gè)干簧管通斷呢? 這樣設(shè)計(jì)的原理是什么?
    發(fā)表于 06-12 06:25

    基于LockAI視覺識(shí)別模塊:C++多模板匹配

    多模板匹配是一種在圖像中同時(shí)尋找多個(gè)模板的技術(shù)。通過(guò)對(duì)每個(gè)模板逐一進(jìn)行匹配,找到與輸入圖像最相似的區(qū)域,并標(biāo)記出匹配度最高的結(jié)果。本實(shí)驗(yàn)提供了一個(gè)簡(jiǎn)單的多模板
    的頭像 發(fā)表于 05-14 14:37 ?1634次閱讀
    基于LockAI視覺識(shí)別<b class='flag-5'>模塊</b>:C++多模板<b class='flag-5'>匹配</b>

    200r有償求組畢設(shè)加兩個(gè)模塊

    找stm32 f103c8t6單片機(jī)幫我加兩個(gè)模塊,一個(gè)BMP280-3.3壓強(qiáng)模塊,一個(gè)MQ-2煙霧
    發(fā)表于 04-26 18:17

    款推薦 |?迅為RK3568開發(fā)板4核處理器+1T算力NPU+好用到的配套資料和視頻!

    款推薦 | 迅為RK3568開發(fā)板4核處理器+1T算力NPU+好用到的配套資料和視頻!
    的頭像 發(fā)表于 03-19 13:41 ?1475次閱讀
    <b class='flag-5'>爆</b>款推薦 |?迅為RK3568開發(fā)板4核處理器+1T算力NPU+<b class='flag-5'>好用到</b><b class='flag-5'>爆</b>的配套資料和視頻!