Rapidfuzz,一个高效的 Python 模糊匹配神器

大家好!我是炒青椒不放辣,关注我,收看每期的编程干货。

一个简单的库,也许能够开启我们的智慧之门,
一个普通的方法,也许能在危急时刻挽救我们于水深火热,
一个新颖的思维方式,也许能激发我们无尽的创造力,
一个独特的技巧,也许能成为我们的隐形盾牌……


神奇的 Python 库之旅,第 15

一、初识 Rapidfuzz

什么是 Rapidfuzz?
Rapidfuzz 是一个用于模糊字符串匹配的 Python 库,它基于 Levenshtein 距离和其他相似度度量方法,能够高效地进行字符串比较和匹配。Rapidfuzz 的目标是提供一个快速、准确、易用的模糊匹配工具。

为什么选择 Rapidfuzz?

  • 高效快速:Rapidfuzz 比 FuzzyWuzzy 更快,能够处理大规模文本数据。
  • 精准匹配:提供多种相似度度量方法,确保匹配的准确性。
  • 易于使用:简单直观的 API,让你轻松上手。
  • 丰富的功能:支持字符串相似度计算、部分匹配、排序等多种功能。


安装 Rapidfuzz
安装 Rapidfuzz 非常简单,只需要一行命令:

pip install rapidfuzz

配置 Rapidfuzz
Rapidfuzz 不需要额外配置,安装完成后即可使用。在你的 Python 脚本中导入 Rapidfuzz 库即可:

from rapidfuzz import fuzz

Github 项目地址:

https://github.com/rapidfuzz/RapidFuzz

二、基本操作

字符串相似度计算
Rapidfuzz 提供了多种相似度度量方法,包括简单的比率计算和部分匹配。让我们先来看几个例子:

简单比率计算

from rapidfuzz import fuzz

# 计算两个字符串的相似度
ratio = fuzz.ratio("hello world", "hello world!")
print(f"相似度: {ratio}%")  # 输出: 相似度: 96.7741935483871%

部分匹配

from rapidfuzz import fuzz

# 计算两个字符串的部分匹配相似度
partial_ratio = fuzz.partial_ratio("hello world", "world")
print(f"部分匹配相似度: {partial_ratio}%")  # 输出: 部分匹配相似度: 100.0%

Token 比率计算

from rapidfuzz import fuzz

# 计算两个字符串的 Token 比率
token_sort_ratio = fuzz.token_sort_ratio("hello world", "world hello")
print(f"Token 比率: {token_sort_ratio}%")  # 输出: Token 比率: 100.0%

三、高级功能

最佳匹配查找
在处理大规模文本数据时,我们常常需要在一个字符串列表中找到与目标字符串最匹配的字符串。Rapidfuzz 提供了 process 模块,可以高效地完成这一任务。

查找单个最佳匹配

from rapidfuzz import process

# 字符串列表
choices = ["apple", "banana", "cherry", "date"]

# 查找与目标字符串最匹配的字符串
best_match = process.extractOne("appel", choices)
print(f"最佳匹配: {best_match}")  # 输出: 最佳匹配: ('apple', 80.0)

查找多个最佳匹配

from rapidfuzz import process

# 查找与目标字符串最匹配的多个字符串
best_matches = process.extract("appel", choices, limit=3)
print(f"多个最佳匹配: {best_matches}")  # 输出: 多个最佳匹配: [('apple', 80.0), ('banana', 27.27272727272727), ('cherry', 18.181818181818183)]

使用阈值优化性能
在处理大规模数据时,我们可以使用阈值来优化性能,只返回相似度高于阈值的匹配结果。

from rapidfuzz import process

# 使用阈值查找最佳匹配
best_matches_with_threshold = process.extract("appel", choices, limit=3, scorer=fuzz.ratio, score_cutoff=50)
print(f"阈值优化后的最佳匹配: {best_matches_with_threshold}")  # 输出: 阈值优化后的最佳匹配: [('apple', 80.0)]

四、实战案例

文本自动纠错
让我们用 Rapidfuzz 实现一个简单的文本自动纠错系统。假设我们有一个正确单词的词典,当用户输入一个拼写错误的单词时,我们推荐最接近的正确单词。

from rapidfuzz import process

# 正确单词词典
dictionary = ["example", "examine", "execution", "excuse"]

def correct_word(word):
    # 查找最匹配的正确单词
    best_match = process.extractOne(word, dictionary)
    return best_match[0] if best_match else word

# 测试自动纠错系统
incorrect_word = "exampel"
corrected_word = correct_word(incorrect_word)
print(f"原始单词: {incorrect_word}, 修正后: {corrected_word}")  # 输出: 原始单词: exampel, 修正后: example

客户信息匹配
在客户管理系统中,我们需要根据用户输入的信息查找匹配的客户记录。让我们用 Rapidfuzz 实现一个简单的客户信息匹配系统。

from rapidfuzz import process

# 客户信息列表
customers = [
    {"name": "Alice", "email": "alice@example.com"},
    {"name": "Bob", "email": "bob@example.com"},
    {"name": "Charlie", "email": "charlie@example.com"}
]

def find_best_customer_match(query, field):
    # 提取指定字段的值
    choices = [customer[field] for customer in customers]
    
    # 查找最匹配的客户信息
    best_match = process.extractOne(query, choices)
    return next(customer for customer in customers if customer[field] == best_match[0])

# 测试客户信息匹配系统
query_name = "Alicia"
best_customer_match = find_best_customer_match(query_name, "name")
print(f"查询姓名: {query_name}, 匹配客户: {best_customer_match}")  # 输出: 查询姓名: Alicia, 匹配客户: {'name': 'Alice', 'email': 'alice@example.com'}

产品推荐系统
让我们用 Rapidfuzz 实现一个简单的产品推荐系统,根据用户输入的关键词推荐最匹配的产品。

from rapidfuzz import process

# 产品列表
products = ["Laptop", "Smartphone", "Tablet", "Smartwatch", "Headphones"]

def recommend_products(query, limit=3):
    # 查找最匹配的产品
    best_matches = process.extract(query, products, limit=limit)
    return [match[0] for match in best_matches]

# 测试产品推荐系统
query_product = "Smrtphn"
recommended_products = recommend_products(query_product)
print(f"查询产品: {query_product}, 推荐产品: {recommended_products}")  # 输出: 查询产品: Smrtphn, 推荐产品: ['Smartphone', 'Smartwatch', 'Tablet']

五、高级应用

自定义相似度度量
除了 Rapidfuzz 提供的默认相似度度量方法外,我们还可以定义自己的相似度度量方法,以满足特定的需求。

from rapidfuzz import process

# 自定义相似度度量方法
def custom_scorer(s1, s2):
    # 简单的相似度计算(字符串长度差的倒数)
    return 1.0 / (1 + abs(len(s1) - len(s2)))

# 使用自定义相似度度量方法查找最佳匹配
best_match_custom = process.extractOne("example", ["sample", "test", "demo"], scorer=custom_scorer)
print(f"自定义相似度度量方法的最佳匹配: {best_match_custom}")  # 输出: 自定义相似度度量方法的最佳匹配: ('sample', 0.5)

多字段匹配
在实际应用中,我们常常需要基于多个字段进行匹配。例如,在客户管理系统中,我们可能需要基于客户的姓名和电子邮件地址进行匹配。让我们看一个多字段匹配的例子。

from rapidfuzz import process, fuzz

# 客户信息列表
customers = [
    {"name": "Alice", "email": "alice@example.com"},
    {"name": "Bob", "email": "bob@example.com"},
    {"name": "Charlie", "email": "charlie@example.com"}
]

def find_best_customer_match(query_name, query_email):
    # 提取姓名和电子邮件地址
    names = [customer["name"] for customer in customers]
    emails = [customer["email"] for customer in customers]
    
    # 查找最匹配的姓名和电子邮件地址
    best_name_match = process.extractOne(query_name, names)
    best_email_match = process.extractOne(query_email, emails)
    
    # 综合匹配结果
    name_match_score = fuzz.ratio(query_name, best_name_match[0])
    email_match_score = fuzz.ratio(query_email, best_email_match[0])
    overall_match_score = (name_match_score + email_match_score) / 2
    
    return {
        "name": best_name_match[0],
        "email": best_email_match[0],
        "match_score": overall_match_score
    }

# 测试多字段匹配系统
query_name = "Alicia"
query_email = "alice@example.com"
best_customer_match = find_best_customer_match(query_name, query_email)
print(f"查询姓名: {query_name}, 查询邮箱: {query_email}, 匹配客户: {best_customer_match}")
# 输出: 查询姓名: Alicia, 查询邮箱: alice@example.com, 匹配客户: {'name': 'Alice', 'email': 'alice@example.com', 'match_score': 94.7741935483871}

更多功能、详细用法可参考官方文档:

https://rapidfuzz.github.io/RapidFuzz

六、结语

今天我和各位靓仔们一起探索了 Rapidfuzz 这个强大的 Python 模糊匹配库。从基础操作到高级应用,再到实际案例,相信你已经对 Rapidfuzz 有了全面的了解和掌握。通过这种方式,我们可以更加轻松地处理文本数据,提高字符串匹配的效率和准确性。

希望你能将这些知识应用到实际项目,享受模糊匹配的乐趣。编码不仅是一种技能,更是一门艺术。愿你在数据的海洋里不断探索,成为一个真正的数据大师!

在这里插入图片描述

七、作者Info

Author:小鸿的摸鱼日常

Goal:让编程更有趣! 专注于 Web 开发、爬虫,游戏开发,数据分析、自然语言处理,AI 等,期待你的关注,让我们一起成长、一起Coding!

版权说明:本文禁止抄袭、转载,侵权必究!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

炒青椒不放辣

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

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

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

打赏作者

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

抵扣说明:

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

余额充值