能,cpca可直接拆分中国内地标准多级地址,但对口语化、错位表达或省名缺失地址易漏判province或误判city,需预处理缩写与干扰字符,且默认仅返回省市区三级。

能,但仅限于中国内地标准地址,且对“嵌套式”写法(比如 "广东省深圳市南山区科技园路1号腾讯大厦")效果较好;遇到“口语化”或“错位表达”(如 "北京朝阳区建国路8号华贸中心3座" 中省名缺失、“朝阳区”前置)会漏掉 province 或误判 city。
实际使用前必须做两件事:
- 统一补全常见缩写:把
"京"→"北京市"、"沪"→"上海市",否则cpca不识别 - 预清洗干扰字符:去掉括号内容(
"(总部)")、电话、邮编、楼层号("B1层"),否则影响切分位置 -
cpca默认只返回province/city/district三级,街道以下(如“科技园路”“建国路”)不提取,需额外处理
关键不是匹配“XX市”,而是锚定“市/区/县/自治州/盟”这些行政通名的后置边界,避免把 "广州市天河区" 错切成 "广州"(漏“市”)或 "广州市天"(过切)。
推荐用这个基础模式:
^(?P[^市辖区县自治州盟]+?(?:省|自治区|直辖市))?((?P [^市辖区县自治州盟]+?)(?:市|自治州|盟))?((?P [^市辖区县]+?)(?:市辖区|区|县|自治县|旗|自治旗))?
注意三点:
- 所有捕获组用
?修饰,保证“省可选、市可选、区可选”,适配"杭州市西湖区"和"长沙市"两类输入 -
[^市辖区县自治州盟]+?用非贪婪+否定字符集,防止跨过“市”字吞掉后面内容(比如把"内蒙古自治区呼和浩特市"的“呼和浩”当province) - 真实场景中,要先用
re.sub()把"新疆维吾尔自治区"简写为"新疆",否则正则太长易出错;cpca内部就做了这类归一化
别让两者“各干各的”。典型错误是:先用 cpca.tag() 得到结果,再用正则去“补充”街道,结果正则又把 cpca 已识别的 district 部分重新切了一遍,导致字段错位。
正确做法是分阶段处理:
- 第一阶段:用
cpca提取确定性强的三级(province/city/district),并记录其在原文中的起止位置(cpca不直接返回位置,可用cpca.extract_location()+ 手动str.find()逼近) - 第二阶段:把原文按
cpca切出的district结尾处截断,剩余部分(如"科技园路1号腾讯大厦")再交给正则或关键词规则提取街道、门牌、POI - 如果
cpca返回空(比如地址是"丰台区西三环南路甲6号",没写“北京市”),就 fallback 到正则全量匹配,且正则 pattern 要包含“区/县”前置的分支(如(?P)[一-龥]{2,8}?(?:区|县))(?P [一-龥0-9-号路街巷]+)
因为 cpca 内部加载了约 4MB 的行政区划 JSON,并在每次 tag() 时做模糊匹配和层级回溯。批量处理上万条地址时,启动开销明显。
提速关键在复用:
- 不要在循环里反复调用
cpca.tag([addr]),改用cpca.tag(addr_list)一次性传入列表,内部会批量预处理 - 如果只关心省市区,禁用街道解析:传参
cut=False(默认True),跳过耗时的细粒度切分 - 对高频出现的地址模板(如
"XX市YY区ZZ路*号"),先用正则快速分流,只把“异常格式”喂给cpca,能减少 70%+ 调用次数
真正难的不是识别“北京市”,而是判断“朝阳区”属于北京市还是辽宁省——这种跨省同名区,得靠上下文词频或坐标辅助,纯文本规则很难兜底。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/266330.html