addana

address
中文地址提取工具,支持中国三级区划地址(省、市、区)提取和级联映射,支持地址目的地热力图绘制。适配python2和python3。
Feature
地址提取
["徐汇区虹漕路461号58号楼5楼", "福建泉州市洛江区万安塘西工业区"]
↓ 转换
|省 |市 |区 |地名 |
|上海市|上海市|徐汇区|虹漕路461号58号楼5楼 |
|福建省|泉州市|洛江区|万安塘西工业区 |
注:“地名”列代表去除了省市区之后的具体地名
数据集:中国行政区划地名
数据源:爬取自国家统计局,中华人民共和国民政局全国行政区划查询平台
数据文件存储在:addressparser2/resources/pca.csv,数据为2021年统计用区划代码和城乡划分代码(截止时间:2021-10-31,发布时间:2021-12-30)
Demo
http://42.193.145.218/product/address_extraction/
Install
pip install addressparser2
or
git clone https://github.com/advancehs/addressparser2.git
cd addressparser2
python3 setup.py install
Usage
示例base_demo.py
location_str = ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "朝阳区北苑华贸城"]
import addressparser2
df = addressparser2.transform(location_str)
print(df)
output:
省 市 区 地名
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 addressparser2
df = addressparser2.transform(location_str, pos_sensitive=True)
print(df)
output:
省 市 区 地名 省_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 addressparser2
df = addressparser2.transform(location_str)
print(df)
output:
省 市 区 地名
0 浙江省 杭州市 下城区 青云街40号3楼
可以先通过jieba分词,之后做省市区提取及映射,所以我们引入了切词模式,速度很快,使用方法如下:
location_str = ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区", "朝阳区北苑华贸城"]
import addressparser2
df = addressparser2.transform(location_str, cut=True)
print(df)
output:
省 市 区 地名
0 上海市 上海市 徐汇区 虹漕路461号58号楼5楼
1 福建省 泉州市 洛江区 万安塘西工业区
2 北京市 北京市 朝阳区 北苑华贸城
但可能会出错,如下所示,这种错误的结果是因为jieba本身就将词给分错了:
location_str = ["浙江省杭州市下城区青云街40号3楼"]
import addressparser2
df = addressparser2.transform(location_str, cut=True)
print(df)
output:
省 市 区 地名
0 浙江省 杭州市 城区 下城区青云街40号3楼
默认情况下transform方法的cut参数为False,即采用全文匹配的方式,这种方式准确率高,但是速度可能会有慢一点;
如果追求速度而不追求准确率的话,建议将cut设为True,使用切词模式。
示例find_place_demo.py
from addressparser2 import latlng
latlng[('北京市','北京市','朝阳区')]
from addressparser2 import area_map
area_map.get_relational_addrs('鼓楼区')
from addressparser2 import province_area_map
province_area_map.get_relational_addrs(('江苏省', '鼓楼区'))
使用echarts的热力图绘图函数之前需要先用如下命令安装它的依赖(为了减少本模块的体积,所以这些依赖不会被自动安装):
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 addressparser2
addr_df = addressparser2.transform(origin["原始地址"])
processed = pd.concat([origin, addr_df], axis=1)
processed.to_csv("processed.csv", index=False, encoding="utf-8")
from addressparser2 import drawer
drawer.echarts_draw(processed, "echarts.html")
output:
1) processed.csv:1万多地址的省市县提取结果
2)echarts.html:echarts热力图
浏览器打开echarts.html
后:

样本分类绘制函数,通过额外传入一个样本的分类信息,能够在地图上以不同的颜色画出属于不同分类的样本散点图,以下代码以“省”作为类别信息绘制分类散点图(可以看到,属于不同省的样本被以不同的颜色标记了出来,这里以“省”作为分类标准只是举个例子,实际应用中可以选取更加有实际意义的分类指标):
示例draw_demo.py,接上面示例代码:
from addressparser2 import drawer
drawer.echarts_cate_draw(processed, processed["省"], "echarts_cate.html")
浏览器打开输出的echarts_cate.html
后:

Command line usage
支持批量提取地址的省市区信息:
示例cmd_demo.py
python3 -m addressparser2 address_input.csv -o out.csv
usage: python3 -m addressparser2 [-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
表示使用切词
Todo
License
授权协议为 The Apache License 2.0,可免费用做商业用途。请在产品说明中附加addressparser2的链接和授权协议。
Contribute
项目代码还很粗糙,如果大家对代码有所改进,欢迎提交回本项目,在提交之前,注意以下两点:
- 在
tests
添加相应的单元测试 - 使用
python -m pytest
来运行所有单元测试,确保所有单测都是通过的
之后即可提交PR。
Reference