用户填的地址要转成坐标,这一步做得粗后面全都偏
用户填某某路某某号,系统要把它变成坐标,才能算距离、画地图。这一步做得粗,后面所有位置都跟着偏,偏了还不容易发现,因为界面上看着挺正常。一、地址本身就不规范
同一个地方,有人写路名有人写小区名,有人加附近两个字,有人写错一个字。直接拿去做匹配,匹配不上很正常,正常到大家都以为这是常态。清洗的时候还要处理全角半角、繁简、数字写法,一个门牌号写成两种样子,匹配结果可能差出两条街。做的人要下去看几条真实地址,坐在办公室看样例,看不出真实数据有多乱,乱的地方往往就藏在那几条里,看一眼比开三次会管用。
先做清洗,去掉多余的空格和括号,把附近、对面这类词去掉,剩下的再去匹配。清洗做得好,命中率能上去一截,而且不用改别的东西。这套东西的效果要定期抽样核,抽一百条人工看,看完算个比例,比凭感觉强,感觉这东西在数据上从来不靠谱,靠谱的只有抽出来的那一百条。
二、分级匹配
先按完整地址匹配,匹配不到退到路名,再退到区域。一级一级退,命中率能上去不少,代价是精度一级一级往下掉。分级匹配的每一级都要留痕,只留结果本身,出了问题没法判断是清洗错了还是匹配错了,两种改法完全不同。上线分批放,先放一个业务线,跑顺了再放第二个,一起放,出了问题分不清是哪边带进来的,排查要多花一倍时间,多花的时间还没人算进排期。
退到哪一级要记下来。只匹配到区域,坐标就只能给到区域中心,误差几公里,不能当门牌位置用,用了就会把人导到别的地方。清洗规则要能改,规则写死在代码里,业务一变就得发版,发版要排期,排期那几天新地址全堆着进不来,堆到后来只能人工补,人工补很容易错。
三、给一个可信度
匹配结果要带可信度。可信度低的,让用户在地图上确认一下,确认过的存下来,下次直接用,省得每次都确认。可信度低的那些,除了让用户确认,还可以按区域批量确认,同一栋楼的人填的地址差不多,确认一次能覆盖一批。这块要有个兜底入口,自动匹配失败的让用户自己在地图上点,点完存起来,比反复优化匹配规则见效快。
确认这一步别省。省了,用户看到的地图位置是错的,还会以为自己填错了,改来改去也改不对,末了干脆不填。外部服务要留备用,一家出问题能切另一家,切的时候格式要先对齐,没对齐就切,切过去全是解析失败,失败之后还要一条条回滚,回滚比重跑还慢。
四、批量导入
一次导入几千条地址,不能一条条等。做成任务,跑完给一份结果,失败的单独列出来重试,重试之前先看一眼失败原因。这类问题排查要按层来,先看数据源,再看转换,再看展示,一层层排,比到处改快得多,到处改的结果是问题挪了位置,还没解决,挪一次又要重新查一遍。
失败的原因要分类:地址不存在、匹配到多个、格式看不懂。分类之后才好批量处理,混在一起只能一条条看,看几百条就没人愿意干了。调用量要算成本,一次调用几分钱,量大了一年也是一笔钱,算清楚再决定调多细,调得太细,钱花在没人在意的地方,该粗的地方反而舍不得。
五、结果要能改
匹配错了要能改,改完存一份修正记录,下次同样的地址优先用修正过的。修正记录攒起来就是一份本地词典。
这份词典比通用数据更贴合这个场景,越用越准,准到后来,新来的地址大部分都能直接命中,人工只处理少数几个。结果要能导出,业务那边要拿去做分析,导不出来就得手工抄,手工抄的东西没法复核,错了也没人知道,等发现的时候报表已经发出去两周了。
六、别追求一步到位
一开始命中率低是正常的,先把能匹配上的做准,匹配不上的走人工,人工处理过的反哺回来,几轮之后就稳定了。
指望一次做完,往往会做成一个谁都不敢改的黑盒,出了问题只能整个重来,重来一次又是几个月。这块的准确程度要写在说明里,写清楚只能到哪一级,别让人以为能到门牌,以为能到门牌,用起来就会出事,出了事还得解释为什么当初没说清。
地址转坐标是脏活,但它决定了后面所有位置的对错。这一层扎实,上面才稳,这一层糊弄,上面做得再花也是白搭。 对这个话题有了更全面的认识,不再只停留在表面理解。
页:
[1]