用 MGeo 和 Neo4j 搭建中文地址语义知识图谱
中文地址的表达方式千奇百怪,缩写、省略、别名到处都是。用 Levenshtein 距离或规则清洗去匹配它们,不仅累,准确率也上不去。阿里巴巴开源的 MGeo 模型专门解决这个问题,它基于 BERT 微调,输入一对地址就能给出 0~1 的语义相似度。像'上海徐汇漕溪路 123 号华鑫天地'和'上海市徐汇区漕溪路 123 号 B 栋'这种,得分能到 0.96。
有了这些匹配结果之后,怎么把它们变成可查询、可分析的知识库?我的选择是导入 Neo4j。节点存地址,边存相似关系,图算法的能力正好用来做地址聚类和归一化。下面把整个搭建过程记录下来。
MGeo 部署:镜像拉下来就能跑
阿里提供了 Docker 镜像,在单卡 GPU(比如 4090D)上直接启动就行:
docker run -itd --gpus all \
-p 8888:8888 \
-v /your/workspace:/root/workspace \
registry.aliyuncs.com/mgeo-public/mgeo-inference:latest
容器里自带 Conda 和 Jupyter Notebook,浏览器打开 http://localhost:8888 就能用。不过,官方给的推理脚本放在 /root/推理.py,我习惯先把它拷到 workspace 目录再改,免得误操作:
docker exec -it <container_id> /bin/bash
cp /root/推理.py /root/workspace
然后激活环境运行推理:
conda activate py37testmaas
python /root/workspace/推理.py
你可以在这个脚本里加日志输出、批量处理逻辑,或者把结果导出成 JSON/CSV,方便后面导入图库。
用 MGeo 做地址匹配
模型输出的典型结果长这样:
{
"addr1": "杭州市文三路 369 号",
"addr2": "杭州西湖文三路 369 号智博大厦",
"similarity": 0.93,
"is_match": true
}
超过 0.85 我就认为是'同指'实体。实际处理几万条地址时,两两配对太多了,可以先按城市分区粗略分组,或者用 Elasticsearch 的模糊召回先筛一遍,减少无效比对。
导入 Neo4j:建模与写入
图模型很简单:
- 节点标签
Address,属性:id(唯一ID)、raw_text(原始地址)、city、district、street等。 - 关系类型 ,属性:(相似度)、(来源)、。

