SuperMap地理编码服务特点
优化的中文分词与地址词典
英文是以词为单位,词与词之间用空格隔开,例如“Thank you.” 计算机很容易通过空格来识别 you 是一个单词。而中文是以字为单位,通过字组成的句子来表述意思。例如,“我爱北京天安门”,计算机很难知道“天安门”是一个不能拆分的词,这就需要我们进行分词。
把中文的汉字序列切分成有意义的词的过程,就是中文分词。中文分词的准确与否,直接影响到搜索结果正确性和相关度排序。中文分词是基于词典进行的。地址词典:就是有意义词的集合。
例如,“牡丹江海浪国际机场” ,分词的结果是:“牡丹江/海浪/国际/机场”,为什么不是“牡丹/江” 或 “牡/丹/江”?
SuperMap地址匹配服务采用了最大概率分词法,解决怎么分词的问题。
最大概率分词法的基本思想在于:
所有可能分词组合中各个字的概率之积越大,则更有可能是合理的词语,即A和B同时出现的概率(a*b)越大,越有可能是一个完整的词语。
例如,“应”和“该”两个字的频数分别是20和30,统计库词量为1000,则“应”和“该”的出现频率分别为0.02和0.03;二者一起出现的概率为:0.006,即“应该”这个词的频数不应该低于:“0.006乘以1000”,即6。这样,才能保证“应该”分词的结果是“应该/”,而不是“应/该/”。
五级地址库
SuperMap地址匹配服务后台有详实的地址库数据支撑,该数据采用了五级地址划分:
- 省/直辖市
- 地/市
- 区/县
- 街道/镇
- 小区/园区/村
通过五级地址库划分,可以更准确地匹配地名,为后续快速分组检索提供支撑。
地址库索引分组
按照地理编码的设计预期,如果每次搜索都对全国范围的全部地址库信息进行检索,效率会非常低。
因此,每次搜索只在固定的城市范围内搜索,搜索其他城市地址时,则切换城市。虽然地址库依然会为全国的地址数据创建索引,但是只在城市的范围内进行搜索,可大大提高检索效率,并在一定程度上编码同名地址的问题。
因此,这就需要将地址库索引文件分组,目前按照第二级地址(地/市)划分地址库。
优化city地址分词
SuperMap地址匹配服务,通过address参数传入具体地址信息,通过city参数传递具体访问地址的区域。例如:address=朝阳区酒仙桥北路超图软件&city=北京市。
但是,在实际应用中,address中的分词,仍然可能因为同名地址而出现匹配不精确的问题。例如,全国范围内,地名中有“朝阳”的地址非常多,很容易因为低一级字段的精确匹配而匹配到错误的市、区。
因此,SuperMap地址匹配服务,专门针对city字段进行了分词优化,保证检索地址库的时候,优先匹配到市,确定范围后再匹配区县,以及下一级别地址,避免因同名而导致的检索错误。
也就是说,我们可以传递参数:address=酒仙桥北路超图软件&city=北京市朝阳区,把检索范围,精确到北京市朝阳区内,进一步提高匹配精度。
基于分组索引的地址匹配流程
- 根据city字段传入的城市名,确认地址分组。例如:city=北京市朝阳区,则先确定检索范围为北京市下属的朝阳区,不会再去检索其他区域的数据
- 根据词典库,对address传入的详细地址分词,例如:address=酒仙桥北路超图软件,则确定分词为:酒仙桥/北路/超图/软件
- 读取对应倒排索引文件,获取所有分词的关键字信息
- 将得到的所有关键字信息排序,结果是将来自原始数据同一条记录的关键字排在一起,并且是按照分词的位置先后排列,将所有相关记录逐一打分,分数越高,匹配度越好
- 取出用户指定的前N条分数最高的详细地址记录
地址库的追加更新
SuperMap地址库采用了追加更新机制,包括:
- 追加分组信息到地址分组文件
- 追加地址索引到已有索引文件:
- 倒排索引表追加,合并倒排表
- 地址信息追加
特殊字符的优化与兼容
针对特殊字符,SuperMap地理编码服务做了兼容处理,包括:
- 兼容特殊字符#、|、空格
- 支持批量搜索,一次请求可传入10条地址数据,每条数据在address参数中用英文逗号“,”分隔