[MGeo应用]使用Python+AI模型比较地址相似度

作者: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_1address_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_1address_2labelscore
紫萱路363号人力社保局紫萱路363号市人社局exact_match0.921736
紫萱路363号人力社保局紫萱路市人社局exact_match0.760133
紫萱路363号人力社保局榆林市榆阳区康安路榆林市第二医院not_match0.998738
栖霞区仙林街道文枢东路2号商住楼4楼栖霞区文枢东路2号书店partial_match0.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地址匠(转载请注明出处)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值