Skip to main content

中文地址解析器和提取工具,中国省、市和地区识别工具

项目描述

地址解析器

PyPI 版本 下载 麻省理工学院 Python3 Python2.7 GitHub 问题 微信群

中文地址,中国三级区划(支持、市、提取和级联映射,支持省地址工具和资源图)python22.python3。

特征

地址提取

["徐汇区虹漕路461号58号楼5楼", "福建泉州市洛江区万安塘西工业区"]
        ↓ 转换
|省    |市   |区    |地名                |
|上海市|上海市|徐汇区|虹漕路461号58号楼5楼  |
|福建省|泉州市|洛江区|万安塘西工业区        |

:“地名”列代表消除了省市区之后的具体地名

数据集:中国行政区划地名

数据源:自国家统计局提取,中华人民共和国民政局全国行政区划查询平台

数据文件存储:addressparser/resource/pca.csv,数据为2021年发布统计用区代码和城乡分类代码(截止时间:2021-10-31,时间:2021-12-30)

演示

http://42.193.145.218/product/address_extraction/

安装

pip install addressparser

或者

git clone https://github.com/shibing624/addressparser.git
cd addressparser
python3 setup.py install

用法

  • 省市区

示例base_demo.py

location_str = ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "朝阳区北苑华贸城"]
import addressparser
df = addressparser.transform(location_str)
print(df)

输出:

       省     市    区          地名
    0 上海市 上海市  徐汇区     虹漕路461号58号楼5楼
    1 福建省 泉州市  洛江区     万安塘西工业区
    2 北京市 北京市  朝阳区     北苑华贸城

程序的此处输入location_str可以是任意的可访问类型,如list,tuple,set,pandas的Series类型等;

输出的df是一个Pandas的DataFrame类型变量,DataFrame可以很容易地转化为csv或者excel文件,Pandas的官方文档:http: //pandas.pydata.org/pandas-docs/version/0.20/dsintro.html#dataframe

  • 带索引位置的省市县抽取

示例pos_sensitive_demo.py

location_str = ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "朝阳区北苑华贸城"]
import addressparser
df = addressparser.transform(location_str, pos_sensitive=True)
print(df)

输出:

     省    市    区        地名                  省_pos  市_pos 区_pos
0  上海市  上海市  徐汇区  虹漕路461号58号楼5楼   -1     -1      0
1  福建省  泉州市  洛江区  万安塘西工业区         -1      0      3
2  北京市  北京市  朝阳区  北苑华贸城             -1     -1      0
  • 切词模式的省市区提取

采用模式,不进行分词,匹配全文匹配,这样的全文速度,准确率高。

示例enable_cut_demo.py

location_str = ["浙江省杭州市下城区青云街40号3楼"]
import addressparser
df = addressparser.transform(location_str)
print(df)

输出:

   省       市     区         地名
0  浙江省  杭州市  下城区     青云街40号3楼

先通过jieba,然后做地区提取词及映射的方法,所以我们引入了切模式,速度很快,使用如下:

location_str = ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "朝阳区北苑华贸城"]
import addressparser
df = addressparser.transform(location_str, cut=True)
print(df)

输出:

       省     市    区          地名
    0 上海市 上海市  徐汇区     虹漕路461号58号楼5楼
    1 福建省 泉州市  洛江区     万安塘西工业区
    2 北京市 北京市  朝阳区     北苑华贸城

但可能会出错,如下所示,这种错误的结果是因为jieba本身就将词给分错了:

location_str = ["浙江省杭州市下城区青云街40号3楼"]
import addressparser
df = addressparser.transform(location_str, cut=True)
print(df)

输出:

     省    市      区    地名
0  浙江省  杭州市  城区  下城区青云街40号3楼

下变换方法的全部参数为假,即采用匹配的方式,如果这种方式准确率高,但速度可能会有慢一点;追求速度而不是追求准确率的话,默认将切为真,使用切词模式。

  • 地址经纬度、省市县级联关系查询

示例find_place_demo.py

## 查询经纬度信息
from addressparser import latlng
latlng[('北京市','北京市','朝阳区')] #输出('39.95895316640668', '116.52169489108084')

## 查询含有"鼓楼区"的全部地址
from addressparser import area_map
area_map.get_relational_addrs('鼓楼区') #[('江苏省', '南京市', '鼓楼区'), ('江苏省', '徐州市', '鼓楼区'), ('福建省', '福州市', '鼓楼区'), ('河南省', '开封市', '鼓楼区')]
#### 注: city_map可以用来查询含有某个市的全部地址, province_map可以用来查询含有某个省的全部地址

## 查询含有"江苏省", "鼓楼区"的全部地址
from addressparser import province_area_map
province_area_map.get_relational_addrs(('江苏省', '鼓楼区')) # [('江苏省', '南京市', '鼓楼区'), ('江苏省', '徐州市', '鼓楼区')]
  • 绘画热力图

使用这些热力图命令绘制函数之前需要先用它的(为了减少安装本模块的体积,所以依赖不会被自动安装):

pip install pyecharts==0.5.11
pip install echarts-countries-pypkg
pip install pyecharts-snapshot

使用本仓库提供的一万多条地址数据tests/addr.csv测试。

示例draw_demo.py

#读取数据
import pandas as pd
origin = pd.read_csv("tests/addr.csv")
#转换
import addressparser
addr_df = addressparser.transform(origin["原始地址"])
#输出
processed = pd.concat([origin, addr_df], axis=1)
processed.to_csv("processed.csv", index=False, encoding="utf-8")

from addressparser import drawer
drawer.echarts_draw(processed, "echarts.html")

输出:

1) processed.csv:1万多地址的省市县提取结果
2)echarts.html:echarts热力图

浏览器打开echarts.html后:

echarts热力图

  • 分类信息图

将样本分类为不同类别,通过另外一个不同类别的样本的信息,能够上以以点的图片出属于该样本的样本散点图,以“省”类别代码的类别信息作为分类图(可以看到的,属于不同省的颜色标注出来的,这里以“省”作为分类标准举个例子,实际应用中可以以某样有实际意义的分类指标):

示例draw_demo.py ,接上示例代码:

from addressparser import drawer
drawer.echarts_cate_draw(processed, processed["省"], "echarts_cate.html")

浏览器打开输出的echarts_cate.html后:

echarts分类散点图

命令行使用

  • 典型模式

支持标注地址:所在省市区信息

示例cmd_demo.py

python3 -m addressparser address_input.csv -o out.csv

usage: python3 -m addressparser [-h] -o OUTPUT [-c] input
@description:

positional arguments:
  input                 the input file path, file encode need utf-8.

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT, --output OUTPUT
                        the output file path.
  -c, --cut             use cut mode.

输入文件:address_input.csv;输出文件:out.csv,省市县地址以\t间隔,-c表示使用切词

去做

  • bug,吉林省、广西省部分地址和上海浦东新区等三级区划定位匹配错误
  • 定期增加从民政局官网爬取最新省市县镇村官网的统计功能,后因是2018年延后官网未更新
  • 解决路名被误识别为省市名的问题,例如“天津空港经济区环河北路80号空港商务园”
  • 添加城市后的级联校验逻辑
  • 大范围地址数据,准召率效果
  • 补充香港、澳门、台湾三级区划位信息

接触

  • 问题(建议):GitHub 问题
  • 邮件我:xuming: xuming624@qq.com
  • 微信我:加我微信号:xuming624,备注:个人名称-公司-NLP进NLP交流群。

引文

如果你在研究中使用了addressparser,请按以下格式引用:

APA:

Xu, M. Addressparser: Chinese address parser toolkit (Version 0.2.4) [Computer software]. https://github.com/shibing624/addressparser

中文提供:

@software{Xu_Addressparser_Chinese_address,
author = {Xu, Ming},
title = {{Addressparser: Chinese address parser toolkit}},
url = {https://github.com/shibing624/addressparser},
version = {0.2.4}
}

执照

授权协议为Apache License 2.0,可免费用于商业用途。请在产品说明中附加地址解析器的链接和授权协议。

贡献

项目代码还很粗糙,如果大家对代码项目有所改进,欢迎提交回本,在提交之前,注意以下两点:

  • tests添加相应的单元测试
  • 使用python pytest来运行所有单元测试,确保所有单测都是通过的

之后可以提交 PR。

参考

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

addressparser-0.2.4.tar.gz (108.5 kB 查看哈希

已上传 source