如何从一段自然语言中识别地址信息?

2023-09-25 10:50:10 +08:00
 SZhan
最近有一个很折腾人的需求。由于推送过来的原始数据里缺少客户需要的字段,所以就产生了一个需求,需要根据一段工单内容,识别涉及的区域、街道、所属社区。我开发又优化了几版,都达不到客户想要的效果。工单的内容因为是人编写的、无规则的,所以就不知道会在哪里产生地址信息:
例 1:自己是新吴区鸿山街道鸿*苑六二期 xxx 号 xxxx(隐私处理)的住户,想在屋面里面修葺两个小房间,目前就修了一个门框,xx 就直接来拆掉了,但是其他人家都造好了,都已经住进去了,都没有拆。服务对象表示自己家这里有留消防通道,其他人家都没有留。服务对象表示鸿*苑六二期 xxxxxx 号楼十八层的业主(无法具体提供信息,但表示这些楼栋 xxxxx 、xxxx 室都存在该情况),已经造好通水电入住,自己认为处理部门应该一视同仁对待。
例 2:服务对象来电反映目前通*新村 1 号附近有两条流浪狗将自己车辆的保险杠咬坏,拨打 110 反映表示需要 xx 协助 xx 流浪狗。
例子是这样的,地址信息可能随时出现在内容中,有可能会直接有区、街道、社区信息,也可能仅仅只有一个地点(如例 2 ),需要识别出具体地点,再反编地理信息获取所属区、街道、社区。所以就整的很困难。我目前是这样处理的:
先直接查所有的区、街道、社区信息,到工单内容中循环比对匹配是否包含,抓出来明显提到的区、街道、社区(例 1 类似的内容)。如果像例 2 那样内容只提到了一个地点,我的处理是,获取了一批城市的所有 POI 点位(总数几十 w 条,太多了),然后把小区、商场综合体、个体店铺、城市基础设施等一些基础的城市地理 POI 点位去和内容比对 POI 名称是否在内容中包含,但是效果就是识别比对的成功率很低,不知道有没有啥好的解决办法,还是基本上就是无法实现的需求。想向大神门求助!
8661 次点击
所在节点    Java
113 条回复
keepRun
2023-09-25 20:20:38 +08:00
模仿这个代码来写,我以前是把这个代码改成 java 版,然后加入很多我们的业务逻辑,这个代码并不是最完美的: https://github.com/wzc570738205/smartParsePro

我以前做过地址识别这块,当年给拼多多的几十万商家提供了地址解析接口用于快递地址识别(同时识别出姓名、手机号、地址的省市县),以前做过这个接口每天都有上百万调用。
首先,这个功能很坑爹,属于是难以做到完美,只能相对完美,识别也有准确率问题,可能识别错误,因为以下原因:1. 一年内总会有一些地方地名会改变 2. 有些地名有别称 3. 用户填写地址可能会少写省市区中任意几项 4. 用户输入的地址可能有缺漏,比如上海市漏写了市。

我自己做这块是自己模仿上面的 github 代码自己写了一版新的算法,可以实现地址缺漏、地名少字的情况下依然识别。
我给你解释下我的算法原理:
首先一定要建立数据库存储全国所有省市县的名称,以及上级单位,杭州市有个 parent_id 指向浙江省,浙江省的 parent 是全国,必须有个字段记录别名,例如:杭州、杭州市都是同一条记录。
然后针对地址从左到右先匹配省再匹配市再匹配县,匹配过程是从字符串去头 1 个字符、头两个字符,以此类推,在里面 contains 省,然后针对所有匹配出来的省做筛选( github 仓库中的筛选算法), 筛选出匹配的省后要把匹配出省的那个字符串删除,防止极端情况下省名影响到市名的匹配,以此类推继续匹配下级地址。

如果你需要缺省或者缺市的情况下匹配,其实就建立一个 set 作为候选待匹配地址,例如缺省时,匹配市就相当于把全国所有省下面的市都加入这个候选名单。

地址解析是个麻烦活,地址数据必然要不断更新的,如果只是演示或者流量比较小也许可以糊弄下,必然存在地址解析错误的情况,因此一定要针对地址解析错误有相应的处理方式。
Andrue
2023-09-25 20:43:28 +08:00
写个正则然后提供示例给他们,剩下交给对接负责人,如果效果不理想那是预算的问题不是你们技术的问题,要么加钱要么按照模板写
Archeb
2023-09-25 20:50:38 +08:00
这个需求用 ChatGLM-6B 识别起来没什么大问题

“自己是新吴区鸿山街道鸿福苑六二期 5 号 1503 的住户,想在屋面里面修葺两个小房间,目前就修了一个门框,xx 就直接来拆掉了,但是其他人家都造好了,都已经住进去了,都没有拆。服务对象表示自己家这里有留消防通道,其他人家都没有留。服务对象表示鸿福苑六二期 5 号号楼十八层的业主(无法具体提供信息,但表示这些楼栋 2103 、2004 室都存在该情况),已经造好通水电入住,自己认为处理部门应该一视同仁对待。”
以纯 json 格式输出以上这段话中涉及的 "address": string

{
"address": "新吴区鸿山街道鸿福苑六二期 5 号 1503"
}

“服务对象来电反映目前通武新村 1 号附近有两条流浪狗将自己车辆的保险杠咬坏,拨打 110 反映表示需要公安协助处理流浪狗。”
以纯 json 格式输出以上这段话中涉及的 "address": string

{
"address": "通武新村 1 号"
}

“自己是康桥悦然园 1 期业主,小区 9 号楼前的变电站附近将建造垃圾分类房,服务对象表示垃圾房的位置在沙盘上没有,在合同书上规划在 8 号楼附近。反映后,区城管、街道坏卫、街道、消防都认为垃圾分类房位置不合理,要求开发商拆除,但开发商以区城管未下发红头文件为由迟迟不愿拆除。”
以纯 json 格式输出以上这段话中涉及的 "address": string

{
"address": "康桥悦然园 1 期"
}

“服务对象来电反映广益佳苑一期 38 号楼至 0 号楼北侧有业主通为不牵绳,存在安全隐患,服务对象不认可,自己已经反映小区流浪狗的问题,了解到流浪狗是城管负责,目前需要公安同处理业主遛狗不牵绳的问题。”
以纯 json 格式输出以上这段话中涉及的 "address": string

{
"address": "广益佳苑一期"
}
Archeb
2023-09-25 20:53:02 +08:00
不过即使是 6B 也需要 7G 显存的显卡才能跑,响应速度倒是没太大问题。接下来就是用普通的 Geocoding API 就行了。
keepRun
2023-09-25 21:10:28 +08:00
@Archeb 没必要用到人工智能,而且人工智能太耗算力了
keepRun
2023-09-25 21:11:51 +08:00
@Andrue 单个正则无法处理复杂的地址情况,而且即使写出来也会太复杂;写个匹配算法会更清晰易懂,性能也好
iOCZ
2023-09-25 21:16:34 +08:00
@keepRun 这也不行,那也行,咋整?你看看 63 楼这个,你的省市区县地址库根本不够看
keepRun
2023-09-25 21:29:34 +08:00
@iOCZ 可以解决,我说的省市县你不会以为就不包括街道吧,省市县代指三级地址结构,要想四、五级都可以,而且地址可以缺失。
我指出问题有啥不对?你这说话态度能不能好点
lscho
2023-09-25 23:56:39 +08:00
我只能说之前对接过某银行系统,他们直接把全国所有小区名称全部给过来了,大概 100 多万。。。。至于行政区,那就更好处理。

有时候笨办法才是最快的办法。
taihengw
2023-09-26 00:14:27 +08:00
我记得 python 有个库可以做简单的行政地理名称划分,比如你第一个例子中的这种信息可以完整识别出来。但是对于例子 2 这样的不知道有没有什么好办法
kingfalse
2023-09-26 00:19:19 +08:00
我司也是一样的需求,但是提取的是学历这些字段,然后用的阿里 NLP ,结果提取 200 条花了两万块,就苦逼。
nowheremanx
2023-09-26 03:16:05 +08:00
看回复,时代确实变了。以前这种都需要写一大堆正则去匹配,现在直接 AI 完事。
zhongjun96
2023-09-26 08:55:07 +08:00
@brader #54 不一样的,快递接口是从地址上解析省市区街道。这个是从文本中提取地址。
liuzhedash
2023-09-26 09:02:21 +08:00
@keepRun
我前一段做了个自建地理编码的模块,除了分词算法用的 jieba 之外,地址文本的关键词提取思路和这个基本一样。
重点是建立一个和输入数据相关的数据库,比如 LZ 这个是无锡市的,首先就可以从
http://www.stats.gov.cn/sj/tjbz/tjyqhdmhcxhfdm/2022/32/3202.html
把无锡市各个行政区、街道、社区的名字提出来,然后再去找一套 POI 数据,把小区名字提出来,整理成一个数据库。
在分词之后把分出来的候选词代入这个库,匹配出标准的地址描述词。
DIO
2023-09-26 09:03:06 +08:00
顺丰这种行业龙头都没法妥善的解决这个问题。你要跟领导说,要加钱,你的工作重点应该放在收集资料,一些行业大牛的信息说明这点钱打发叫花子都不够,而不是自己哼哧哼哧做。
season8
2023-09-26 09:29:17 +08:00
这个思路不知道行不行:
1. 文本预处理,比如特殊字符,空格、连接符等,避免干扰分词
2. 通过分词,提取地点(街道,社区,区域,城市等,做好类型分类),还可以结合正则匹配
3. 将以上提取到的关键字根据原文索引位置排序
4. 地址组合,比如:连续的是一个地址,多个地址中间往往是不相连的
5. 使用分词关键字 poi 比对
lrzsw2008
2023-09-26 09:39:40 +08:00
直接和领导说能做出来你们可以上市了。
要么就类似淘宝、饿了么之类的,选择框选择省市区等地址。
要么找人工审核
herozzm
2023-09-26 09:49:44 +08:00
顺丰速运小程序中有粘贴地址识别的,感觉挺准的,不知道背后逻辑,好像逃不开 ai 大模型
SZhan
2023-09-26 10:25:14 +08:00
@codehz 大模型这一块的话 如果要做 那么对接成熟的产品是不太可能了诶 得自己搭建然后训练一个
SZhan
2023-09-26 10:27:22 +08:00
@iOCZ #50 这句话也是我一直憋着没法讲出来的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/976864

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX