Python实现字符串模糊匹配详解

 更新时间:2023年11月23日 09:53:55   作者:mYlEaVeiSmVp  
这篇文章主要为大家详细介绍了Python实现字符串模糊匹配的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下

Python实现字符串模糊匹配及其在实战中的应用

在实际开发中,经常需要根据一个字段的值来查找另一个表格中对应的值,这时候就可以使用表格关联函数VLOOKUP。但是,在实际数据处理中,我们经常遇到输入的字符串有一些变体,这对于精确匹配是很困难的。因此,在本篇文章中,我们将探讨如何使用 Python 实现字符串模糊匹配,并介绍其在实际应用中的具体案例。

字符串模糊匹配的核心思想

字符串模糊匹配的核心思想是利用字符串的相似度计算函数,根据输入的字符串和已知的字符串进行比较,并返回一个相似度得分。其中,常用的相似度计算方法包括:

  • Levenshtein Distance(编辑距离)
  • Jaccard Similarity(Jaccard相似系数)
  • Cosine Similarity(余弦相似度)

本文将使用编辑距离作为相似度计算的方法,编辑距离定义为把一个字符串转化成另一个字符串所需的最少操作次数。

针对字符串模糊匹配的Python库:fuzzywuzzy

由于字符串模糊匹配在实际应用中较为普遍,因此在 Python 中也有相应的库来支持字符串模糊匹配。其中,fuzzywuzzy 是比较常用的一个库。

安装方法:

pip install fuzzywuzzy
pip install python-Levenshtein

代码实现

使用Python实现vlookup 字符串模糊匹配

下面我们将通过示例来演示如何使用 Python 实现 vlookup 字符串模糊匹配。

首先,我们需要导入必要的库:

from fuzzywuzzy import fuzz
import pandas as pd

然后,我们定义一个函数 fuzzy_merge,该函数使用编辑距离来计算两个字符串之间的相似度。具体代码如下所示:

def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=2):
    """
    使用编辑距离比较两列字符串,并返回相似度高于阈值的结果
    :param df_1: 需要合并的 DataFrame #1
    :param df_2: 需要合并的 DataFrame #2
    :param key1: 在 DataFrame #1 中进行比较的列名
    :param key2: 在 DataFrame #2 中进行比较的列名
    :param threshold: 设定的相似度阈值,默认为 90
    :param limit: 指定最多允许匹配的数量,默认为 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 函数来计算两个字符串之间的相似度,并返回相似度得分。这里的 process 对象是 fuzzywuzzy 库中的一个模块,我们需要将输入的字符串与目标字符串列表一一比较,以求得最相似的结果。通过设置阈值和限制,我们可以控制匹配结果的质量和数量。

为了检验函数的正确性,我们还可以创建以下示例数据:

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 函数将两个 DataFrame 进行合并了。

result = fuzzy_merge(df1, df2, 'Name', 'Name', threshold=80)

最终输出的结果如下所示:

NameAgematchesIncome
Bill Smith30[]NaN
Mary Brown25[]NaN
John Johnson40[‘John Jonson’]50000
Lisa Simpson20[‘Lisa Simpson’] 40000

可以看到,我们成功地根据相似度进行了匹配,并将匹配后的结果和原始数据合并在了一起。

应用案例:基于字符串模糊匹配的公司合并

除了 VLOOKUP 函数的应用,字符串模糊匹配在实际数据处理中还有许多应用场景。比如,在公司合并、收购等业务中,经常需要将两个公司的数据进行合并。在这种情况下,由于两个公司名称可能存在轻微的变化(比如大小写、连字符等),直接使用精确匹配往往会导致一些数据漏掉。

为了解决这个问题,我们可以使用 fuzzywuzzy 库来计算公司名称之间的相似度,并进行合并。以下是一个简单的示例,以说明如何利用字符串模糊匹配来实现公司数据的合并。

我们可以定义一个函数 fuzzy_company_merge 来完成这个任务:

def fuzzy_company_merge(df, company1, company2):
    """
    使用模糊匹配方法合并两个公司的数据
    :param df: 包含两个公司数据的 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 函数来计算公司名称之间的相似度,并将相似度得分大于 80 的结果筛选出来进行合并。

接下来,我们使用以下示例数据来演示函数的使用方法:

data = {'公司名称': ['Apple Inc.', 'Google Inc.', 'Amazon.com Inc.', 'Microsoft Corporation', 'Alphabet Inc.'],
        '市值(亿美元)': [2076, 1364, 1558, 1642, 1543]}
df = pd.DataFrame(data, columns=['公司名称', '市值(亿美元)'])

现在,如果我们想合并 Apple 和 Alphabet 两家公司的数据,只需要调用 fuzzy_company_merge 函数即可:

result = fuzzy_company_merge(df, 'Apple Inc.', 'Alphabet Inc.')

最终输出的结果如下所示:

公司名称市值(亿美元)
Apple Inc.2076
Alphabet Inc.1543

可以看到,我们成功地将两个公司的数据合并在了一起。

到此这篇关于Python实现字符串模糊匹配详解的文章就介绍到这了,更多相关Python字符串模糊匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 字符串大小写转换的简单实例

    Python 字符串大小写转换的简单实例

    下面小编就为大家带来一篇Python 字符串大小写转换的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • python打包exe开机自动启动的实例(windows)

    python打包exe开机自动启动的实例(windows)

    今天小编就为大家分享一篇python打包exe开机自动启动的实例(windows),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python根据文本生成词云图代码实例

    python根据文本生成词云图代码实例

    这篇文章主要介绍了python根据文本生成词云图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 给你一面国旗 教你用python画中国国旗

    给你一面国旗 教你用python画中国国旗

    朋友圈许多小伙伴都在发:请给我一面五星红旗的动态,这篇文章就主要教大家如何使用python画中国国旗,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 图文详解如何利用PyTorch实现图像识别

    图文详解如何利用PyTorch实现图像识别

    这篇文章主要给大家介绍了关于如何利用PyTorch实现图像识别的相关资料,文中通过图文以及实例代码介绍的非常详细,对大家学习或者使用PyTorch具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04
  • Python中的asyncio性能分析

    Python中的asyncio性能分析

    这篇文章主要介绍了Python中的asyncio性能分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • python和flask中返回JSON数据的方法

    python和flask中返回JSON数据的方法

    下面小编就为大家整理了一篇python和flask中返回JSON数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • python爬虫之scrapy框架详解

    python爬虫之scrapy框架详解

    这篇文章主要为大家介绍了python爬虫之scrapy框架,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • Python还能这么玩之用Python做个小游戏的外挂

    Python还能这么玩之用Python做个小游戏的外挂

    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过外挂怎么制作出来的呢?现在来看一下怎么制作一个外挂,首先说下,这里的游戏外挂的概念,和那些大型网游里的外挂可不同,不能自动打怪,主要为了提高一下编程技术,需要的朋友可以参考下
    2021-06-06
  • Python实现Keras搭建神经网络训练分类模型教程

    Python实现Keras搭建神经网络训练分类模型教程

    这篇文章主要介绍了Python实现Keras搭建神经网络训练分类模型教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06

最新评论