我目前正在处理一些包含位置信息但缺乏直接纬度和经度测量的大型数据集,而这些测量是我创建可视化所需的。
为了解决这个问题,我一直在使用地理编码API,这些API需要地址或类似地址的信息作为输入,并提供纬度和经度信息作为输出。
我最初使用的是Nominatim API。不幸的是,由于我拥有的地址类数据的性质,我的许多查询都失败了,因此我开始使用Google geocoding API。Google API为我提供了显著更高的成功率,但它是一个付费API,这并不理想。
我意识到,鉴于Google拥有的巨大资源,在合理的时间内构建一个能够与其地理编码API竞争的系统几乎是不可能的,但这让我很好奇它的内部运作方式。
是否在使用类似BERT的翻译系统?发送文本后会发生什么?
回答:
我通过创建索引和倒排索引,使用n-grams来进行类似的使用。查看这个包ngram
import ngram ...country = filename.replace('.csv', '')ind[country] = ngram.NGram()inv[country] = {}s_csv = csv.reader(stream, delimiter=';')next(s_csv)for row in s_csv: coord = tuple(map(float, row[0:2])) ad = ' '.join(row[2:]).lower() ind[country].add(ad) inv[country][ad] = (coord, address)
然后你可以使用find
函数
注意内存消耗,像法国这样的国家使用OSM数据大约需要16GB的RAM
要查看该实现,请检查这个OpenGeoCode HTTP API服务源代码