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

226 天前
 SZhan
最近有一个很折腾人的需求。由于推送过来的原始数据里缺少客户需要的字段,所以就产生了一个需求,需要根据一段工单内容,识别涉及的区域、街道、所属社区。我开发又优化了几版,都达不到客户想要的效果。工单的内容因为是人编写的、无规则的,所以就不知道会在哪里产生地址信息:
例 1:自己是新吴区鸿山街道鸿*苑六二期 xxx 号 xxxx(隐私处理)的住户,想在屋面里面修葺两个小房间,目前就修了一个门框,xx 就直接来拆掉了,但是其他人家都造好了,都已经住进去了,都没有拆。服务对象表示自己家这里有留消防通道,其他人家都没有留。服务对象表示鸿*苑六二期 xxxxxx 号楼十八层的业主(无法具体提供信息,但表示这些楼栋 xxxxx 、xxxx 室都存在该情况),已经造好通水电入住,自己认为处理部门应该一视同仁对待。
例 2:服务对象来电反映目前通*新村 1 号附近有两条流浪狗将自己车辆的保险杠咬坏,拨打 110 反映表示需要 xx 协助 xx 流浪狗。
例子是这样的,地址信息可能随时出现在内容中,有可能会直接有区、街道、社区信息,也可能仅仅只有一个地点(如例 2 ),需要识别出具体地点,再反编地理信息获取所属区、街道、社区。所以就整的很困难。我目前是这样处理的:
先直接查所有的区、街道、社区信息,到工单内容中循环比对匹配是否包含,抓出来明显提到的区、街道、社区(例 1 类似的内容)。如果像例 2 那样内容只提到了一个地点,我的处理是,获取了一批城市的所有 POI 点位(总数几十 w 条,太多了),然后把小区、商场综合体、个体店铺、城市基础设施等一些基础的城市地理 POI 点位去和内容比对 POI 名称是否在内容中包含,但是效果就是识别比对的成功率很低,不知道有没有啥好的解决办法,还是基本上就是无法实现的需求。想向大神门求助!
7590 次点击
所在节点    Java
113 条回复
libaili
226 天前
用 chatgpt 试试?
bybyte
226 天前
1.chatgpt 结合 prompt
2.自己生成数据和标签,训练一个 nlp 模型
SZhan
226 天前
@libaili 有想过,但是用在政府项目上似乎不太合适 ,我一直觉得这种需求就是无理需求,奈何就是一群难搞的政府领导
iv2ex
226 天前
原始数据不是 你们平台产生的吗
SZhan
226 天前
@iv2ex 原始数据不是的,是工单受理平台推送过来的,所以就不包含区域、街道、社区。尝试去对接,对方说没有,所以客户就要求我们去内容中做识别,他们也不想用自己的人去做人工匹配
ho121
226 天前
印象中高德地图百度地图有这样的服务
SZhan
226 天前
@bybyte 第一种做不到呢,服务器、网络环境都是在政务网。然后第二种方案,我去了解看看。所以说,这一块对于 Java 语言来说,基本上是做不到的对吧
lopssh
226 天前
这不就是 NLP 里头的"实体识别"么?
zyxk
226 天前
难道这个不应该让受理平台直接登记上吗? 像例 2 ,即使你程序能识别到 *新村 1 号, 也可能本地有多个这样的地址,即使人工也不知道是哪个地址,机器怎么识别出来。
SZhan
226 天前
@ho121 嗯嗯,我第一时间去翻过他们的文档的,高德百度是对一个地址进行地理编码,根据经纬度返回信息或者根据地址进行标准化地址的查询。如果说把这样一段话丢进去让他们识别的话,就整不出来了
jetflyL
226 天前
百度的有识别地址的接口,但是价格那些就 不清楚了,https://ai.baidu.com/tech/nlp_apply/address?_=1695611454087 ,登录后有个试用的输入框,可以粘贴你的文本测试下效果
aaramsiconm1
226 天前
命名实体识别算法( NER )是一种自然语言处理技术,用于从文本中识别出具有特定意义的实体,如人名、组织机构、地名、时间、日期等。 命名实体识别算法旨在自动化地识别文本中的实体,以便进行更高级的文本分析和信息提取
SZhan
226 天前
@zyxk 是的呀,这个问题那肯定是的,同样的地点,在全市内是肯定会有多个重名的,我目前的匹配逻辑里已经有这个问题的,所以我这样的情况只能通过区(如果有)去筛掉,然后剩下的 list.get(0)... 受理平台去跟他们对接,他们说这玩意也做不到,他们没有这个字段。
SZhan
226 天前
@jetflyL 我去看下哈
jetflyL
226 天前
registerrr
226 天前
ME:
"自己是新吴区鸿山街道鸿*苑六二期 xxx 号 xxxx(隐私处理)的住户,想在屋面里面修葺两个小房间,目前就修了一个门框,xx 就直接来拆掉了,但是其他人家都造好了,都已经住进去了,都没有拆。服务对象表示自己家这里有留消防通道,其他人家都没有留。服务对象表示鸿*苑六二期 xxxxxx 号楼十八层的业主(无法具体提供信息,但表示这些楼栋 xxxxx 、xxxx 室都存在该情况),已经造好通水电入住,自己认为处理部门应该一视同仁对待。" 这段话中存在几个地址,帮我列出来
ChatGPT:
在提供的文本中,存在以下地址信息:
自己是新吴区鸿山街道鸿*苑六二期的住户。
鸿*苑六二期 xxx 号楼(具体的房号已经隐私处理)。
鸿*苑六二期 xxxxxx 号楼十八层的业主(具体的房号已经隐私处理)。
请注意,由于隐私处理,某些地址的具体细节已经被替换成了"xxx"或进行了隐私保护处理。
registerrr
226 天前
ME:
只把地址列出来

ChatGPT:
以下是文本中列出的地址信息:
1. 新吴区鸿山街道鸿*苑六二期
2. 鸿*苑六二期 xxx 号
3. 鸿*苑六二期 xxxxxx 号楼十八层(具体的房号已经隐私处理)
hldnpqzzy
226 天前
LBS 和 NER 结合的需求
看看高德有没有地址解析能力,没有的话看看阿里云腾讯云的 NER 能力是否符合
你刚刚说的召回全城市的 POI 太多了,试着用 GeoHash6 之类的方法缩减一下
https://lbs.amap.com/product/smart-address 高德这里有地址抽取能力 应该是你说的那个
SZhan
226 天前
@jetflyL #15 其实还是不太稳定的呢
zjuster
226 天前
@SZhan

这个思路没问题,但是在调用此接口之前,你需要用 NER (命名实体识别)的技术,讲文本中的地址、街道分离,然后通过不同层级的地址(城市、道路名称、小区名称等等)来做一个概率匹配,最后得到 1-3 条候选方案(可以打分)。

最后用这几条结果去尝试高德/百度地图的地址接口来获得反馈,能帮你再处理一次。 (但如果是大规模应用的话,接口可能是要收费的)。

当然,命名实体识别,需要你首选有一套国内的地址库(省份、城市、区(县)、街道(乡/村)、社区、小区)这样的一个层级的地址,然后在此基础上做一个别名的语料库(比如黔、京、沪)。
之前做这个行业的时候,也一直没有找到特别官方的数据库,是自己捞了一份数据再请外包清洗的。这个数据还要更新,也是有点点维护成本。比较麻烦的是两个字的重复。(比如杭州有湖州街、上海有河南街),所以在你请求的时候,一定是要有预警( context )限制的。(我们当时是用的图谱,每个实体都是有类型限制的)

------
再补充一下,百度搜索、夸克搜索 这两个平台,内部都做过我上面整个过程的业务的(地址栏搜地址,给出地图卡片),但不清楚是否对外开放商用接口,理论上是有的。

你可以模拟下用户访问 query 查询这两个网站的 web 端测试一下。

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

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

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

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

© 2021 V2EX