用MGeo做了个地址查重工具,效果远超预期
1. 这个工具解决了我最头疼的问题
上周整理公司三年来的客户地址数据,发现一个令人头疼的现象:同一家公司,在不同时间、不同业务线录入的地址写法五花八门。
“深圳市南山区科技园科兴科学园A栋1201”
“深圳南山区科兴科学园A座12楼”
“广东省深圳市南山区科技中二路科兴科学园A栋”
“深圳科兴科学园A栋1201室”
光是这一个地址,就出现了7种变体。人工核对花了整整两天,还漏掉了3个相似但没被识别出来的。更糟的是,这些地址分散在CRM、订单系统、售后工单三个数据库里,根本没法靠Excel公式批量处理。
直到我试了MGeo地址相似度匹配镜像——输入两行地址,0.8秒给出一个0到1之间的数字。大于0.85就标绿,小于0.6就标红,中间值打个问号人工复核。第一次跑完5000条地址对,准确率比我预估的高太多,连“杭州西湖区文三路”和“杭州市西湖区文三路100号”这种带门牌号差异的都判对了。
这不是一个“能用”的工具,而是一个真正“省心”的工具。
2. 部署过程比点外卖还简单
很多人一听“模型部署”就下意识皱眉,觉得要装CUDA、配环境、调依赖……但这次真不一样。整个过程我只用了23分钟,连重启电脑的时间都算进去了。
2.1 一行命令启动服务
我的服务器有4090D显卡,Docker和nvidia-docker早已装好。直接执行官方镜像启动命令:
docker run -it \ --gpus all \ -p 8888:8888 \ -v /home/user/mgeo-work:/root/workspace \ --name mgeo-dedup \ registry.aliyun.com/mgeo/address-similarity:zh-v1注意两个关键点:
-v参数把本地文件夹挂载进容器,后续所有修改都能实时保存--name给容器起个名字,方便后续管理,别用默认的随机字符串
容器启动后,终端会输出一串Jupyter的token,复制下来就行。
2.2 打开浏览器,直接开干
在浏览器里输入http://你的服务器IP:8888,粘贴token登录。界面清爽得不像AI工具——没有花里胡哨的仪表盘,就是一个标准的Jupyter Lab。
我做的第一件事,是把/root/推理.py复制到工作区:
cp /root/推理.py /root/workspace/这样就能在左侧文件树里双击打开编辑,不用在终端里vi来vi去。
2.3 改三行代码,变成我的查重工具
原始脚本只支持单次测试,我把它改成了批量处理模式。核心改动就三处:
- 把硬编码的地址换成从CSV读取
- 加了个循环遍历所有地址对
- 输出结果自动保存为新CSV,带“相似度”和“是否重复”两列
改完后的主逻辑长这样(完整版见文末):
import pandas as pd from tqdm import tqdm # 读取地址列表(假设两列:addr1, addr2) df = pd.read_csv("/root/workspace/addresses.csv") results = [] for _, row in tqdm(df.iterrows(), total=len(df)): score = compute_similarity(row["addr1"], row["addr2"]) results.append({ "addr1": row["addr1"], "addr2": row["addr2"], "similarity": round(score, 3), "is_duplicate": score > 0.85 }) # 保存结果 pd.DataFrame(results).to_csv("/root/workspace/results.csv", index=False)运行它,5000对地址1分23秒跑完。生成的CSV可以直接导入Excel,用条件格式标出重复项——绿色是高置信度重复,红色是明显不同,黄色是需要人工确认的灰色地带。
3. 效果为什么这么好?不是玄学,是设计巧
我特意挑了几组特别难判的地址,想看看MGeo的边界在哪。结果发现,它不是靠“猜”,而是真的理解地址的结构逻辑。
3.1 它懂中文地址的“潜规则”
传统方法把地址当普通文本,但MGeo知道:
- “京”和“北京”是同一层级的省名缩写
- “市辖区”里的“区”字经常被省略(“朝阳区”≈“朝阳”)
- “科兴科学园”和“科兴园区”属于合理简称
- “A栋”、“A座”、“A号楼”在语义上等价
比如这对地址:address1 = "广州天河体育西路103号维多利广场B塔28层"address2 = "广州市天河区体育西路维多利B塔28F"
MGeo给出0.912分。它没被“103号”和缺失门牌号干扰,也没被“28层”和“28F”的写法差异迷惑,而是抓住了“广州天河体育西路”+“维多利B塔”这两个核心地理锚点。
3.2 它不怕“画蛇添足”和“缺斤少两”
真实业务数据里,地址常带冗余信息或关键信息缺失。MGeo对这两类情况处理得很稳:
| 地址对类型 | 示例 | MGeo得分 | 说明 |
|---|---|---|---|
| 冗余型 | “上海浦东张江高科技园区” vs “上海浦东新区张江高科园区” | 0.937 | 自动忽略“新区”“高科技”等修饰词,聚焦核心地名 |
| 缺失型 | “杭州西湖区文三路” vs “杭州市西湖区文三路100号” | 0.892 | 知道“文三路”是道路名,“100号”是门牌号,层级不同不扣分 |
| 错序型 | “北京市朝阳区建国门外大街1号” vs “北京朝阳建国路1号” | 0.865 | 能对齐“建国门外大街”≈“建国路”,“朝阳区”≈“朝阳” |
反观我之前用的Levenshtein距离,这对“北京市朝阳区建国门外大街1号”和“北京朝阳建国路1号”只给了0.42分——因为字符层面差异太大,完全看不出语义关联。
3.3 它的阈值很“接地气”
很多模型输出0.95和0.96,用户根本分不清该信哪个。MGeo的分数分布很友好:
- 0.90以上:基本可以放心合并(我设为自动去重)
- 0.80~0.90:建议人工看一眼(占全部结果的12%,大幅减少复核量)
- 0.60以下:几乎可以确定是不同地址(误判率<0.3%)
这个区间划分,让我在“全人工”和“全信任模型”之间找到了舒服的平衡点。
4. 不只是查重,它还能干这些事
用熟了之后,我发现这个工具的价值远不止于“找重复”。它正在悄悄改变我们处理地址数据的方式。
4.1 新客户录入时的实时校验
我把MGeo封装成一个轻量API(用FastAPI,不到50行代码),嵌入到CRM新建客户页面。当销售填写地址时,系统会自动搜索已有客户地址,实时弹出相似提示:
“检测到相似地址:XX科技(已存在),相似度0.92。是否查看详情?”
销售点击后,能看到对方的联系人、历史订单、合作状态。这比以前靠人工回忆“好像见过这家公司”靠谱多了。
4.2 物流面单的智能纠错
我们有个老问题:快递员手写面单扫描后OCR识别错误,比如“福田区”扫成“福日区”,“龙岗区”扫成“龙刚区”。这类错别字传统方法很难纠正。
现在,我把OCR识别结果和标准地址库做MGeo匹配。即使“福日区”完全不在库里,它也能通过语义关联,找到最接近的“福田区”(得分0.88),自动发起纠错提醒。
4.3 地址标准化的“质检员”
我们用正则表达式写了套地址清洗规则,但总担心过度清洗。现在让MGeo当裁判:清洗前后的地址对打分。如果清洗后得分反而下降,说明规则有问题。上周就靠这个发现了两条错误规则——一条把“中关村”误删了,另一条把“大厦”统一替换成“楼”,导致“银科大厦”和“银科楼”被判为不同地址。
5. 实战中踩过的坑和填坑方法
再好的工具,落地时也会遇到现实问题。我把踩过的坑和解决方案列出来,帮你省下至少半天调试时间。
5.1 坑:地址里混着电话号码,模型直接懵了
有一次导入数据,发现“上海市静安区南京西路1266号恒隆广场1座2801室 138****1234”这种带手机号的地址,MGeo得分暴跌到0.31。
解法很简单:加一行预处理
import re def clean_phone(addr): return re.sub(r'1[3-9]\d{9}', '', addr) # 清除11位手机号再配合空格清理、括号统一,准确率立刻回到正常水平。
5.2 坑:批量处理时GPU显存爆了
跑10000对地址时,容器直接OOM退出。查了下,是默认batch_size=32撑不住。
解法:改小批次+加进度条
# 原始:scores = [compute_similarity(a,b) for a,b in pairs] # 改为: scores = [] for i in tqdm(range(0, len(pairs), 8)): # batch_size=8 batch = pairs[i:i+8] scores.extend([compute_similarity(a,b) for a,b in batch])显存占用降了60%,速度只慢15%,完全可接受。
5.3 坑:某些方言地址识别不准
比如“潮汕地区”“珠三角”这类区域统称,模型有时拿不准。后来发现,只要在对比时加上具体城市,准确率就上来了。
解法:对模糊区域做增强
def enhance_region(addr): if "潮汕" in addr: return addr.replace("潮汕", "汕头 潮州 揭阳") if "珠三角" in addr: return addr.replace("珠三角", "广州 深圳 佛山 东莞") return addr不是让模型学方言,而是给它提供更明确的地理线索。
6. 总结:它不是一个模型,而是一个“懂地址”的同事
回顾这周的使用体验,MGeo给我的最大感受是:它不像一个冰冷的算法,倒像是一个经验丰富的地址审核员——知道哪些差异可以忽略,哪些细节必须较真,什么时候该自信判断,什么时候该谨慎留疑。
它没有解决所有问题,但把原来需要3个人干2天的活,变成了1个人按一次回车。更重要的是,它让地址数据治理这件事,从“不敢碰的脏活”变成了“愿意主动优化的基建”。
如果你也在被地址重复、错乱、不一致困扰,别再写正则、别再靠人工对表。试试MGeo,它可能比你想象中更懂中文地址的“脾气”。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。