Desambigüe los nombres de lugares desordenados en Python (preferiblemente en la máquina local)

8

Tengo una lista con varios millones de nombres de lugares que provienen de los perfiles de Flickr. Los usuarios proporcionaron estos nombres de lugar como texto libre, por lo que se ven así:

Roma, Italy
Kennesaw, USA
Saginaw, MI
Rucker, Missouri, USA
Melbourne, Australia
Madrid, Spain
live in Sarnia / work in London, Canada
Valladolid, España
Italia
West Hollywood, United States

Quiero desambiguar estos nombres de lugares. Soy consciente de que en algunos casos no existe una solución directa, pero estoy dispuesto a vivir con alguna desambiguación falsa y con "ninguna respuesta" para algunos de los lugares. Si el nombre de un lugar corresponde al nombre de varias ciudades, entonces quiero asignar ese lugar a la ciudad más grande a la que corresponde.

La API del buscador de lugares de Yahoo sería una buena solución para este problema, pero necesitaría hacer demasiadas llamadas API para completar mi lista, por lo que me gustaría una solución local (es decir, una que no dependa de una API remota) . ¿Alguien sabe de alguna biblioteca de Python que haga este tipo de cosas, o alguna otra solución local?

(También hice esta pregunta en stackoverflow ).

conradlee
fuente

Respuestas:

8

Podrías probar el geodict de la biblioteca Python . Esto tiene conjuntos de datos que puede descargar e importar a una base de datos; puede consultar las listas para ver si funcionan bien o no con sus datos. Funciona en dos pasos:

  1. Extrayendo nombres
  2. Hacer coincidir nombres con una ubicación en las listas

Más detalles (y otra opción en línea en los comentarios) aquí .

geographika
fuente
2

Supongo que su mejor conjetura es utilizar un algoritmo difuso.

Tome su diccionario local de nombres de lugares y unidades administrativas y compare cada palabra y cada bloque de texto separado por comas con este diccionario. Asignar una puntuación a cada partido. Es posible que desee utilizar una búsqueda normalizada para tener en cuenta los errores ortográficos y tener una "lista de ignorados" para palabras como "en vivo" y "trabajar" y "en". Agregue el puntaje de las unidades administrativas al puntaje de cualquier unidad más pequeña o nombre de lugar en sus coincidencias que se encuentren dentro de esta unidad administrativa.

Ajuste la función de puntuación con sus resultados hasta que esté satisfecho. Toma el mejor partido de puntuación.

e.g.: Roma, Italy 
Roma matches 8 places (score according to size)
Roma matches 23 more places with normalization (lower score according to size)
Italy matches 4 places + 2 administrative units (COUNTRY, DISTRICT) (score acconding to size)
Italy matches 14 more places and units with normalization (lower score according to size)
One of the Romas lies in one of your units. -> combine scores

Si tu afinación es buena, habrás dado la mayoría de los puntos a la capital de Italia.

realquilar
fuente
1

Puede usar la biblioteca de geotexto python para el mismo.

pip install geotext

todo lo que se necesita es instalar esta biblioteca. El uso es tan simple como:

from geotext import GeoText
places = GeoText("London is a great city")
places.cities

da el resultado 'Londres'

La lista de ciudades cubiertas en esta biblioteca no es extensa pero tiene una buena lista.

Anindita Bhowmik
fuente
0

Una oferta comercial es el geocodificador de Polygon Analytics , que existe como API SAAS REST, así como una API C ++ de alto rendimiento local (con envoltorios para Python, Java y otros) para evitar la latencia de la red (o para datos confidenciales).

Su API también proporciona salida lat / lon para mapeo.

James Winnacker
fuente