在处理人员登记信息或者收货地址管理时,总会遇到一个麻烦的问题,就是相同的地址存在各种不同的写法。
例如“紫萱路363号人力社保局”经常被简写成“紫萱路363号市人社局”。
基于规则的方法难以覆盖各种个性化的写法,例如“人力社保局”同样可以被省略成“社保局”。
~~另外,同一个路名路号下也可能同时有多个不同的POI,而某些情况则会省略掉路号,如“紫萱路市人社局”,因此不能简单地根据路名路号来判断。~~
而使用AI模型,则可以很方便的比较两条地址是否描述同一个地方。
首先需要安装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.sentence_similarity model = 'damo/mgeo_geographic_entity_alignment_chinese_base' inputs = ('紫萱路363号人力社保局', '紫萱路363号市人社局') pipeline_ins = pipeline(task=task, model=model) print(pipeline_ins(input=inputs)) # {'scores': [0.6519672274589539, 0.2855909466743469, 0.062441859394311905], 'labels': ['exact_match', 'not_match', 'partial_match']}
可以看到这个模型能够正确判断这两条地址是“完全匹配”(exact_match)的。
接下来便是读取excel内容,计算两条地址之间的相似度,最后保存结果。
address_1 |
address_2 |
紫萱路363号人力社保局 |
紫萱路363号市人社局 |
联胜路3号期望铭座 |
联胜路3号 |
文化西路9号泰华国际大酒店 |
文化西路酒店 |
创建并保存自动处理脚本process.py:
from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks import pandas as pd import numpy as np def get_sim(inputs): task = Tasks.sentence_similarity model = 'damo/mgeo_geographic_entity_alignment_chinese_base' pipeline_ins = pipeline(task=task, model=model) res = pipeline_ins(input=inputs) sim_label = res['labels'][np.argmax(res['scores'])] sim_score = res['scores'][np.argmax(res['scores'])] return sim_label, sim_score df = pd.read_excel('test.xlsx') total_res = {'label': [], 'score': []} for address_1, address_2 in zip(df['address_1'], df['address_2']): inputs = (address_1, address_2) sim_label, sim_score = get_sim(inputs) total_res['label'].append(sim_label) total_res['score'].append(sim_score) for k in total_res: df[k] = total_res[k] df.to_excel('test_out.xlsx', index=False, header=True)
运行process.py:python process.py
程序自动运行结束后我们从test_out.xlsx可以得到省市区街道的抽取结果:
address_1 |
address_2 |
label |
score |
紫萱路363号人力社保局 |
紫萱路363号市人社局 |
exact_match |
0.651967 |
联胜路3号期望铭座 |
联胜路3号 |
exact_match |
0.859978 |
文化西路9号泰华国际大酒店 |
文化西路酒店 |
partial_match |
0.97964 |
使用测试数据与源代码可以访问:https://github.com/PhantomGrapes/MGeoExample/tree/main/%E5%9C%B0%E5%9D%80%E7%9B%B8%E4%BC%BC%E5%BA%A6%E5%88%A4%E6%96%AD