LibPostal ist eine C -Bibliothek zur Parsen/Normalisierung von Straßenadressen weltweit mit statistischer NLP und offener Daten. Ziel dieses Projekts ist es, standortbezogene Zeichenfolgen in jeder Sprache überall zu verstehen. Eine umfassendere Übersicht über die Forschung hinter libpostal finden Sie unter den (langen) Einführungsblog -Posts:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Adressen und die von ihnen vertretenen Standorte sind für alle Anwendungen, die sich mit Karten befassen, von wesentlicher Bedeutung (Platz suchen, Transport, On-Demand-/Lieferdienste, Check-in, Bewertungen). Selbst die einfachsten Adressen sind jedoch mit lokalen Konventionen, Abkürzungen und Kontext gefüllt, wodurch es schwierig ist, mit herkömmlichen Volltext-Suchmaschinen effektiv zu indexieren/abzufragen. Diese Bibliothek hilft bei der Umwandlung der Freiformadressen, die Menschen in sauberen normalisierten Formularen für Maschinenvergleich und Volltextindizierung verwenden. Obwohl LibPostal selbst kein vollständiger Geocoder ist, kann es als Vorverarbeitungsschritt verwendet werden, um eine geokodierende Anwendung intelligenter, einfacher und konsequenter zu gestalten.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Die Kernbibliothek ist in reinen C. Sprachbindungen für Python, Ruby, Go, Java, PHP und NodeJs geschrieben, die offiziell unterstützt werden, und es ist einfach, Bindungen in andere Sprachen zu schreiben.
Wenn Ihr Unternehmen LibPostal verwendet, sollten Sie Ihre Organisation auffordern, das Projekt zu sponsern. Das Interpretieren dessen, was Menschen bedeuten, wenn sie sich auf Orte beziehen, ist alles andere als gelöstes Problem, und Sponsoring helfen uns, neue Grenzen in der Geospatial NLP zu verfolgen. Als Sponsor wird Ihr Firmenlogo zusammen mit einem Link zu Ihrer Website prominent auf der Github Repo -Seite angezeigt. Sponsoring Info
Einzelne Benutzer können auch dazu beitragen, offene Geo -NLP -Forschung zu unterstützen, indem sie eine monatliche Spende durchführen:
Stellen Sie vor der Installation sicher, dass Sie die folgenden Voraussetzungen haben:
Auf Ubuntu/Debian
sudo apt-get install curl autoconf automake libtool pkg-config
Auf Centos/rhel
sudo yum install curl autoconf automake libtool pkgconfig
Auf Mac OSX
brew install curl autoconf automake libtool pkg-config
Dann die C -Bibliothek installieren:
Wenn Sie einen M1-Mac verwenden, fügen Sie den Befehl ./configure --disable-sse2 . Dies wird zu einer schlechteren Leistung führen, aber der Build wird erfolgreich sein.
git clone https://github.com/openvenues/libpostal
cd libpostal
./bootstrap.sh
./configure --datadir=[...some dir with a few GB of space...]
make -j4
sudo make install
# On Linux it's probably a good idea to run
sudo ldconfig
LIBPostal unterstützt PKG-Config. Sie können damit die PKG-Konfiguration verwenden, um die Flags zu drucken, die erforderlich sind, um Ihr Programm dagegen zu verknüpfen:
pkg-config --cflags libpostal # print compiler flags
pkg-config --libs libpostal # print linker flags
pkg-config --cflags --libs libpostal # print both
Wenn Sie beispielsweise ein Programm namens app.c schreiben, können Sie es so kompilieren:
gcc app.c `pkg-config --cflags --libs libpostal`
MSYS2/MINGW
Für Windows erfordert das Build -Verfahren derzeit MSYS2 und Mingw. Dies kann von http://msys2.org heruntergeladen werden. Bitte befolgen Sie die Anweisungen auf der MSYS2 -Website zur Installation.
Bitte stellen Sie sicher, dass MSYS2 durch Laufen auf dem neuesten Stand ist:
pacman -Syu
Installieren Sie die folgenden Voraussetzungen:
pacman -S autoconf automake curl git make libtool gcc mingw-w64-x86_64-gcc
Dann, um die C -Bibliothek zu erstellen:
git clone https://github.com/openvenues/libpostal
cd libpostal
cp -rf windows/* ./
./bootstrap.sh
./configure --datadir=[...some dir with a few GB of space...]
make -j4
make install
Hinweise: Beim Einstellen des Datadir wird das Laufwerk C: Laufwerk als /c eingegeben. Das LibPostal Build -Skript fügt libpostal automatisch am Ende des Pfades hinzu, so dass '/c' C:libpostal unter Windows werden würde.
Die kompilierte .dll befindet sich im src/.libs/ Verzeichnis und sollte libpostal-1.dll genannt werden.
Wenn Sie eine .lib -Importbibliothek benötigen, um diese mit Ihrer Bewerbung zu verknüpfen. Sie können eine mit dem Visual Studio lib.exe -Tool und der Definitionsdatei libpostal.def generieren:
lib.exe /def:libpostal.def /out:libpostal.lib /machine:x64
Für libpostal ist ein alternatives Datenmodell verfügbar. Es wurde von Senzing Inc. für eine verbesserte Parsen für US-, Großbritannien- und Singapur -Adressen und eine verbesserte Handhabung der US -Route in den USA erstellt. So aktivieren Sie dieses add MODEL=senzing zur Contigure -Linie während der Installation:
./configure --datadir=[...some dir with a few GB of space...] MODEL=senzing
Die Daten für dieses Modell stammen von OpenAddress, OpenStreetMap und Daten, die durch Senzing basierend auf Kundenfeedback (einige hundert Aufzeichnungen) generiert wurden, insgesamt etwa 1,2 Milliarden Datensätze von Daten aus über 230 Ländern in mehr als 100 Sprachen. Die Daten von OpenStreetMap und OpenAddress sind gut, aber nicht perfekt, sodass der Datensatz durch Filterung schwer gebildeter Adressen, die Korrektur falsch klassifizierter Adress -Token und das Entfernen von Token, die nicht zu den Adressen gehörten, korrigieren, wenn diese Bedingungen angetroffen wurden.
Senzing erstellte einen Datensatz von 12950 -Adressen aus 89 Ländern, mit denen die Qualität seiner Modelle getestet und bestätigt wird. Der Datensatz wurde mit zufälligen Adressen von OSM, minimal 50 pro Land, generiert. Es wurden schwer zugeordnete Adressen vom Senz-Support-Team und Kunden sowie von der Libpostal Github-Seite erhalten und zu diesem Satz hinzugefügt. Das Senzing -Modell erhielt 4,3% bessere Parsing -Ergebnisse als das Standardmodell mit diesem Testsatz.
Die Größe dieses Modells beträgt etwa 2,2 GB im Vergleich zu 1,8 GB für das Standardmodell. Denken Sie also daran, wenn der Speicherplatz wichtig ist.
Weitere Informationen zu diesem Datenmodell finden Sie unter: https://github.com/senzing/libpostal-data, wenn Sie Probleme mit diesem Modell begegnen, unabhängig davon
Die internationale Adresse von Libpostal verwendet maschinelles Lernen (bedingte zufällige Felder) und wird in über 1 Milliarde Adressen in jedem bewohnten Land auf der Erde geschult. Wir verwenden OpenStreetMap und OpenAddresses als Quellen strukturierter Adressen und die OpenCage-Adressformatvorlagen unter: https://github.com/opencagedata/address-formatting, um die Trainingsdaten zu konstruieren, mit Polygonen zu erfüllen und Unterbauungskomponenten wie Apartment/Floor-Zahlen und Poboxen zu generieren. Wir fügen auch Abkürzungen hinzu, löschen Komponenten nach dem Zufallsprinzip usw., um den Parser so robust wie möglich für unordentliche Eingaben in der realen Welt zu machen.
Diese Beispielergebnisse stammen aus dem interaktiven Address_Parser -Programm, das beim make mit libpostal aufbaut. Beachten Sie, dass der Parser mit Kommas im Vergleich zu keinem Kommas sowie verschiedenen Gehäusen und Permutationen von Komponenten umgehen kann (wenn die Eingabe nur Stadt oder nur Stadt/Postleitzahl ist).
Der Parser erreicht eine sehr hohe Genauigkeit für Hold-Out-Daten, derzeit 99,45% korrekte vollständige Parse (dh 1 im Zähler, um jedes Token in die Adresse zu erhalten).
Hier ist ein Beispiel für die Parser -API unter Verwendung der Python -Bindungen:
from postal . parser import parse_address
parse_address ( 'The Book Club 100-106 Leonard St Shoreditch London EC2A 4RH, United Kingdom' )Und ein Beispiel mit der C API:
#include <stdio.h>
#include <stdlib.h>
#include <libpostal/libpostal.h>
int main ( int argc , char * * argv ) {
// Setup (only called once at the beginning of your program)
if (! libpostal_setup () || ! libpostal_setup_parser ()) {
exit ( EXIT_FAILURE );
}
libpostal_address_parser_options_t options = libpostal_get_address_parser_default_options ();
libpostal_address_parser_response_t * parsed = libpostal_parse_address ( "781 Franklin Ave Crown Heights Brooklyn NYC NY 11216 USA" , options );
for ( size_t i = 0 ; i < parsed -> num_components ; i ++ ) {
printf ( "%s: %sn" , parsed -> labels [ i ], parsed -> components [ i ]);
}
// Free parse result
libpostal_address_parser_response_destroy ( parsed );
// Teardown (only called once at the end of your program)
libpostal_teardown ();
libpostal_teardown_parser ();
}Der Adresse Parser kann technisch alle in den Trainingsdaten definierten String-Etiketten verwenden. Dies sind jedoch derzeit definiert, basierend auf den in der Adressformatierungsbibliothek von OpenCage definierten Feldern sowie einige von libpostal hinzugefügte Felder, um bestimmte Muster zu verarbeiten:
Die API EXPD_ADDRESS-API wandelt unordentliche reale Adressen in normalisierte Äquivalente um, die für die Suchindexierung, Hashing usw. geeignet sind.
Hier ist ein interaktives Beispiel mit der Python -Bindung:
LibPostal enthält einen OSM-ausgebildeten Sprachklassifizierer, um festzustellen, welche Sprache (en) in einer bestimmten Adresse verwendet werden, damit die entsprechenden Normalisierungen angewendet werden können. Der einzige benötigte Eingang ist die RAW -Adresszeichenfolge. Hier finden Sie eine kurze Liste mit weniger einfachen Normalisierungen in verschiedenen Sprachen.
| Eingang | Ausgang (kann in libpostal mehrfach sein) |
|---|---|
| Einhundert 20 E 96. ST | 120 East 96th Street |
| C/ Ocho, PI 4 | Calle 8 Polígono Industrial 4 |
| V xx settembre, 20 | via 20 settembre 20 |
| Quatre Vingt Douze R. de l'Église | 92 Rue de l Eglise |
| o | улlass |
| o | Ulitsa Karetnyy Ryad Dom 4 Stroyeniye 7 |
| Marktstraße 14 | Markt Strasse 14 |
LibPostal unterstützt derzeit diese Arten von Normalisierungen in über 60 Sprachen , und Sie können mehr hinzufügen (ohne C -Schreiben c).
Weitere Lektüre und einige bizarre Adressdatenkanse finden Sie unter: Die Programmierer der Falschheit glauben über Adressen.
Hier ist ein Beispiel, das die Python-Bindungen für die Prägnanz verwendet (die meisten Sprachbindungen auf höherer Ebene sind ähnlich):
from postal . expand import expand_address
expansions = expand_address ( 'Quatre-vingt-douze Ave des Champs-Élysées' )
assert '92 avenue des champs-elysees' in set ( expansions )Das C API -Äquivalent ist ein paar weitere Zeilen, aber immer noch ziemlich einfach:
#include <stdio.h>
#include <stdlib.h>
#include <libpostal/libpostal.h>
int main ( int argc , char * * argv ) {
// Setup (only called once at the beginning of your program)
if (! libpostal_setup () || ! libpostal_setup_language_classifier ()) {
exit ( EXIT_FAILURE );
}
size_t num_expansions ;
libpostal_normalize_options_t options = libpostal_get_default_options ();
char * * expansions = libpostal_expand_address ( "Quatre-vingt-douze Ave des Champs-Élysées" , options , & num_expansions );
for ( size_t i = 0 ; i < num_expansions ; i ++ ) {
printf ( "%sn" , expansions [ i ]);
}
// Free expansions
libpostal_expansion_array_destroy ( expansions , num_expansions );
// Teardown (only called once at the end of your program)
libpostal_teardown ();
libpostal_teardown_language_classifier ();
}Nach dem Bau von libpostal:
cd src/
./libpostal "Quatre vingt douze Ave des Champs-Élysées"
Wenn Sie eine Textdatei oder einen Stream mit einer Adresse pro Zeile haben, akzeptiert die Befehlszeilenschnittstelle auch Eingaben von STDIN:
cat some_file | ./libpostal --json
Nach dem Bau von libpostal:
cd src/
./address_parser
adress_parser ist eine interaktive Shell. Geben Sie einfach Adressen ein und libpostal wird sie analysieren und das Ergebnis drucken.
LibPostal ist so konzipiert, dass sie von Sprachen auf höherer Ebene verwendet werden. Wenn Sie Ihre Sprache Ihrer Wahl nicht sehen oder eine Sprachbindung schreiben, lassen Sie es uns bitte wissen!
Offiziell unterstützte Sprachbindungen
Inoffizielle Sprachbindungen
Datenbankerweiterungen
Inoffizielle Ruhe -API
Libpostal rest docker
Libpostal Zeromq Docker
LibPostal verwendet das größte für automatisierte Tests. Verwenden Sie die Tests, um die Tests auszuführen:
make check
Das Hinzufügen von Testfällen ist einfach, auch wenn Ihr C rostig/nicht existent ist und wir Beiträge lieben würden. Wir verwenden hauptsächlich Funktionstests, die die String -Eingabe gegen die String -Ausgabe überprüfen.
LibPostal wird auch in regelmäßigen Abständen mit Millionen von Adressen von OSM (Clean) sowie anonymisierten Abfragen aus einem Produktionsgeokoder (nicht so sauber) intelligiert. Während dieses Vorgangs verwenden wir Valgrind, um auf Speicherlecks und andere Fehler zu überprüfen.
LibPostal muss einige Datendateien aus S3 herunterladen. Die grundlegenden Dateien sind On-DiSK-Darstellungen der Datenstrukturen, die zur Durchführung von Expansion erforderlich sind. Für die Analyse von Adressen, da das Modelltraining einige Tage dauert, veröffentlichen wir das vollständig geschulte Modell auf S3 und aktualisieren es automatisch, wenn neue Adressen zu OSM, OpenAddresses usw. hinzugefügt werden. Gleiches gilt für das Modell der Sprachklassifikator.
Datendateien werden beim Ausführen automatisch heruntergeladen. Um neue Datendateien zu überprüfen und herunterzuladen, können Sie entweder make oder ausführen:
libpostal_data download all $YOUR_DATA_DIR/libpostal
Und ersetzen Sie $ your_data_dir durch alles, was Sie während der Installation zu konfigurieren haben.
LibPostal enthält eine Reihe von Wörterbüchern pro Sprache, die die Expansion, den Sprachklassifizierer und den Parser beeinflussen. Um die Wörterbücher zu untersuchen oder Abkürzungen/Phrasen in Ihrer Sprache beizutragen, siehe Ressourcen/Wörterbücher.
Beim maschinellen Lernen sind große Mengen an Trainingsdaten häufig wichtig, um gute Ergebnisse zu erzielen. Viele Projekte für maschinelles Lernen von Open-Source-Lernen veröffentlichen entweder nur den Modellcode (Ergebnisse, die nur dann reproduzierbar sind, wenn Sie Google sind), oder ein vorgebackenes Modell, bei dem die Trainingsbedingungen unbekannt sind.
LibPostal ist etwas anders, da es auf offenen Daten geschult ist, die für alle verfügbar sind. Daher haben wir die gesamte Trainingspipeline (das Geodata -Paket in diesem Repo) sowie die resultierenden Trainingsdaten selbst im Internetarchiv veröffentlicht. Es ist über 100 GB gepackt.
Die Schulungsdaten werden bis zu dem Datum, an dem sie erstellt wurden, auf archive.org gespeichert. Es gibt auch eine Datei, die im Hauptverzeichnis dieses Repo namens current_parser_training_set gespeichert ist und das Datum des zuletzt erstellten Trainingssatzes speichert. Um immer auf die neuesten Daten zu verweisen, probieren Sie so etwas wie: latest=$(cat current_parser_training_set) und verwenden Sie diese Variable anstelle des Datums.
Alle Dateien finden Sie unter https://archive.org/download/libpostal-parser-training-data-yyyyymmdd/$File als gzip'd tab-getrennte Werte (TSV) languagetcountrytaddress
Wenn der Parser nicht so gut funktioniert, wie Sie es auf eine bestimmte Adresse gehofft hatten, besteht der beste Rückgriff darin, Grep/AWK zu verwenden, um die Trainingsdaten zu durchsuchen und zu versuchen, festzustellen, ob ein Muster/eine Adressstil vorhanden ist, die nicht erfasst wird.
Abkürzung Expansion : z. B. Expanding "Rd" => "Straße", aber für fast jede Sprache. LibPostal unterstützt> 50 Sprachen und es ist einfach, neue Sprachen hinzuzufügen oder die aktuellen Wörterbücher zu erweitern. Ideografische Sprachen (nicht durch Whitespace -Chinesen getrennt) werden unterstützt, ebenso wie germanische Sprachen, in denen die Durchgangstypen am Ende der Saite verkettet werden, und die optional getrennt werden, damit die Rosenstraße und Rosen -Straße gleichwertig sind.
Internationale Adresse Parsing : Bedingte zufällige Feld, das "123 Main Street New York New York" in {"House_Number": 123, "Road": "Main Street", "City": "New York", "Staat": "New York"} analysiert. Der Parser arbeitet für eine Vielzahl von Ländern und Sprachen, nicht nur für uns/Englisch. Das Modell wird auf über 1 Milliarde Adressen und Adress-ähnliche Zeichenfolgen geschult, wobei die Vorlagen in der OpenCage-Adressformatierungs-Repo zum Bau von formatierten, markierten Ablagerungsbeispielen für jedes bewohnte Land der Welt geschult werden. Viele Arten von Normalisierungen werden durchgeführt, um die Trainingsdaten so genau wie möglich der echten, chaotischen Geocoder -Eingabe ähneln.
Sprachklassifizierung : Multinomial logistische Regression (unter Verwendung der FTRL-Proximal-Methode, um Sparsity zu induzieren) auf allen OpenStreetmap-Methoden, ADDR:* Tags, Toponyme und formatierten Adressen. Etiketten werden unter Verwendung von Punkt-in-Polygon-Tests für OSM-Länder und offizielle/regionale Sprachen für Länder bzw. Admin-1-Grenzen abgeleitet. Zum Beispiel ist Spanisch die Standardsprache in Spanien, aber in verschiedenen Regionen, z. Die auf Dictionary-basierte Disambiguierung wird in Fällen eingesetzt, in denen die regionale Sprache nicht default ist, z. B. Welsh, Breton, Occitan. Die Wörterbücher werden auch verwendet, um kanonische Phrasen wie "Calle" => "C/" abzukürzen (durchgeführt sowohl auf dem Sprachklassifizierer als auch auf dem Adress -Parser -Trainingssets)
Numerischer Ausdrucksparsing ("Twenty First" => 21st, "Quatre-vving-douze" => 92, erneut mit Daten, die in CLDR bereitgestellt wurden), unterstützt> 30 Sprachen. Griff Sprachen mit verketteten Ausdrücken, z. Mileottocento => 1800. Normalisiert optional die römischen Ziffern unabhängig von der Sprache (IX => 9), die in den Namen vieler Monarchen, Päpste usw. auftreten.
Schnell, genaue Tokenisierung / Lexing : Takted bei> 1m Token / Sekunden, implementiert die TR-29-Spezifikation für die UTF8-Wortsegmentierung, tokenisiert ostasiatische Sprachen Chracter nach Charakter anstelle von Whitespace.
UTF8 Normalisierung : Optional zersetzen Sie UTF8 in NFD-Normalisierungsformular, Strips Akzentmarken z. À => a und/oder lateinische Transliteration angewendet.
Transliteration : z. Verwendet alle CLDR -Transformationen, genau dieselben Quelldaten, die von der Intensivstation verwendet werden, obwohl libPostal nicht die gesamte ICU einziehen muss (möglicherweise in Konflikt mit der Version Ihres Systems). Hinweis: Einige Sprachen, insbesondere Hebräisch, Arabisch und Thai, enthalten möglicherweise keine Vokale und stimmen daher nicht oft mit einer Transliteration überein, die von einem Menschen durchgeführt wird. Es kann möglich sein, statistische Transliteratoren für einige dieser Sprachen zu implementieren.
Skripterkennung : Erkennt, welches Skript eine bestimmte Zeichenfolge verwendet (kann mehrere freie Form von Hongkong oder Macau-Adresse sein, die in derselben Adresse sowohl Han- als auch lateinische Skripte verwenden können). In der Transliteration können wir alle anwendbaren Transliteratoren für ein bestimmtes Unicode-Skript verwenden (Griechisch kann beispielsweise mit griechischem Latin, griechisch-latin-bgn und griechisch-latin-ungegn transliteriert werden).
LibPostal wurde ursprünglich als Teil des OpenVenues -Projekts erstellt, um das Problem des Dedups der Veranstaltungsort zu lösen. In OpenVenues haben wir einen Datensatz von Millionen von Orten, die von Terabyte von Webseiten aus dem gemeinsamen Crawl stammen. Das gemeinsame Crawl wird monatlich veröffentlicht, und so führt sogar das Zusammenführen der Ergebnisse von zwei Crawls zu erheblichen Duplikaten.
Deduping ist ein relativ gut untersuchtes Feld, und für Textdokumente wie Webseiten, akademische Artikel usw. gibt es ziemlich anständige ungefähre Ähnlichkeitsmethoden wie Minhash.
Bei physischen Adressen der häufige Verwendung herkömmlicher Abkürzungen wie Road == Rd, Kalifornien == CA oder New York City == NYC kompliziert die Sache ein wenig. Selbst mit einer Technik wie Minhash, die für ungefähre Übereinstimmungen gut geeignet ist und der Jaccard-Ähnlichkeit von zwei Sätzen entspricht, müssen wir mit sehr kurzen Texten arbeiten, und dies ist häufig der Fall, dass zwei äquivalente Adressen, eine abgekürzte und eine vollständig angegebene, nicht sehr eng mit dem N-Gram-Set übereinstimmt. In Nicht-Latin-Skripten, beispielsweise eine russische Adresse und ihr transliterates Äquivalent, ist es denkbar, dass zwei Adressen, die sich auf denselben Ort beziehen, nicht einmal mit einem einzigen Charakter übereinstimmen.
Betrachten Sie als motivierendes Beispiel die folgenden zwei äquivalenten Möglichkeiten, eine bestimmte Adresse in Manhattan mit unterschiedlichen Konventionen und Ausführungsgraden zu schreiben:
Offensichtlich '30 W 26th St FL #7!
LibPostal zielt darauf ab, normalisierte geografische Zeichenfolgen zu erstellen, die in Komponenten analysiert werden, sodass wir effektiver darüber begründen können, wie gut zwei Adressen tatsächlich übereinstimmen und automatisierte serverseitige Entscheidungen über Dupes treffen.
Wenn die oben genannten Geokodierung sehr ähnlich klingt, müssen wir in gewisser Weise nur im Fall von OpenVenues ohne Benutzeroberfläche oder einen Benutzer die richtige Adresse in einer automatischen Vervollständigung ausgewählt. Bei einer Datenbank mit Quelladressen wie OpenAddresses oder OpenStreetMap (oder allen oben genannten) kann LibPostal verwendet werden, um Dinge wie Adressdeduping und serverseitige Stapelgekodierung in Einstellungen wie MapReduce oder Stream-Verarbeitung zu implementieren.
Anstatt zu versuchen, Adress-spezifische Konventionen in herkömmliche Dokumentensuchmaschinen wie Elasticsearch mit riesigen Synonyme-Dateien, Skripten, benutzerdefinierten Analysatoren, Tokenisatoren und dergleichen zu bilden, kann Geocoding so aussehen:
Auf diese Weise kann Libpostal die Fuzzy -Adresse in konstanter Zeit in Bezug auf die Größe des Datensatzes in konstanter Zeit durchführen.
LibPostal ist aus drei Gründen (in der Reihenfolge von Bedeutung) in C geschrieben:
Portabilität/Ubiquität : libpostale Ziele höhere Sprachen, die Menschen tatsächlich den Alltag verwenden: Python, Go, Ruby, Nodejs usw. Die Schönheit von C ist, dass fast jede Programmiersprache an sie gebunden ist und C-Compiler überall wählen. Wir unterstützen Mac/Linux (Windows hat keine Priorität, sondern akzeptiert Patches), haben einen Standard-Autotools-Build und ein Endiangness-Agnostic-Dateiformat für die Datendateien. Die Python -Bindungen werden als Teil dieses Repo aufrechterhalten, da sie für den Bau der Trainingsdaten benötigt werden.
Speichereffizienz : LibPostal ist so konzipiert, dass sie in einer MapReduce-Einstellung ausgeführt werden, in der wir je nach Maschinenkonfiguration auf <1 GB RAM pro Prozess beschränkt sind. Libpostal verwendet so viel wie möglich zusammenhängende Arrays, Versuche (basiert auf zusammenhängenden Arrays), Blütenfilter und komprimierte spärliche Matrizen, um die Speicherverwendung niedrig zu halten. Es ist möglich, Libpostal auf einem mobilen Gerät mit Modellen zu verwenden, die in einem einzigen Land oder einer Handvoll Länder geschult sind.
Leistung : Dies ist aus einem bestimmten Grund auf der Liste. Die meisten Optimierungen in libpostal sind eher für Speicherverbrauch als für die Leistung. LibPostal ist angesichts der Arbeit, die es leistet, ziemlich schnell. Es kann 10-30K-Adressen / Sekunde in einem einzelnen Thread / Prozess auf den von uns getesteten Plattformen verarbeiten (dh dh die Bearbeitung jeder Adresse in OSM Planet in etwas mehr als einer Stunde). Schauen Sie sich das einfache Benchmark -Programm an, um Ihre Umgebung und verschiedene Arten von Eingaben zu testen. In der MapReduce-Einstellung ist die Leistung von pro Kern nicht so wichtig, da alles parallel durchgeführt wird, aber es gibt einige Streaming-Einnahmeanwendungen bei Mapzen, bei denen dies in den Prozess ausgeführt werden muss.
LibPostal ist in modern, lesbar, C99 geschrieben und verwendet die folgenden Konventionen:
Das Geodata Python -Paket im Libpostal -Repo enthält die Pipeline für die Vorbereitung der verschiedenen GEO -Datensätze und das Erstellen von Trainingsdaten für die zu verwendenden C -Modelle. Dieses Paket sollte für die meisten Benutzer nicht benötigt werden, aber für diejenigen, die neue Arten von Adressen generieren oder die Trainingsdaten von LibPostal verbessern möchten, ist hier zu sehen.
Bei den Hold-out-Testdaten (dh mit der Bezeichnung von Parsen, die das Modell zuvor noch nicht gesehen hat) erreicht der Adresse Parser 99,45% vollständiger Parse-Genauigkeit.
Bei einigen Aufgaben wie der Erkennung von Entity-Erkennung ist es vorzuziehen, etwas wie einen F1-Score oder eine Varianten zu verwenden, vor allem, weil es ein Problem der Klassenverzerrung gibt (die meisten Wörter sind Nicht-Entsorganisationen und ein System, das einfach die Nichtentzündung für jeden Token vorhersagte, würde tatsächlich in Bezug auf die Genauigkeit ziemlich gut abschneiden). Dies ist nicht der Fall für die Analyse von Adressgründen. Jedes Token hat ein Etikett und es gibt Millionen von Beispielen für jede Klasse in den Trainingsdaten, sodass Genauigkeit vorzuziehen ist, da es ein sauberes, einfaches und intuitives Maß für die Leistung ist.
Hier verwenden wir die vollständige Analysegenauigkeit, was bedeutet, dass wir dem Parser nur einen "Punkt" im Zähler geben, wenn jedes einzelne Token in der Adresse korrekt ist. Das sollte ein besseres Maß sein, als nur zu betrachten, ob jedes Token korrekt war.
Obwohl der aktuelle Parser für die meisten Standardadressen recht gut funktioniert, gibt es immer noch Verbesserungsraum, insbesondere bei der Sicherstellung, dass die von uns verwendeten Trainingsdaten in freier Wildbahn so nah wie möglich sind. Es gibt zwei primäre Möglichkeiten, wie der Adressparser noch weiter verbessert werden kann (in der Reihenfolge der Schwierigkeit):
Fehlerberichte, Probleme und Zuganfragen sind willkommen. Bitte lesen Sie den Beitragshandbuch, bevor Sie Ihren Problem, Ihren Fehlerbericht oder Ihre Anfrage einreichen.
Senden Sie Probleme unter: https://github.com/openvenues/libpostal/issues.
Besonderer Dank geht an @BenK10 für den ersten Windows -Build und @aeroxuk für die Integration des Projekts und für die Einrichtung eines Appveyor -Builds.
Die Software ist unter den Bedingungen der MIT -Lizenz als Open Source verfügbar.