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)
效果说明
- 大小写兼容:所有字符串匹配前统一转小写,不受原文本大小写格式影响
- 重音拼写兼容:通过
unicodedata处理后,Lanús和lanus会被判定为相同字符串,可正常匹配 - 最长匹配优先:官方地名提前按长度降序排序,更长的地名会优先被匹配,不会出现
La Plata被误匹配为Pla的问题
如果需要进一步降低误匹配率,可以在预处理官方地名时,提前过滤掉长度小于2的无效短地名。
内容的提问来源于stack exchange,提问作者Facundo Javier Vargas
相关产品推荐
相关产品推荐

