<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          干貨|兩個常用的 Python 模塊

          共 11066字,需瀏覽 23分鐘

           ·

          2024-04-17 08:34


          轉(zhuǎn)自:python編程學(xué)習(xí)社


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

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


          前言


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



          FuzzyWuzzy庫介紹


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

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

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

          pip install -i https://pypi.tuna.tsinghua.edu.cn/simple FuzzyWuzzy1 fuzz模塊


          1 fuzz模塊


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


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



          1.1 簡單匹配(Ratio)


          簡單的了解一下就行,這個不怎么精確,也不常用

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

          output

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

          output

          80


          1.2 非完全匹配(Partial Ratio)


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

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

          output

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

          output

          100


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


          原理在于:以 空格 為分隔符,小寫 化所有字母,無視空格外的其它標點符號

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

          output

          50fuzz.ratio('I love YOU','YOU LOVE I')

          output

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

          output

          100fuzz.token_sort_ratio('I love YOU','YOU LOVE I')

          output

          100


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


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

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

          output

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

          output

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

          output

          100


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


          process模塊


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


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


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

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

          output

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


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


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


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


          process.extractOne("鄭州", choices)

          output

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

          output

          ('湖北省', 45)


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


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


          3.1 公司名稱字段模糊匹配


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



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



          3.1.1 參數(shù)講解


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

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

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

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

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

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

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


          3.1.2 核心代碼講解


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


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


          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ù)類型,然后就是進行數(shù)據(jù)的提取了,需要處理的部分有兩點需要注意的:

          提取匹配成功的字符串,并對閾值小于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 '')# 要理解第一個‘matches’字段返回的數(shù)據(jù)類型是什么樣子的,就不難理解這行代碼了# 參考一下這個格式:[('鄭州市', 90), ('河南省', 0)]df_1['matches'] = m2return 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 fuzzfrom fuzzywuzzy import process
          df = fuzzy_merge(data, company, '公司名稱', '公司名稱', threshold=90)df



                  


          推薦小碼哥新書!

          小碼哥新手《Python + Excel/Word/PPT一本通》正式上市了!書中詳細介紹了零基礎(chǔ)用Python實現(xiàn)辦公自動化的各方面知識,提高職場辦公效率,附贈PPT/源代碼/重點教學(xué)視頻講解和作者VIP一對一指導(dǎo)。


          內(nèi)容介紹《Python + Excel/Word/PPT 一本通》內(nèi)容介紹



          掃碼購買



          零基礎(chǔ)學(xué) Python,看下嘛
          送109元的零基礎(chǔ)視頻課

           只需7天時間,跨進Python編程大門,已有3800+加入
          【基礎(chǔ)】0基礎(chǔ)入門python,24小時有人快速解答問題;
          【提高】40多個項目實戰(zhàn),老手可以從真實場景中學(xué)習(xí)python;
          【直播】不定期直播項目案例講解,手把手教你如何分析項目;
          【分享】優(yōu)質(zhì)python學(xué)習(xí)資料分享,讓你在最短時間獲得有價值的學(xué)習(xí)資源;圈友優(yōu)質(zhì)資料或?qū)W習(xí)分享,會不時給予贊賞支持,希望每個優(yōu)質(zhì)圈友既能賺回加入費用,也能快速成長,并享受分享與幫助他人的樂趣。
          【人脈】收獲一群志同道合的朋友,并且都是python從業(yè)者
          【價格】本著布道思想,只需 69元 加入一個能保證學(xué)習(xí)效果的良心圈子。
          【贈予】價值109元 0基礎(chǔ)入門在線課程,免費送給圈友們,供鞏固


          瀏覽 147
          10點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          10點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色视频网站在线 | 国产激情性爱视频 | 无码翔田千里 | 欧美性受XXXX黑人XYX | 无码人妻一区二区 |