Получить координаты местоположения с помощью bing или google API в python

Вот моя проблема. У меня есть образец текстового файла, где я храню текстовые данные, сканируя различные html-страницы. Этот текст содержит информацию о различных событиях, их времени и месте. Я хочу получить координаты этих местоположений. Я не знаю, как я могу это сделать в python. Я использую 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)

Пример файла выглядит примерно так:

La bohème в Ковент-Гардене

     

Когда: 18 января 2013 года (различные даты), 7:30 вечера Где: Ковент-Гарден,   Лондон, многолетняя популярность Королевской оперы Джона Копли   La bohème Пуччини возрождается в первом сезоне в этом сезоне,   точно в течение рождественского периода. Сэр Марк Элдер ведет Роландо   Вильязон, Родольфо и Майя Ковалевска, как Мими. Мими встречает поэта   Родольфо (Дмитрий Попов поет эту роль 5 и 18 января) один холод   Сочельник в латинском квартале Парижа. Возиться в темноте   после того, как ее свеча погасла, они влюбились. Родольфо живет с   три других ребята: философ Коллин (Nahuel di Pierro/Jihoon Kim on   18 января), музыкант Шонард (Дэвид Бизич) и художник Марчелло   (Аудун Иверсен), который любит Мусетту (Стефания Довхан). Обе пары   расстаются, и опера заканчивается трагедией, когда Родольфо находит, что Мими умирает   потребление в замораживающей мансарде.

Я хочу получить координаты для Ковент Гарден, Лондон, из этого текста. Как мне это сделать ?

3
nl ja de
Вы действительно должны были упомянуть, что «ваш» код является только копией примера в gist.github.com/322906 </а>.
добавлено автор jimhark, источник

3 ответы

С сентября 2013 года API Карт Google 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, ""
    return latitude, longitude

Для получения полного списка параметров и дополнительной информации см. официальную документацию .

6
добавлено

У вас действительно есть два вопроса:

  1. Как извлечь текст местоположения (или текст потенциального местоположения).
  2. Как получить местоположение (широта, долгота), вызвав службу геокодирования с текстом местоположения.

Я могу помочь со вторым вопросом. (Но см. Править ниже, чтобы помочь с вашим первым вопросом.)

Со старым API Карт Google (который все еще работает) вы можете получить геокодирование до одной строки (одна уродливая строка):

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 Карт Google :

Вот читаемая 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 Именованное распознавание сущностей . В конце раздела они указывают:

NLTK предоставляет классификатор, который уже обучен распознавать именованные объекты, доступ к которым осуществляется с помощью функции nltk.ne_chunk (). Если мы установим параметр binary = True, то именованные объекты будут помечены как NE; в противном случае классификатор добавляет метки категорий, такие как PERSON, ORGANIZATION и GPE.

Вы указываете True , но вам, вероятно, нужны метки категорий, поэтому:

chunked_sentences = nltk.batch_ne_chunk(tagged_sentences)

Это дает метки категорий (названный тип сущности), что представляется многообещающим. Но, попробовав это на вашем тексте и несколько простых фраз с указанием местоположения, требуется больше правил. Прочтите документацию для получения дополнительной информации.

5
добавлено
@AnshuThakur, есть ли что-нибудь еще, что я могу сделать, чтобы сделать этот ответ более приемлемым для вас?
добавлено автор jimhark, источник

Операция, которую вы хотите сделать, называется операцией геокодирования. Конечно, вам нужно будет извлечь информацию о местоположении, находясь внутри блока текстовой информации.

Вы можете сделать это, используя услугу:

Имейте в виду, что вам следует рассмотреть лицензию, которая может применяться к вам в зависимости от ваших случаев использования.

1
добавлено
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

AI / Big Data / Machine Learning
AI / Big Data / Machine Learning
2 978 участник(ов)

Всё об AI, бигдата, о машинном обучении, и как правильно всё это готовить. For english: @bigdata_en По любым вопросам: @hitmaker Список интересных групп и каналов: https://github.com/goq/telegram-list

Data Science Chat
Data Science Chat
2 902 участник(ов)

Добро пожаловать в чат по анализу данных и машинному обучению. Вопросы или предложения по сотрудничеству: @ralovets Вакансии и реклама мероприятий разрешены только после согласования. Анти-спам бот для групп: @ProtectronBot

Нейронные сети (AI Community)
Нейронные сети (AI Community)
2 121 участник(ов)

Это чат про нейронные сети для членов AI Community.

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community