自然语言处理关键库解析和使用方法- FuzzyWuzzy

发布于:2025-08-14 ⋅ 阅读:(10) ⋅ 点赞:(0)

FuzzyWuzzy 是一个用于模糊字符串匹配的 Python 库,基于 Levenshtein 距离算法计算字符串差异。它擅长处理拼写错误、缩写或格式不一的文本,适用于数据清洗、搜索匹配等场景。


技术原理:Levenshtein 距离

1. 算法公式

相似度计算公式为:
Similarity = ( 1 − 编辑距离 max ⁡ ( len ( s 1 ) , len ( s 2 ) ) ) × 100 \text{Similarity} = \left(1 - \frac{\text{编辑距离}}{\max(\text{len}(s1), \text{len}(s2))}\right) \times 100 Similarity=(1max(len(s1),len(s2))编辑距离)×100

  • 编辑距离:将字符串 A 转换为 B 的最小操作次数 。
  • 示例
    • s1 = "kitten"s2 = "sitting"
      编辑距离 = 3(替换 k→s, 替换 e→i, 插入 g)
      相似度 = $ (1 - \frac{3}{7}) \times 100 \approx 57 $ .
2. 优化策略
  • 加速库python-Levenshtein 用 C 实现算法,速度提升 4-10 倍 。
  • 预处理:默认移除非字母数字字符(如标点),可通过 full_process=False 禁用 .

常见误解澄清

  1. 为何 ("cow", "cowboy")partial_ratio 是 100?
    → 因 "cow""cowboy" 的子串,满足部分匹配条件 。

  2. 得分相同如何取舍?
    process.extractOne 默认返回第一个最高分项,需结合业务逻辑二次校验 .


以下是详细使用方法和示例:


安装

pip install fuzzywuzzy
# 提升速度(推荐安装依赖库)
pip install python-Levenshtein

核心模块及方法

1. fuzz 模块:计算字符串相似度
  • ratio: 全字符串匹配(严格比对)。

    from fuzzywuzzy import fuzz
    print(fuzz.ratio("apple", "appel"))  # 输出: 91 
    
  • partial_ratio: 部分匹配(子串匹配),忽略多余字符。

    print(fuzz.partial_ratio("apple", "apple pie"))  # 输出: 100
    
  • token_sort_ratio: 忽略单词顺序,按分词排序后匹配。

    print(fuzz.token_sort_ratio("apple pie", "pie apple"))  # 输出: 100
    
  • token_set_ratio: 忽略重复词和顺序,按词集匹配。

    print(fuzz.token_set_ratio("apple", "apple apple pie"))  # 输出: 100
    
2. process 模块:从候选列表中匹配最佳项
  • extract: 返回匹配项及相似度列表。

    from fuzzywuzzy import process
    choices = ["apple", "banana", "orange"]
    matches = process.extract("appl", choices, limit=2)
    print(matches)  # 输出: [('apple', 90), ('apple', 90)]
    
  • extractOne: 返回最佳匹配项(元组格式)。

    best_match = process.extractOne("appl", choices)
    print(best_match)  # 输出: ('apple', 90) 
    
  • dedupe: 去除重复项(保留最相似项)。

    deduped = process.dedupe(["app", "apple", "appel"])
    print(list(deduped))  # 输出: ['appel'] 
    

实战示例

示例 1:拼写检查
correct = "fuzzywuzzy"
user_input = "fuzzuwuzzy"
if fuzz.ratio(correct, user_input) >= 80:
    print("拼写正确!")
else:
    print(f"建议纠正为: {correct}")  # 输出: 拼写正确! 
示例 2:模糊搜索数据
data = ["北京市", "广西壮族自治区", "新疆维吾尔自治区"]
query = "广西"
best = process.extractOne(query, data)
print(f"最佳匹配: {best[0]}")  # 输出: 广西壮族自治区 
示例 3:Pandas 数据清洗
import pandas as pd
df = pd.DataFrame({"公司": ["Ptyhon Ltd", "PyThon Inc"]})
correct = "Python"
# 清洗拼写错误的公司名
df["清洗后"] = df["公司"].apply(
    lambda x: correct if fuzz.partial_ratio(x, correct) >= 80 else x
)
print(df)
# 输出:
#          公司        清洗后
# 0  Ptyhon Ltd    Python
# 1  PyThon Inc    Python 

注意事项

  1. 加速性能:安装 python-Levenshtein 可提升匹配速度 4-10 倍,否则会警告并使用纯 Python 慢速实现 。
  2. 阈值选择:相似度 ≥80 通常表示高质量匹配,可根据场景调整 。
  3. 算法选择
    • 需严格匹配时用 ratio
    • 处理子串或多余字符用 partial_ratio
    • 忽略词序用 token_sort_ratiotoken_set_ratio
  4. 特殊字符:默认会忽略非字母数字字符(如标点),可通过 full_process=False 禁用 。

官方文档参考:FuzzyWuzzy GitHub


网站公告

今日签到

点亮在社区的每一天
去签到