目录
简介:本文介绍用Python编程,实现对物流地址的拆分及补全。在快递物流中会用到这种技术。
在TDS地图可视化项目中,我们获取了非常详细的安装地址。但在地图展示上,我们还想把它分解到具体的省、市、区(县)。
几十万条数据,用手工肯定不现实。该如何实现?
第一反应是Excel截取两个指定字符间的字符,例如截取省市之间的字符。但这种方法会存在问题,因为我们地址的格式非标准化,有填得好的,省市区等等都有信息,有填的差的,缺那么一部分。数据质量并不是那么的好,例如下面一些地址:
广东省龙华区龙华街道清湖花半里花园
兰山区柳青街道柳青街道万城花开
贵阳市白云区艳山红社区旭辉观云
兴宁区三塘镇广西南宁市兴宁区三塘镇昆仑大道995号嘉和城白鹭南山
湘阴县六塘乡茶木村八组
得换一个方法。我联想到的是我们寄快递的时候,输入一个地址,系统自动实现了分割。于是我去查了下,网上有这种服务。这个技术并不难,但是要收费。
为了省点钱,只好自己写代码解决。这次我用Python并借助第三方库jionlp来实现。
jionlp是一个中文NLP(Natural Language Processing,自然语言处理)预处理、解析工具包。
首先用pip安装jionlp
建议用下面这个镜像网站下载,速度很快。
pip install jionlp -i https://pypi.douban.com/simple/
安装截图:
现在我们来试下:
1.提取省市区信息
# -*- coding:utf-8 -*-
#王永平 2022.6.15
import jionlp as jio
#测试地址
raw_addres = [
'广东深圳市龙华区龙华街道清湖花半里花园',
'山东省临沂市兰山区柳青街道柳青街道万城花开',
'贵州省贵阳市白云区艳山红社区旭辉观云',
'广西壮族自治区南宁市兴宁区三塘镇广西南宁市兴宁区三塘镇昆仑大道995号嘉和城白鹭南山',
'湖南岳阳市湘阴县六塘乡茶木村八组'
]
for i in range(5):
#解析地址信息
result=jio.parse_location(raw_addres[i])
print("------地址:"+str(i+1)+"------")
#输出省
print(result['province'])
#输出市
print(result['city'])
#输出区、县
print(result['county'])
运行结果:
2.提取街镇乡、村或居委会信息
设置参数town_village=True,可以额外尝试提取出街镇乡、村或居委会信息等级别的信息字段。注意这个是尝试提取,不一定能提出出来。还是刚刚的那些数据。我们试下:
# -*- coding:utf-8 -*-
#王永平 2022.6.15
import jionlp as jio
#测试地址
raw_addres = [
'广东深圳市龙华区龙华街道清湖花半里花园',
'山东省临沂市兰山区柳青街道柳青街道万城花开',
'贵州省贵阳市白云区艳山红社区旭辉观云',
'广西壮族自治区南宁市兴宁区三塘镇广西南宁市兴宁区三塘镇昆仑大道995号嘉和城白鹭南山',
'湖南岳阳市湘阴县六塘乡茶木村八组'
]
for i in range(5):
#解析地址信息
result=jio.parse_location(raw_addres[i],town_village=True)
print("------地址:"+str(i+1)+"------")
#输出省
print(result['province'])
#输出市
print(result['city'])
#输出区、县
print(result['county'])
#输出镇
print(result['town'])
#输出村
print(result['village'])
运行结果:
可见基本上村是没有提取出来的,镇这个级别还有可能提取出来。但对于我这个项目来说,只需要定位到区、县就足够了。
3.自动补全省市信息
很多时候,我们的录单没有很规范,有些地址填的不全,这给我们处理带来了一些麻烦。这时我们可以尝试进行省市的补全:
# -*- coding:utf-8 -*-
#王永平 2022.6.15
import jionlp as jio
#测试地址,部分省市信息是不全的
raw_addres = [
'广东省龙华区龙华街道清湖花半里花园',
'兰山区柳青街道柳青街道万城花开',
'贵阳市白云区艳山红社区旭辉观云',
'兴宁区三塘镇广西南宁市兴宁区三塘镇昆仑大道995号嘉和城白鹭南山',
'湘阴县六塘乡茶木村八组'
]
for i in range(5):
#解析地址信息
result=jio.parse_location(raw_addres[i])
print("------地址:"+str(i+1)+"------")
#输出补全后的地址信息
print(result['full_location'])
运行后,地址自动补全:
一般来说,有定位到省,或者定位到市,相对来说就能自动补全而不出错。因为全国有很多地方可能存在相同名字的区,所以最好能够定位一下到省或者市,不然就可能补全得不对,补到其他省市去了。
幸运的是,我们的原始数据里,省的信息还是有的,这给自动补全带来了极大方便。
利用这种方法,我们就实现了地址的分割,将TDS与省、市、区、县,甚至下面的镇、村对应起来。