CPCA - Chinese Province City Area Parser

中国省市区地址解析库,用于从自由文本地址中提取省、市、区信息。
功能特性
- 🚀 高性能 - 基于前缀树实现,O(n) 时间复杂度
- 📦 零依赖 - 纯 Rust 实现,无需外部分词库
- 🎯 智能匹配 - 支持省份简称、城市简称、区县简称
- 🏛️ 完整数据 - 内置 2025 年最新行政区划(3600+ 条记录)
- 🔧 易于使用 - 简洁的 API,开箱即用
安装
[dependencies]
cpca = "0.1"
快速开始
use cpca::AddressParser;
fn main() {
let parser = AddressParser::new();
let result = parser.parse("广东省深圳市南山区科技园路1号");
println!("省份: {:?}", result.province); println!("城市: {:?}", result.city); println!("区县: {:?}", result.district); println!("详址: {}", result.detail);
let result = parser.parse("深圳南山科技园");
assert_eq!(result.province, Some("广东省".to_string()));
assert_eq!(result.city, Some("深圳市".to_string()));
assert_eq!(result.district, Some("南山区".to_string()));
}
便捷函数
let result = cpca::parse("北京市朝阳区望京");
let full = cpca::normalize("广东", "深圳", Some("南山"));
assert_eq!(full, "广东省深圳市南山区");
支持的场景
完整地址
parser.parse("广东省深圳市南山区科技园");
省份简称
parser.parse("广东深圳市南山区");
缺省省份
parser.parse("深圳市南山区科技园");
直辖市
parser.parse("北京市朝阳区");
自治区
parser.parse("广西南宁市");
自治州
parser.parse("云南省大理白族自治州大理市");
API 文档
AddressParser
impl AddressParser {
fn new() -> Self;
fn global() -> &'static AddressParser;
fn parse(&self, address: &str) -> ParsedAddress;
fn normalize(&self, province: &str, city: &str, district: Option<&str>) -> String;
fn parse_batch(&self, addresses: &[&str]) -> Vec<ParsedAddress>;
fn is_valid_address(&self, address: &str) -> bool;
fn provinces(&self) -> Vec<&String>;
fn cities_of_province(&self, province: &str) -> Vec<&String>;
fn districts_of_city(&self, city: &str) -> Vec<&String>;
}
ParsedAddress
pub struct ParsedAddress {
pub province: Option<String>, pub city: Option<String>, pub district: Option<String>, pub detail: String, }
impl ParsedAddress {
fn is_complete(&self) -> bool; fn full_address(&self) -> String; }
特性 (Features)
[dependencies]
cpca = { version = "0.1", features = ["serde"] }
数据来源
行政区划数据来自 AreaCity-JsSpider-StatsGov,包含:
- 34 个省级行政区(含港澳台)
- 300+ 个地级市/自治州
- 2800+ 个区县
数据更新至 2025 年。
性能
在 M1 Mac 上的基准测试结果:
| 操作 |
耗时 |
| 解析完整地址 |
~500ns |
| 解析简称地址 |
~600ns |
| 标准化地址 |
~200ns |
与 Python cpca 的对比
| 特性 |
cpca (Python) |
cpca (Rust) |
| 分词依赖 |
jieba |
无需 |
| 性能 |
较慢 |
快 10-50x |
| 内存 |
~50MB |
~5MB |
| 部署 |
需要 Python |
单一二进制 |
License
MIT License
贡献
欢迎提交 Issue 和 Pull Request!