Python100个库分享第5个—fuzzywuzzy(模糊字符串匹配)

专栏导读

  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏

  • ❤️ 欢迎各位佬关注! ❤️

库介绍

  • FuzzyWuzzy 是一个简单易用的模糊字符串匹配工具包。它依据 Levenshtein Distance 算法,计算两个序列之间的差异。

  • Levenshtein Distance算法,又叫 Edit Distance算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。

安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple FuzzyWuzzy
  • fuzz模块用法1:简单匹配(Ratio)

  • 这个不怎么精确,不常用

fuzz模块用法1:简单匹配(Ratio)

  • 这个不怎么精确,不常用

from fuzzywuzzy import fuzz

res = fuzz.ratio("江苏省", "江苏省")
print(res)
res = fuzz.ratio("上海", "上海市")
print(res)
  • 输出

  • 一个为100%

  • 一个为80%

100
80

fuzz模块用法2:推荐使用—非完全匹配(Partial Ratio)

  • 非完全匹配,精度较高

from fuzzywuzzy import fuzz

res = fuzz.partial_ratio("江苏省", "江苏省")
print(res)
res = fuzz.partial_ratio("江苏", "江苏省")
print(res)
  • 输出

  • 两个都是显示100%

100
100

fuzz模块用法3:Token Sort Ratio)

  • 以 空格 为分隔符,小写化所有字母,无视空格外的其它标点符号

from fuzzywuzzy import fuzz

res = fuzz.ratio("西藏 自治区", "自治区 西藏")
print(res)
res = fuzz.ratio('I love YOU','YOU LOVE I')
print(res)
res = fuzz.token_sort_ratio("西藏 自治区", "自治区 西藏")
print(res)
res = fuzz.token_sort_ratio('I love YOU','YOU LOVE I')
print(res)
  • 输出

50
30
100
100

process模块

  • fuzz这几个ratio()函数(方法)最后得到的结果都是数字,如果需要获得匹配度最高的字符串结果,还需要依旧自己的数据类型选择不同的函数,然后再进行结果提取,如果但看文本数据的匹配程度使用这种方式是可以量化的,但是对于我们要提取匹配的结果来说就不是很方便了,因此就有了process模块。

  • 用于处理备选答案有限的情况,返回模糊匹配的字符串和相似度。

extract提取多条数据

  • 类似于爬虫中select,返回的是列表,其中会包含很多匹配的数据

from fuzzywuzzy import fuzz,process

choices = ["河南省", "郑州市", "湖北省", "武汉市"]
res = process.extract("郑州", choices, limit=2)
print(res)
  • 输出

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

extractOne提取一条数据

  • 如果要提取匹配度最大的结果,可以使用extractOne,注意这里返回的是 元组 类型, 还有就是匹配度最大的结果不一定是我们想要的数据,可以通过下面的示例和两个实战应用体会一下

from fuzzywuzzy import fuzz,process

choices = ["河南省", "郑州市", "湖北省", "武汉市"]
# res = process.extract("郑州", choices, limit=2)
# print(res)

res = process.extractOne("郑州", choices)
print(res)

res = process.extractOne("北京", choices)
print(res)
  • 输出

('郑州市', 90)
('湖北省', 45)

实战应用

在这里插入图片描述

  • 代码已注释

from fuzzywuzzy import fuzz, process
import pandas as pd

data = pd.read_excel('data.xlsx')
company = pd.read_excel('company.xlsx')


# 模糊匹配
def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):
    """
    :param df_1: df_1是自己获取的欲合并的左侧数据(这里是data变量)
    :param df_2: df_2是待匹配的欲合并的右侧数据(这里是company变量)
    :param key1: key1是df_1中要处理的字段名称(这里是data变量里的‘公司名称’字段)
    :param key2: df_2中要匹配的字段名称(这里是company变量里的‘公司名称’字段)
    :param threshold: threshold是设定提取结果匹配度的标准。注意这里就是对extractOne方法的完善,提取到的最大匹配度的结果并不一定是我们需要的,所以需要设定一个阈值来评判,这个值就为90,只有是大于等于90,这个匹配结果我们才可以接受
    :param limit: 默认参数就是只返回两个匹配成功的结果
    :return: df_1添加‘matches’字段后的新的DataFrame数据
    """
    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


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

  • 输出

     公司名称           matches
0    卫材药业  卫材药业(江苏)医疗科技有限公司
1    基蛋生物  基蛋生物(苏州)生物科技有限公司
2    康宁杰瑞                  
3    恩华药业                  
4  南京正大天晴       

总结

  • 希望对初学者有帮助

  • 致力于办公自动化的小小程序员一枚

  • 希望能得到大家的【一个免费关注】!感谢

  • 求个 🤞 关注 🤞

  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏

  • 求个 ❤️ 喜欢 ❤️

  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏

  • 求个 👍 收藏 👍

  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

  • 28
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一晌小贪欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值