0
点赞
收藏
分享

微信扫一扫

python --cpca(从文本中提取省市区)

杨小羊_ba17 2022-04-13 阅读 47
python

安装

pip install cpca


windows报错的话 c++构建工具补全下动态链接库

pip install cpca-fix(替代)

github

https://github.com/DQinYuan/chinese_province_city_area_mapper

基本功能

本模块中最主要的方法是cpca.transform,该方法可以输入任意的可迭代类型(如list,pandas的Series类型等),然后将其转换为一个DataFrame,下面演示一个最为简单的使用方法:

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

输出的结果为(adcode为官方地址编码):

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

地理小提示:在中国行政区划中,直辖市的区都不是直接挂在直辖市下面的,而是挂在唯一的一个市辖区下面,普通的市下面也会有市辖区,但是普通的市辖区只是 三级行政单位,不像直辖市的市辖区,是二级行政单位 110105

如果你想获知程序是从字符串的哪个位置提取出省市区名的,可以添加一个pos_sensitive=True参数:

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

输出如下:

 省    市    区        地址               adcode     省_pos  市_pos 区_pos
0  上海市  上海市  徐汇区  虹漕路461号58号楼5楼   310104     -1     -1      0
1  福建省  泉州市  洛江区  万安塘西工业区         350504     -1      0      3
2  北京市  市辖区  朝阳区  北苑华贸城            110105     -1     -1      0

其中省_pos,市_pos和区_pos三列大于-1的部分就代表提取的位置。-1则表明这个字段是靠程序推断出来的,或者没能提取出来。

中国的区级行政单位非常的多,经常有重名的情况,比如“北京市朝阳区”和“吉林省长春市朝阳区”,当有上级地址信息的时候,cpca 能够根据上级地址 推断出这是哪个区,但是如果没有上级地址信息,单纯只有一个区名的时候, cpca 就没法推断了,只能随便选一个了, 通过 umap 参数你可以指定这种情况下该选择哪一个:

import cpca
cpca.transform(["朝阳区汉庭酒店大山子店"])
#     省    市    区        地址  adcode
#0  吉林省  长春市  朝阳区  汉庭酒店大山子店  220104
cpca.transform(["朝阳区汉庭酒店大山子店"],umap={"朝阳区":"110105"})
#     省    市    区        地址  adcode
#0  北京市  市辖区  朝阳区  汉庭酒店大山子店  110105

从例子可以看出,umap 字典的 key 是区名,value 是区的 adcode,这里 110105 就是北京市朝阳区的 adcode,具体的 adcode 可以去 全国行政区划查询平台 上查询。
http://xzqh.mca.gov.cn/map

从大段文本中提取多个地址(0.5.5版本新功能)

转为list

import cpca


a = ['广东省揭阳市惠来县沙贝街23号御景园七单元255室j', ]
print(cpca.transform(a).values.tolist()[0])

输出: ['惠来县', '揭阳市', '广东省', '沙贝街23号御景园七单元255室j']

从大段文本中提取多个地址(0.5.5版本新功能):

import cpca
df = cpca.transform_text_with_addrs("分店位于徐汇区虹漕路461号58号楼5楼和泉州市洛江区万安塘西工业区以及南京鼓楼区")
df

结果为(注意 transform_text_with_addrs 获得的数据,“地址”列都是空的):

    省     市     区    地址   adcode
0  上海市  市辖区  徐汇区       310104
1  福建省  泉州市  洛江区       350504
2  江苏省  南京市  鼓楼区       320106

transform_text_with_addrs 还支持和 transform 类似的 index, pos_sensitive 以及 umap 参数

地图绘制

模块中还自带一些简单绘图工具,可以在地图上将上面输出的数据以热力图的形式画出来.

这个工具依赖folium,为了减小本模块的体积,所以并不会预装这个依赖,在使用之前请使用pip install folium .

代码如下:

from cpca import drawer
#df为上一段代码输出的df
drawer.draw_locations(df[cpca._ADCODE], "df.html")

这一段代码运行结束后会在运行代码的当前目录下生成一个df.html文件,用浏览器打开即可看到
绘制好的地图(如果某条数据’省’,'市’或’区’字段有缺,则会忽略该条数据不进行绘制),速度会比较慢,需要耐心等待,绘制的图像如下:

在这里插入图片描述
还有更多的绘图工具请参考Github上的README中大标题为“示例与测试用例”的部分。

https://github.com/DQinYuan/chinese_province_city_area_mapper

举报

相关推荐

0 条评论