基于机器学习实现DataFrame中城市名称自动拼写纠错的技术咨询
基于频次的智能拼写纠错方案
当然可以搞定这个需求!你现在的手动替换虽然能解决单个错误,但遇到更多拼写错误时就太麻烦了。我们可以用「字符串相似度匹配+频次权重」的思路,自动把低频次的相似拼写纠正成高频的正确版本,完全不需要手动指定每个错误。
实现思路
核心逻辑非常直观:
- 统计所有城市名称的出现频次,默认频次高的拼写为正确版本
- 对每个低频次的城市名称,找到与它最相似的高频城市名称
- 构建替换映射,批量纠正错误拼写
具体代码实现
我们可以用fuzzywuzzy库(专门做字符串模糊匹配)来快速实现,先安装依赖:
pip install fuzzywuzzy python-Levenshtein
然后完整代码如下:
from fuzzywuzzy import process import pandas as pd from io import StringIO # 你的原始数据加载 myst="""1 Mumbai 2 Delhi 3 Delhi 4 Mumbai 5 Mumbai 6 Delhi 7 Dolhi """ u_cols=['customer_id', 'city'] df = pd.read_csv(StringIO(myst), sep=' ', names=u_cols) # 1. 统计城市频次,按频次从高到低排序 city_counts = df['city'].value_counts().reset_index() city_counts.columns = ['city', 'count'] sorted_cities = city_counts['city'].tolist() # 高频城市排在前面 # 2. 构建自动替换映射 replace_map = {} # 遍历所有唯一的城市名称 for city in df['city'].unique(): # 跳过已经是最高频次的城市(比如Mumbai和Delhi) current_count = city_counts[city_counts['city'] == city]['count'].values[0] if current_count == city_counts['count'].max(): continue # 找到与当前城市最相似的2个匹配项(按相似度排序) matches = process.extract(city, sorted_cities, limit=2) # 筛选出不是自身的匹配项,且相似度≥80(可调整阈值) for match, similarity_score in matches: if match != city and similarity_score >= 80: replace_map[city] = match break # 3. 应用替换,生成纠正后的城市列 df['corrected_city'] = df['city'].replace(replace_map) # 查看纠正后的频次统计 print(df['corrected_city'].value_counts())
运行后输出会是:
Delhi 4 Mumbai 3 Name: corrected_city, dtype: int64
不用第三方库的替代方案
如果不想安装额外库,可以用Python标准库的difflib实现类似功能:
import difflib import pandas as pd from io import StringIO # 数据加载部分同上 myst="""1 Mumbai 2 Delhi 3 Delhi 4 Mumbai 5 Mumbai 6 Delhi 7 Dolhi """ u_cols=['customer_id', 'city'] df = pd.read_csv(StringIO(myst), sep=' ', names=u_cols) city_counts = df['city'].value_counts().reset_index() city_counts.columns = ['city', 'count'] sorted_cities = city_counts['city'].tolist() replace_map = {} for city in df['city'].unique(): current_count = city_counts[city_counts['city'] == city]['count'].values[0] if current_count == city_counts['count'].max(): continue # 找相似匹配,cutoff是相似度阈值(0-1之间) matches = difflib.get_close_matches(city, sorted_cities, n=2, cutoff=0.8) for match in matches: if match != city: replace_map[city] = match break df['corrected_city'] = df['city'].replace(replace_map) print(df['corrected_city'].value_counts())
关键细节说明
- 相似度阈值:可以根据你的数据调整(比如fuzzywuzzy的80分,difflib的0.8),阈值太高会漏掉一些相似错误,太低可能会误替换。
- 频次优先:因为我们把高频城市排在前面,所以匹配时会优先选择出现次数多的正确拼写,完全符合你的需求。
- 扩展性:这个方案可以自动处理更多类似的拼写错误(比如
Mumbay→Mumbai),不需要手动修改代码。
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

