[MGeo应用]使用Python+AI模型准确拆分Excel中地址的省市区街道

作者:Geo地址匠(转载请注明出处)

在处理人员登记信息或者收货地址管理时,常常需要把地址里的省市区镇拆分出来方便后续分类管理。

例如对于地址“上海市静安区乌鲁木齐中路12号”,单独拆分出“上海市/静安区”。

目前一些基于规则的方法无法覆盖到所有情况,比如:

  • 通过“xx省”“xx市”后缀来找省市区的,当缺少该后缀便无法工作。例如:上海静安华山医院,按照后缀是找不到上海和静安的。
  • 通过字符长度来切割的,例如设置省的长度为3,当遇到长度不同的省市区名称变会出错。例如:内蒙古自治区,按照长度切割,内蒙古会被识别为省,自治区会被识别为市。

我们开源了一个地址AI预训练底座以及一系列下游应用模型MGeo(ModelScope 魔搭社区),可以用来识别地址里面的省市区。

首先需要安装python3.7的环境,没有anaconda的可以直接下载安装python3.7:

conda create -n py37testmaas python=3.7

conda activate py37testmaas

安装相关依赖:

cpu机器:pip install cryptography==3.4.8 tensorflow==1.15.5 torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 openpyxl

gpu机器:pip install cryptography==3.4.8 tensorflow-gpu==1.15.5 torch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 openpyxl

安装modelscope:

pip install "modelscope[nlp]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html

确认下modelscope版本大于等于1.2.0:

pip freeze | grep modelscope

测试下模型是否可用:

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

task = Tasks.token_classification
model = 'damo/mgeo_geographic_elements_tagging_chinese_base'
inputs = '浙江省杭州市余杭区阿里巴巴西溪园区'
pipeline_ins = pipeline(task=task, model=model)
print(pipeline_ins(input=inputs))

#输出 {'output': [{'type': 'prov', 'start': 0, 'end': 3, 'span': '浙江省'}, {'type': 'city', 'start': 3, 'end': 6, 'span': '杭州市'},{'type': 'district', 'start': 6, 'end': 9, 'span': '余杭区'}, {'type': 'poi', 'start': 9, 'end': 17, 'span': '阿里巴巴西溪园区'}]}

可以看到这个模型能将地址里面的省市区街道都拆分出来。剩下的工作便是读取excel内容、识别省市区街道、保存识别结果了。

我们将需要处理的文件保存在test.xlsx里面:

[MGeo应用]使用Python+AI模型准确拆分Excel中地址的省市区街道_第1张图片

创建并保存自动处理脚本process.py:

from modelscope.pipelines import pipeline

from modelscope.utils.constant import Tasks

import pandas as pd



def get_pcdt(inputs):

task = Tasks.token_classification

model = 'damo/mgeo_geographic_elements_tagging_chinese_base'

pipeline_ins = pipeline(task=task, model=model)

res = pipeline_ins(input=inputs)

pcdt = {'prov': '', 'city': '', 'district': '', 'town': ''}

for r in res['output']:

if r['type'] in pcdt:

pcdt[r['type']] = r['span']

return pcdt



df = pd.read_excel('test.xlsx')

total_pcdt = {'prov': [], 'city': [], 'district': [], 'town': []}

for line in df['address']:

res = get_pcdt(line)

for k in res:

total_pcdt[k].append(res[k])

for k in total_pcdt:

df[k] = total_pcdt[k]

df.to_excel('test_out.xlsx', index=False, header=True)

运行process.py:

python process.py

程序自动运行结束后我们从test_out.xlsx可以得到省市区街道的抽取结果:

[MGeo应用]使用Python+AI模型准确拆分Excel中地址的省市区街道_第2张图片

使用测试数据与源代码可以访问MGeoExample/拆分Excel中地址的省市区街道 at main · PhantomGrapes/MGeoExample · GitHub

更多地址信息处理AI模型可以在 ModelScope 魔搭社区找到。

作者:Geo地址匠(转载请注明出处)

你可能感兴趣的:(MGeo应用,python,人工智能,excel,nlp)