地理编码是地图中重要的一个功能,它将文本的地址信息转换为经纬度坐标。本质上和POI搜索是一样的流程, 切词后根据倒排索引去数据库中寻找最相似的POI,返回POI位置信息。
通用方法
- 分词:中文可使用jieba分词,计算每个单词的tf/idf。尽量以关键词作为倒排索引的查询条件。
- 倒排索引:使用分词后的单词去数据库中查询对应的倒排索引,找到相关的POI。
- 计算相似度。简单的方法可将分词结果转换为单词向量,和数据库中POI单词向量计算余弦距离得到其相似度。其他最长公共子串、最长公共子序列、编辑距离、汉明距离等计算相似性的方法也可以参考。实际上,搜索引擎中计算相关性的方法也可以参考。如果有用户反馈,可根据用户反馈建立机器学习模型。
地址解析
地理编码一般是对空间中的地址信息进行查询,使用通用的搜索方法没有利用到地址的空间信息,比如国家、省份、城市、街道等,这些信息是可以从输入的地址中解析出来的。有了这些行政空间信息,就可以更好的判断相关性。地址解析的方法一般有三类:
- 基于规则:根据国家习惯的地址命名方式寻找国家、省份、城市、区县、道路等,一般会定义正则表达式来提取。
- 基于词典:预先组织好一个地理地址词典,使用该词典去匹配相应的地址信息。在分词时候使用字典最大匹配的方法。
- 基于序列标注:使用机器学习的方法给单词标注,标注为国家名、省份名等等。常用的方法有隐马尔可夫链、CRF、循环神经网络等等。
基于规则和基于词典的方法优点是实现比较简单容易理解,但是因为输入地址的不规范导致很难遍历所有的规则,基于机器学习的方法在这方面表现的更好一点。
GitHub上一些地址解析的开源库:libpostal(逻辑回归+平均感知器+CRF的标注方法),Address(规则匹配),USAAddress(CRF模型),StreetAddress(规则匹配),AddressNet(RNN神经网络)等。
请求改写
往往用户的输入过程中可能存存在着一些拼写错误,或者由于输入习惯导致的一些非标准化输入,需要对这些非标准化输入标准化,通常的一些手段有:
- 同义词:主要是一些POI的简称,比如中科院是中国科学院的简称、G6是北京段京藏高速的简称。需要在后台建立同义词词典,改写请求。
- 拼音:有的用户会输入拼音信息,后台需建立拼音和汉字的对应关系,使用trie树进行索引。
- 纠错:和拼音的解决方法类似,将写错的单词转换为正确的单词。
其他方法
- 向量化:本质上geocoding是寻找相似POI的过程,如果将请求直接做成一个向量,然后去库中寻找相似的POI向量,最相似的POI就是最终的结果。
- 知识图谱:
论文
- From text to geographic coordinates: the current state of geocoding。一篇综述
- A deep learning architecture for semantic address matching。向量化的方法