Android中如何将字符串转换提取为标准Address地址类型?
美国地址结构化可行方案
方案1:规则匹配(适用于格式规整的美国地址场景,实现成本最低)
美国本土地址格式高度标准化,绝大多数符合「街道地址, 城市, 州 邮编」的结构,直接用分割+正则就能实现需求:
- 第一步用逗号对原始地址做分割,去除各段首尾空白字符
- 第一段直接赋值给
address字段,address2默认留空,有需要处理公寓号、单元号场景时可扩展规则 - 第二段赋值给
city字段 - 第三段用正则匹配拆分2位州缩写和5位(或5-4格式)邮编,正则参考
r"^([A-Z]{2})\s*(\d{5}(?:-\d{4})?)$",忽略大小写匹配后分别赋值给state和zip字段
示例Python实现代码:
import re def parse_standard_us_address(raw_addr: str) -> dict: structured_addr = { "address": "", "address2": "", "city": "", "state": "", "zip": "" } addr_parts = [part.strip() for part in raw_addr.split(",")] if len(addr_parts) < 3: return structured_addr structured_addr["address"] = addr_parts[0] structured_addr["city"] = addr_parts[1] # 匹配州和邮编 sz_match = re.match(r"^([A-Z]{2})\s*(\d{5}(?:-\d{4})?)$", addr_parts[2], re.IGNORECASE) if sz_match: structured_addr["state"] = sz_match.group(1).upper() structured_addr["zip"] = sz_match.group(2) return structured_addr # 测试用例 print(parse_standard_us_address("12233 Abbb street, Los Angeles, CA 92666"))
运行输出结果:
{ 'address': '12233 Abbb street', 'address2': '', 'city': 'Los Angeles', 'state': 'CA', 'zip': '92666' }
方案2:NER模型识别(适用于地址格式不规整、多国家地址的场景)
如果需要处理缺逗号、带address2、地址顺序不固定的复杂场景,可以用命名实体识别模型抽取字段:
- 轻量场景可以用spaCy训练少量自定义地址标注数据,微调后即可满足需求
- 通用场景可以直接用开源的地址抽取预训练模型,不需要自行写规则,适配性更强
方案3:规则+模型兜底(适用于生产环境高准确率要求场景)
优先用规则匹配处理占比最高的格式规整地址,匹配失败的请求再走模型识别,兼顾处理效率和覆盖范围。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

