作者:Geo地址匠(转载请注明出处)
在处理人员登记信息或者收货地址管理时,总会遇到一个麻烦的问题,就是相同的地址存在各种不同的写法。
例如“紫萱路363号人力社保局”经常被简写成“紫萱路363号市人社局”。
基于规则的方法难以覆盖各种个性化的写法,例如“人力社保局”同样可以被省略成“社保局”。
另外,同一个路名路号下也可能同时有多个不同的POI,而某些情况则会省略掉路号,如“紫萱路市人社局”,因此不能简单地根据路名路号来判断。
而使用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, model_revision='v1.2.0')
print(pipeline_ins(input=inputs))
#{'scores': [0.06451418995857239, 0.9217355251312256, 0.013750357553362846], 'labels': ['partial_match', 'exact_match', 'not_match']}
可以看到这个模型能够正确判断这两条地址是“完全匹配”(exact_match)的。
接下来便是读取excel内容,计算两条地址之间的相似度,最后保存结果。
address_1 | address_2 |
---|---|
紫萱路363号人力社保局 | 紫萱路363号市人社局 |
紫萱路363号人力社保局 | 紫萱路市人社局 |
紫萱路363号人力社保局 | 榆林市榆阳区康安路榆林市第二医院 |
栖霞区仙林街道文枢东路2号商住楼4楼 | 栖霞区文枢东路2号书店 |
创建并保存自动处理脚本process.py:
import numpy as np
import pandas as pd
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
def get_sim(inputs):
task = Tasks.sentence_similarity
model = "damo/mgeo_geographic_entity_alignment_chinese_base"
pipeline_ins = pipeline(task=task, model=model, model_revision='v1.2.0')
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.921736 |
紫萱路363号人力社保局 | 紫萱路市人社局 | exact_match | 0.760133 |
紫萱路363号人力社保局 | 榆林市榆阳区康安路榆林市第二医院 | not_match | 0.998738 |
栖霞区仙林街道文枢东路2号商住楼4楼 | 栖霞区文枢东路2号书店 | partial_match | 0.917727 |
使用测试数据与源代码可以访问: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地址匠(转载请注明出处)