You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于机器学习实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:54:32