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

作者: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地址匠(转载请注明出处)

你可能感兴趣的:(MGeo应用,python,人工智能,深度学习)