作者:Geo地址匠(转载请注明出处)
在处理人员登记信息或者收货地址管理时,总会遇到一个麻烦的问题,就是相同的地址存在各种不同的写法。
例如“紫萱路363号人力社保局”经常被简写成“紫萱路363号市人社局”。
基于规则的方法难以覆盖各种个性化的写法,例如“人力社保局”同样可以被省略成“社保局”。
而使用AI模型,则可以很方便的比较两条地址是否描述同一个地方。
我们开源了一个地址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.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
更多地址信息处理AI模型可以在(ModelScope 魔搭社区)找到。
作者:Geo地址匠(转载请注明出处)