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

如何使用Python从数据集地址列中提取国家名称

Python从非标准化地址中稳定提取国家名称实现方案

你现有带地址列的大型数据集,多数地址仅包含州、城市、邮政编码信息,未直接标注国家名称,数据样本参考:
地址数据样本

不要自己从零写正则硬匹配,全球地址格式差异极大,硬编码规则维护成本高、漏判多,按「成熟解析库为主+规则兜底+少量人工补漏」的流程做,能覆盖99%以上的场景。

核心方案:用libpostal做地址结构化解析

libpostal是开源的全球地址解析库,基于OpenStreetMap全球海量地址数据训练,支持上百种语言、任意顺序的非标准化地址解析,哪怕地址里没有直接写国家,也能通过邮编、州名、城市名的特征关联到对应国家,是目前开源场景下准确率最高的方案。

安装方法

# Mac环境
brew install libpostal
pip install postal

# Ubuntu/Debian环境
sudo apt-get install libpostal-dev
pip install postal

基础调用代码

from postal.parser import parse_address

def extract_country_by_libpostal(address_text: str) -> str | None:
    # 解析结果为(字段值, 字段类型)的元组列表,自动拆分国家、州、市、邮编、街道等字段
    parse_result = parse_address(address_text)
    for field_value, field_type in parse_result:
        if field_type == "country":
            return field_value
    return None

单靠这个库就能覆盖95%以上的常规地址场景,包括你样本里那种只写了州、城市、邮编的北美地址,都能直接匹配到正确国家。

兜底方案:多维度规则匹配补漏

针对极个别解析失败的地址,按优先级从高到低做特征匹配,不用追求100%规则覆盖,只需要补高频漏判场景即可:

  • 国家关键词直接匹配:整理全球国家的全称、简称、二字/三字代码、常用别名做精确字符串匹配,比如命中"USA"、"美国"、"UK"、"英国"、"Deutschland"这类关键词直接返回对应国家,可以直接基于pycountry库的内置国家数据生成基础映射表,手动补充常用口语别名即可。
  • 邮编格式匹配:全球各国的邮政编码格式有明确的规则差异,比如美国邮编为5位数字/5位+4位后缀格式、加拿大邮编为「字母+数字+字母 数字+字母+数字」的6位混合格式、中国邮编为6位纯数字,把高频国家的邮编规则写成正则,命中格式直接返回对应国家,邮编的匹配准确率远高于城市/州名匹配。
  • 高辨识度行政区匹配:整理全球范围内唯一归属的一级行政区名称映射,比如"California(加利福尼亚)"归属美国、"Ontario(安大略)"归属加拿大、"新南威尔士"归属澳大利亚,命中关键词即可返回对应国家。

兜底逻辑参考代码

import re
import pycountry
from typing import Optional

# 生成基础国家别名映射
country_map = {}
for country in pycountry.countries:
    country_map[country.name.lower()] = country.name
    country_map[country.alpha_2.lower()] = country.name
    country_map[country.alpha_3.lower()] = country.name
    if hasattr(country, "common_name"):
        country_map[country.common_name.lower()] = country.name
# 手动补充常用别名
country_map.update({
    "usa": "United States",
    "uk": "United Kingdom",
    "美国": "United States",
    "英国": "United Kingdom",
    "澳洲": "Australia"
})

# 高频国家邮编正则规则
zip_patterns = [
    (re.compile(r"\b\d{5}(-\d{4})?\b"), "United States"),
    (re.compile(r"\b[A-Za-z]\d[A-Za-z] \d[A-Za-z]\d\b"), "Canada"),
    (re.compile(r"\b\d{6}\b"), "China"),
    (re.compile(r"\b\d{4}\b"), "Australia")
]

# 高辨识度一级行政区映射,可根据自身数据集的高频场景持续补充
state_map = {
    "california": "United States",
    "ontario": "Canada",
    "new south wales": "Australia"
}

def fallback_extract_country(address_text: str) -> Optional[str]:
    text_lower = address_text.lower()
    # 优先匹配国家关键词
    for alias, country_name in country_map.items():
        if alias in text_lower:
            return country_name
    # 其次匹配邮编规则
    for pattern, country_name in zip_patterns:
        if pattern.search(address_text):
            return country_name
    # 最后匹配一级行政区
    for state_name, country_name in state_map.items():
        if state_name in text_lower:
            return country_name
    return None

大型数据集落地优化点

  • 处理百万级以上数据时,先用libpostal批量解析全量数据,把解析结果为空的异常数据单独捞出来,再跑兜底规则匹配
  • 两轮处理后仍未匹配到国家的数据占比通常不到1%,可以导出做少量人工标注,同时把标注过程中发现的新特征补充到规则映射表中,迭代2-3轮后整体准确率可以稳定在99%以上
  • 规则匹配时注意优先级:国家关键词>邮编>行政区>城市,避免同名城市/行政区导致的匹配错误

内容的提问来源于stack exchange,提问作者kaloon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:09:27