Disambiguieren Sie unordentliche Ortsnamen in Python (vorzugsweise auf einem lokalen Computer).

8

Ich habe eine Liste mit mehreren Millionen Ortsnamen, die aus Flickr-Profilen stammen. Benutzer haben diese Ortsnamen als Freitext angegeben, sodass sie folgendermaßen aussehen:

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

Ich möchte diese Ortsnamen eindeutig definieren. Ich bin mir bewusst, dass es in einigen Fällen keine einfache Lösung gibt, aber ich bin bereit, mit einer falschen Begriffsklärung und mit "keiner Antwort" für einige der Orte zu leben. Wenn ein Ortsname dem Namen mehrerer Städte entspricht, möchte ich diesen Ort der größten Stadt zuweisen, der er entspricht.

Die Platzfinder-API von Yahoo wäre eine gute Lösung für dieses Problem, aber ich müsste zu viele API-Aufrufe durchführen, um meine Liste zu durchlaufen. Daher möchte ich eine lokale Lösung (dh eine, die nicht von einer Remote-API abhängt). . Kennt jemand Python-Bibliotheken, die so etwas tun, oder andere lokale Lösungen?

(Ich habe diese Frage auch zum Stackoverflow gestellt .)

conradlee
quelle

Antworten:

8

Sie können das Geodict der Python-Bibliothek ausprobieren . Hier finden Sie Datensätze, die Sie herunterladen und in eine Datenbank importieren können. Sie können die Listen überprüfen, um festzustellen , ob sie mit Ihren Daten gut funktionieren oder nicht. Es funktioniert in zwei Schritten:

  1. Namen extrahieren
  2. Übereinstimmende Namen mit einem Ort in den Listen

Weitere Details (und eine weitere Online- Option in den Kommentaren) hier .

geographika
quelle
2

Ich gehe davon aus, dass Sie am besten einen Fuzzy-Algorithmus verwenden.

Nehmen Sie Ihr lokales Wörterbuch mit Ortsnamen und Verwaltungseinheiten und vergleichen Sie jedes Wort und jeden durch Kommas getrennten Textblock mit diesem Wörterbuch. Weisen Sie jedem Spiel eine Punktzahl zu. Möglicherweise möchten Sie eine normalisierte Suche verwenden, um Rechtschreibfehler zu berücksichtigen und eine "Ignorierliste" für Wörter wie "live" und "work" und "in" zu erstellen. Fügen Sie die Punktzahl für Verwaltungseinheiten zur Punktzahl einer kleineren Einheit oder eines Ortsnamens in Ihren Übereinstimmungen hinzu, die innerhalb dieser Verwaltungseinheit liegen.

Stimmen Sie die Bewertungsfunktion mit Ihren Ergebnissen ab, bis Sie zufrieden sind. Nehmen Sie das Match mit der besten Punktzahl.

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

Wenn Sie gut stimmen, haben Sie der Hauptstadt Italiens die meisten Punkte gegeben.

relet
quelle
1

Sie können auch die Geotext- Python-Bibliothek verwenden.

pip install geotext

Sie müssen lediglich diese Bibliothek installieren. Die Verwendung ist so einfach wie:

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

gibt das Ergebnis 'London'

Die Liste der Städte in dieser Bibliothek ist nicht umfangreich, hat aber eine gute Liste.

Anindita Bhowmik
quelle
0

Ein kommerzielles Angebot ist der Geocoder von Polygon Analytics , der als SAAS REST-API sowie als lokale , leistungsstarke C ++ - API (mit Wrappern für Python, Java und andere) zur Vermeidung von Netzwerklatenz (oder für vertrauliche Daten) verfügbar ist.

Die API bietet auch eine Lat / Lon-Ausgabe für das Mapping.

James Winnacker
quelle