获取位置坐标使用Bing或谷歌API的python(Get location coordinates

2019-07-18 22:25发布

这是我的问题。 我有,我会通过抓取各种HTML页面存储文本数据的样本文本文件。 本文包含有关各种事件及其时间和位置信息。 我想获取这些位置的坐标。 我有我该怎么做,在蟒蛇不知道。 我使用NLTK认识到在这个示例文本命名实体。 下面是代码:

import nltk

with open('sample.txt', 'r') as f:
    sample = f.read()

sentences = nltk.sent_tokenize(sample)
tokenized_sentences = [nltk.word_tokenize(sentence) for sentence in sentences]
tagged_sentences = [nltk.pos_tag(sentence) for sentence in tokenized_sentences]
chunked_sentences = nltk.batch_ne_chunk(tagged_sentences, binary=True)

#print chunked_sentences
#print tokenized_sentences
#print tagged_sentences

def extract_entity_names(t):
    entity_names = []

    if hasattr(t, 'node') and t.node:
        if t.node == 'NE':
            entity_names.append(' '.join([child[0] for child in t]))
        else:
            for child in t:
                entity_names.extend(extract_entity_names(child))

    return entity_names

entity_names = []
for tree in chunked_sentences:
    # Print results per sentence
    # print extract_entity_names(tree)

    entity_names.extend(extract_entity_names(tree))

# Print all entity names
#print entity_names

# Print unique entity names
print set(entity_names)

示例文件是这样的:

波希米亚人在考文特花园

时间:2013年1月18日(不同日期),晚上7点半地点:考文特花园,伦敦,约翰·科普利的常年流行的皇家歌剧院制作普契尼的波希米亚人是复兴的第一本赛季的两倍,恰当地在圣诞节期间。 司徒慕德爵士长辈进行罗兰多·比利亚松为鲁道夫和梅哈·科韦尔维斯卡咪咪。 MIMI符合诗人鲁道夫(德米特罗·波波夫唱5日和1月18日)的作用在巴黎的拉丁区,一个寒冷的圣诞节前夕。 在黑暗中摸索周围,他的灯熄灭后,他们相爱了。 鲁道夫的生活与其他三个小伙子:哲学家柯林尼(纳韦尔迪Pierro /金志勋1月18日),音乐家Schaunard(戴维·比齐奇)和画家马切洛(奥德·艾弗森),谁爱莫塞塔(斯特凡尼亚·多佛汉)。 两对夫妇分手和鲁道夫发现在冷冻阁楼消费咪咪濒死的歌剧以悲剧结束。

我想从这个文本抓取的考文特花园,伦敦坐标。 我该怎么做 ?

Answer 1:

你真的有两个问题:

  1. 如何提取位置文本(或潜在的位置文本)。
  2. 如何通过调用位置文本地理编码服务来获得位置(经度,纬度)。

我可以用第二个问题有所帮助。 (也可以看看下面编辑一些帮助,你的第一个问题。)

与老谷歌地图API(这仍然是工作),你能拿下来地理编码一条线(一个丑陋线):

def geocode(address):
    return tuple([float(s) for s in list(urllib.urlopen('http://maps.google.com/maps/geo?' + urllib.urlencode({'output': 'csv','q': address})))[0].split(',')[2:]])

退房的谷歌地图API地址解析文档 :

下面是可读7行版本加上一些包装代码(从命令行调用的时候记得用引号括地址):

import sys
import urllib

googleGeocodeUrl = 'http://maps.google.com/maps/geo?'

def geocode(address):
    parms = {
        'output': 'csv',
        'q': address}

    url = googleGeocodeUrl + urllib.urlencode(parms)
    resp = urllib.urlopen(url)
    resplist = list(resp)
    line = resplist[0]
    status, accuracy, latitude, longitude = line.split(',')
    return latitude, longitude

def main():
    if 1 < len(sys.argv):
        address = sys.argv[1]
    else:
        address = '1600 Amphitheatre Parkway, Mountain View, CA 94043, USA'

    coordinates = geocode(address)
    print coordinates

if __name__ ==  '__main__':
    main()

这很简单解析CSV格式,但是XML格式具有更好的错误报告。

编辑 - 帮助你的第一个问题

我看着到nltk 。 这不是小事,但我可以推荐自然语言工具包文档,CH 7 -从文本中提取信息 ,具体而言, 7.5 Named Entity Recognition 。 在本节结束时,他们指出:

NLTK提供了已经训练来识别命名实体的分类与功能nltk.ne_chunk访问()。 如果我们设定的参数二进制= true,则命名实体只是标记为NE; 否则,分类增加了分类标签,如人,组织和GPE。

你指定True ,但你可能想要的分类标签,那么:

chunked_sentences = nltk.batch_ne_chunk(tagged_sentences)

这提供了分类标签(命名实体类型),这似乎有希望的。 但是,试图这样做对您的文字和一些简单的短语与位置后,很明显需要更多的规则。 阅读更多信息的文档。



Answer 2:

自2013年9月,谷歌地图API V2 不再起作用 。 这里是伟大的@ jimhark的代码的更新版本,API V3的工作(我离开了__main__部分):

import urllib
import simplejson

googleGeocodeUrl = 'http://maps.googleapis.com/maps/api/geocode/json?'

def get_coordinates(query, from_sensor=False):
    query = query.encode('utf-8')
    params = {
        'address': query,
        'sensor': "true" if from_sensor else "false"
    }
    url = googleGeocodeUrl + urllib.urlencode(params)
    json_response = urllib.urlopen(url)
    response = simplejson.loads(json_response.read())
    if response['results']:
        location = response['results'][0]['geometry']['location']
        latitude, longitude = location['lat'], location['lng']
        print query, latitude, longitude
    else:
        latitude, longitude = None, None
        print query, "<no results>"
    return latitude, longitude

请参见官方文档的参数和其他信息的完整列表。



Answer 3:

你想要做的操作被称为地理编码操作。 当然,你将不得不提取由你自己的文本信息块里面的“位置”的信息。

您可以使用该服务做到这一点:

  • Bing地图: http://msdn.microsoft.com/en-us/library/ff701714.aspx
  • 谷歌地图: https://developers.google.com/maps/documentation/geocoding/
  • 诺基亚地图: http://developer.here.net/javascript_api_explorer

请记住,你应该考虑可能适用于您根据您的使用情况该许可证。



文章来源: Get location coordinates using bing or google API in python