Python-精准提取行政区省市区

对于下表所示的地址序列(pd.Series),提取出每个元素的省市区,并单独生成列。

山东省济宁市邹城市孟子大道前韩村东北991米
湖北省恩施土家族苗族自治州宣恩县G6911(安来高速)酸枣坪北526米
广东省惠州市惠城区S120(龙和路)
湖南省邵阳市大祥区G60(潭邵高速)

湖南省衡阳市衡南县兴中成不锈钢衡南县总代理西120米

需要采用的是Python里的jieba包,jieba包的安装可以在连网的情况下使用以下代码

pip install jieba

由于jieba包自身的词库对行政区的掌握不充分,而且可能在处理过程中,一些名词较长的地址无法提取,比如“ 贵州省黔东南苗族侗族自治州黎平县”。安装好后,先导入用于行政区分词的词库。最准确的行政区词库就在国家民政部的网站上:

http://www.mca.gov.cn/article/sj/xzqh/2019/;

选取最新的一份中华人民共和国县以上行政区划代码就好了,将其中的行政区名称整理成utf-8为编码的txt格式的文件,作者整理好的文件如下:

https://download.csdn.net/download/lztttao/12109668;

接下来到jieba包的目录下,如果是Anaconda上的Python,到达D:\software\Anaconda\Lib\site-packages\jieba-0.41\jieba,然后编辑目录下的dict.txt(注意备份!!!),只保留文件的前几行内容,如

AT&T 3 nz
B超 3 n
c# 3 nz
C# 3 nz

其余的都删除,这样做的目的是避免内置词典干扰精确分词,但是dict.txt既不能删除又不能为空,不然会报错,所以保留几行就好了,分词后可以还原词典的备份。

接下来加载jieba包并加载行政区分词库,

import jieba
jieba.load_userdict('全国行政区划分词库.txt')

首先查看一下数据格式。

sample
193013            湖南省衡阳市耒阳市G4(京港澳高速)长冲口西263米
1470071            广东省广州市从化市G45(中和里立交)围岭北362米
1379584                 广东省广州市白云区G15(北村2号特大桥)
2568223         江苏省盐城市射阳县S226(运棉河桥)战备河桥西北276米
2179824                    广东省潮州市湘桥区S335(凤东路)
1903739           江西省赣州市赣县G6011(兴赣高速)洞内东北363米
1039791                     广东省清远市连州市水吊岭东487米
2464602                福建省莆田市荔城区莆涵大道濠浦村东北240米
1902917                广东省河源市龙川县东风西路隆南村西南102米
2644805               江苏省苏州市常熟市G204辅路白茆镇东309米
1403781         广东省清远市英德市云岭路翡翠银湾内,汽车美容中心附近10米
1357165                   广东省清远市英德市G4W3(乐广高速)
501421            广西壮族自治区北海市银海区银滩大道溢盛园林西北105米
1911503             江西省宜春市奉新县S40(昌铜高速)新村南533米
9142           西藏自治区拉萨市当雄县G109(青藏公路)拉多村东北446米
2037916                        江西省南昌市南昌县天祥北大道
2733756    吉林省长春市德惠市G102(京哈线)吉林达利食品有限公司东南214米
58891                            云南省昆明市五华区北三环
2019132                     安徽省六安市霍邱县马庄西北210米
2315685                     福建省三明市大田县上城西南439米
Name: address, dtype: object

然后对给序列分词

address = sample.apply(lambda x: jieba.lcut(x)[0:3])
address = pd.DataFrame(list(address)).rename(columns={0:'省', 1:'市', 2:'区'})
bool_of_zxs = (address.省 == '北京市') | (address.省 == '天津市') | (address.省 == '重庆市') | (address.省 == '上海市' )
address.loc[bool_of_zxs, '区'] = address.loc[bool_of_zxs, '市']
address.loc[bool_of_zxs, '市'] = address.loc[bool_of_zxs, '省']
address
	省	市	区
0	湖南省	衡阳市	耒阳市
1	广东省	广州市	从化市
2	广东省	广州市	白云区
3	江苏省	盐城市	射阳县
4	广东省	潮州市	湘桥区
5	江西省	赣州市	赣县
6	广东省	清远市	连州市
7	福建省	莆田市	荔城区
8	广东省	河源市	龙川县
9	江苏省	苏州市	常熟市
10	广东省	清远市	英德市
11	广东省	清远市	英德市
12	广西壮族自治区	北海市	银海区
13	江西省	宜春市	奉新县
14	西藏自治区	拉萨市	当雄县
15	江西省	南昌市	南昌县
16	吉林省	长春市	德惠市
17	云南省	昆明市	五华区
18	安徽省	六安市	霍邱县
19	福建省	三明市	大田县

如果切割不精准,可能是因为数据的地址标准不符合国家民政局的标准,或者是因为jieba包的内置词典在起作用,需要到C:\Users\Admin\AppData\Local\Temp下删除jieba.cache,然后重启Python。

你可能感兴趣的:(Python)