如何用Python的Levenshtein Distance实现Excel数据集名称字段错误修正
拼写错误名称自动匹配替换方案
前置准备
首先将正确数据集的names字段去重,生成正确名称候选项池,两份数据集的名称字段建议先做统一预处理:转小写、去除首尾空格、特殊符号,根据你的错误场景还可选择加入易混字符替换规则(比如把0替换为o、1替换为l)。
方案1:基于nltk.edit_distance的自定义实现
适合不想额外安装依赖的场景,核心逻辑是给每个错误名称匹配编辑距离最小的正确名称,加阈值过滤避免误匹配:
import pandas as pd from nltk.edit_distance import edit_distance # 读取两份数据集 df_correct = pd.read_excel("正确数据集路径.xlsx") df_error = pd.read_excel("错误数据集路径.xlsx") # 生成去重的正确名称候选项池 correct_names = df_correct['names'].drop_duplicates().tolist() # 名称标准化函数,可根据业务调整规则 def clean_name(s): s = str(s).lower().strip() # 替换易混字符,没有对应错误可以删除这行 s = s.replace('0', 'o').replace('1', 'l').replace(r'[^\w\s]', '') return s correct_clean = [clean_name(name) for name in correct_names] # 匹配函数,threshold为编辑距离阈值,可根据名称长度调整 def match_correct_name(error_name, threshold=2): error_clean = clean_name(error_name) # 计算和所有正确名称的编辑距离 distance_list = [edit_distance(error_clean, c_name) for c_name in correct_clean] min_dist = min(distance_list) # 距离小于阈值才替换,否则返回原名称留待人工校验 if min_dist <= threshold: return correct_names[distance_list.index(min_dist)] return error_name # 应用到错误数据集 df_error['fixed_names'] = df_error['names'].apply(match_correct_name)
- 注意:如果正确名称量级超过1万,遍历计算效率会很低,可以提前按首字母/前缀分组缩小候选池,提升匹配速度。
方案2:基于fuzzywuzzy的优化实现(更推荐)
这个库底层基于编辑距离,但优化了不同位置字符错误的权重,支持局部匹配,准确率比手写编辑距离高很多,也不需要做复杂的预处理:
- 先安装依赖:
pip install fuzzywuzzy python-Levenshtein,其中python-Levenshtein是C实现的加速包,可选安装 - 代码示例:
from fuzzywuzzy import process # 直接复用上面生成的correct_names正确候选项池 def match_fuzzy(error_name, threshold=85): # 直接返回匹配度最高的结果和得分,得分范围0-100 match_res, score = process.extractOne(error_name, correct_names) return match_res if score >= threshold else error_name df_error['fixed_names'] = df_error['names'].apply(match_fuzzy)
- 优势:你提到的
Adidas误写为Addas、XY Company误写为XY C0mpany这类单字符错误,匹配得分都会在90以上,不会出现误匹配,阈值80-90即可覆盖绝大多数常见拼写错误场景。
后续优化建议
- 匹配完成后可以把原错误名称、修正后名称、匹配得分/编辑距离单独导出一张表,人工校验得分刚好卡在阈值附近的结果,避免错误替换
- 如果名称里有大量通用后缀(比如
Company、Co.、Ltd.),可以提前去掉后缀再匹配,进一步提升准确率
内容的提问来源于stack exchange,提问作者joey
相关产品推荐
相关产品推荐

