如何识别并修正数据列中的单词拼写变体?数据清洗技术问询
识别并修正数据列中的单词拼写变体方案
针对城市名称这类存在大量拼写变体的数据清洗问题,以下是几种实用的解决思路,结合你的示例数据集逐一演示:
一、预定义映射表(适合已知常见变体的场景)
如果已经收集到大部分错误拼写的变体,直接创建映射字典是最精准高效的方案,完全避免模糊匹配的误差。
import pandas as pd import numpy as np # 原始数据 place = ['PHIADELPHIA','PHIALDELPHIA','PHIDELPHIA','illinois','PHIELADELPHIA','PHIILADELPHIA','illinoi','PHILA','PHILA.','PHILAD','PHILADALPHIA','PHILADELPHIA','PHILADELAPHIA','PHILADELHIA','PHILADELHPIA','PHILADELLPHIA','PHILADELPHIA','PHILADELPH','PHILADELPHA','PHILADELPHAI','PHILADELPHI','PHILADELPHIA'] correct_place=[np.nan]*len(place) df = pd.DataFrame(zip(place,correct_place), columns=["place", "correct_place"]) # 创建拼写映射表,覆盖已知变体,统一转大写规避大小写差异 place_mapping = { 'PHIADELPHIA': 'PHILADELPHIA', 'PHIALDELPHIA': 'PHILADELPHIA', 'PHIDELPHIA': 'PHILADELPHIA', 'PHIELADELPHIA': 'PHILADELPHIA', 'PHIILADELPHIA': 'PHILADELPHIA', 'PHILA': 'PHILADELPHIA', 'PHILA.': 'PHILADELPHIA', 'PHILAD': 'PHILADELPHIA', 'PHILADALPHIA': 'PHILADELPHIA', 'PHILADELAPHIA': 'PHILADELPHIA', 'PHILADELHIA': 'PHILADELPHIA', 'PHILADELHPIA': 'PHILADELPHIA', 'PHILADELLPHIA': 'PHILADELPHIA', 'PHILADELPH': 'PHILADELPHIA', 'PHILADELPHA': 'PHILADELPHIA', 'PHILADELPHAI': 'PHILADELPHIA', 'PHILADELPHI': 'PHILADELPHIA', 'ILLINOI': 'ILLINOIS', 'ILLINOIS': 'ILLINOIS' } # 批量映射修正 df['correct_place'] = df['place'].str.upper().map(place_mapping) print(df)
二、模糊匹配(适合未知变体的场景)
如果无法覆盖所有可能的拼写错误,用模糊匹配算法计算字符串相似度,自动匹配最接近的正确名称。常用工具是fuzzywuzzy,基于Levenshtein距离计算相似度。
- 先安装依赖:
pip install fuzzywuzzy python-Levenshtein
- 代码实现:
from fuzzywuzzy import process # 正确的候选城市列表 valid_places = ['PHILADELPHIA', 'ILLINOIS'] # 定义匹配函数,设置相似度阈值(可根据需求调整) def match_correct_place(place_str): place_upper = place_str.upper() match, score = process.extractOne(place_upper, valid_places) # 仅返回相似度≥80的结果,避免错误匹配 return match if score >= 80 else np.nan # 批量应用匹配函数 df['correct_place'] = df['place'].apply(match_correct_place) print(df)
三、结合预处理提升匹配准确率
在匹配前做字符串标准化,能大幅降低无效差异的影响:
- 统一大小写
- 去除标点符号
- 提前处理常见缩写
预处理+模糊匹配的组合示例:
import re def preprocess_place(place_str): # 转大写 processed = place_str.upper() # 移除所有非字母字符 processed = re.sub(r'[^A-Z]', '', processed) # 提前替换已知缩写 if processed == 'PHILA': return 'PHILADELPHIA' return processed # 先预处理,再执行模糊匹配 df['processed_place'] = df['place'].apply(preprocess_place) df['correct_place'] = df['processed_place'].apply(match_correct_place) print(df)
四、收尾:批量验证与人工修正
无论用哪种方法,都建议做最后验证:
- 统计
correct_place中的空值,手动处理无法自动匹配的条目 - 抽样检查匹配结果,修正阈值或补充映射表
- 收集新发现的变体,迭代优化清洗逻辑
内容的提问来源于stack exchange,提问作者fast_crawler
相关产品推荐
相关产品推荐

