模仿这个代码来写,我以前是把这个代码改成 java 版,然后加入很多我们的业务逻辑,这个代码并不是最完美的:
https://github.com/wzc570738205/smartParsePro我以前做过地址识别这块,当年给拼多多的几十万商家提供了地址解析接口用于快递地址识别(同时识别出姓名、手机号、地址的省市县),以前做过这个接口每天都有上百万调用。
首先,这个功能很坑爹,属于是难以做到完美,只能相对完美,识别也有准确率问题,可能识别错误,因为以下原因:1. 一年内总会有一些地方地名会改变 2. 有些地名有别称 3. 用户填写地址可能会少写省市区中任意几项 4. 用户输入的地址可能有缺漏,比如上海市漏写了市。
我自己做这块是自己模仿上面的 github 代码自己写了一版新的算法,可以实现地址缺漏、地名少字的情况下依然识别。
我给你解释下我的算法原理:
首先一定要建立数据库存储全国所有省市县的名称,以及上级单位,杭州市有个 parent_id 指向浙江省,浙江省的 parent 是全国,必须有个字段记录别名,例如:杭州、杭州市都是同一条记录。
然后针对地址从左到右先匹配省再匹配市再匹配县,匹配过程是从字符串去头 1 个字符、头两个字符,以此类推,在里面 contains 省,然后针对所有匹配出来的省做筛选( github 仓库中的筛选算法), 筛选出匹配的省后要把匹配出省的那个字符串删除,防止极端情况下省名影响到市名的匹配,以此类推继续匹配下级地址。
如果你需要缺省或者缺市的情况下匹配,其实就建立一个 set 作为候选待匹配地址,例如缺省时,匹配市就相当于把全国所有省下面的市都加入这个候选名单。
地址解析是个麻烦活,地址数据必然要不断更新的,如果只是演示或者流量比较小也许可以糊弄下,必然存在地址解析错误的情况,因此一定要针对地址解析错误有相应的处理方式。