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

Pandas如何基于官方城市列表模糊匹配提取文本地名并纠错

解决方案

你的问题核心是三个点:大小写不兼容、重音类拼写差异无法识别、短地名优先命中导致匹配错误,按照以下步骤改造即可解决:


前置依赖导入

import pandas as pd
import unicodedata

第一步:编写字符串标准化工具函数

统一处理大小写、重音差异,抹平匹配前的格式区别:

def normalize_str(input_str):
    # 先将Unicode字符拆分,提取ASCII字符去掉重音,再统一转小写
    str_without_accent = unicodedata.normalize('NFD', str(input_str)).encode('ascii', 'ignore').decode('utf-8')
    return str_without_accent.lower()

第二步:预处理官方城市列表

# 给官方地名新增标准化字段
barha['norm_name'] = barha['nombre_geografico'].apply(normalize_str)
# 按官方地名长度降序排序,保证匹配时优先命中更长的地名,避免短地名提前截胡
barha = barha.sort_values(
    by='nombre_geografico',
    key=lambda x: x.str.len(),
    ascending=False
).reset_index(drop=True)
# 提前转成列表减少后续循环的重复计算
std_name_list = barha['nombre_geografico'].tolist()
norm_std_name_list = barha['norm_name'].tolist()

第三步:编写匹配逻辑并应用

def match_std_name(desc):
    norm_desc = normalize_str(desc)
    # 遍历已按长度排序的标准地名列表,找到第一个匹配项就返回
    for std_name, norm_std in zip(std_name_list, norm_std_name_list):
        if norm_std in norm_desc:
            return std_name
    return None

datos['localidad'] = datos['desc'].apply(match_std_name)

效果说明

  1. 大小写兼容:所有字符串匹配前统一转小写,不受原文本大小写格式影响
  2. 重音拼写兼容:通过unicodedata处理后,Lanús和lanus会被判定为相同字符串,可正常匹配
  3. 最长匹配优先:官方地名提前按长度降序排序,更长的地名会优先被匹配,不会出现La Plata被误匹配为Pla的问题

如果需要进一步降低误匹配率,可以在预处理官方地名时,提前过滤掉长度小于2的无效短地名。


内容的提问来源于stack exchange,提问作者Facundo Javier Vargas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:36:03