Libpostal adalah perpustakaan C untuk parsing/normalisasi alamat jalan di seluruh dunia menggunakan NLP statistik dan data terbuka. Tujuan dari proyek ini adalah untuk memahami string berbasis lokasi dalam setiap bahasa, di mana-mana. Untuk tinjauan yang lebih komprehensif tentang penelitian di balik Libpostal, pastikan untuk memeriksa posting blog pengantar (panjang):
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
Alamat dan lokasi yang mereka wakili sangat penting untuk setiap aplikasi yang berurusan dengan peta (Pencarian Tempat, Transportasi, Layanan On-Demand/Pengiriman, Check-In, Ulasan). Namun bahkan alamat paling sederhana dikemas dengan konvensi lokal, singkatan dan konteks, membuatnya sulit untuk diindeks/kueri secara efektif dengan mesin pencari teks lengkap tradisional. Perpustakaan ini membantu mengonversi alamat bentuk bebas yang digunakan manusia menjadi bentuk yang dinormalisasi bersih yang cocok untuk perbandingan mesin dan pengindeksan teks lengkap. Meskipun LibPostal sendiri bukanlah geocoder penuh, itu dapat digunakan sebagai langkah preprocessing untuk membuat aplikasi geocoding apa pun lebih pintar, lebih sederhana, dan lebih konsisten secara internasional.
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
Perpustakaan inti ditulis dalam binding bahasa C. murni untuk Python, Ruby, Go, Java, PHP, dan NodeJs secara resmi didukung dan mudah untuk menulis binding dalam bahasa lain.
Jika perusahaan Anda menggunakan LibPostal, pertimbangkan untuk meminta organisasi Anda untuk mensponsori proyek. Menafsirkan apa arti manusia ketika mereka merujuk ke lokasi jauh dari masalah yang diselesaikan, dan sponsor membantu kita mengejar perbatasan baru di NLP geospasial. Sebagai sponsor, logo perusahaan Anda akan muncul dengan jelas di halaman repo GitHub bersama dengan tautan ke situs Anda. Info sponsor
Pengguna individu juga dapat membantu mendukung penelitian geo nlp terbuka dengan memberikan donasi bulanan:
Sebelum Anda menginstal, pastikan Anda memiliki prasyarat berikut:
Di Ubuntu/Debian
sudo apt-get install curl autoconf automake libtool pkg-config
Pada centos/rhel
sudo yum install curl autoconf automake libtool pkgconfig
Di Mac OSX
brew install curl autoconf automake libtool pkg-config
Kemudian untuk menginstal perpustakaan C:
Jika Anda menggunakan M1 M1, tambahkan --disable-sse2 ke perintah ./configure . Ini akan menghasilkan kinerja yang lebih buruk tetapi bangunan akan berhasil.
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 mendapat dukungan untuk PKG-Config, sehingga Anda dapat menggunakan PKG-Config untuk mencetak bendera yang diperlukan untuk menautkan program Anda dengan itu:
pkg-config --cflags libpostal # print compiler flags
pkg-config --libs libpostal # print linker flags
pkg-config --cflags --libs libpostal # print both
Misalnya, jika Anda menulis program yang disebut app.c, Anda dapat mengkompilasinya seperti ini:
gcc app.c `pkg-config --cflags --libs libpostal`
MSYS2/MINGW
Untuk Windows, prosedur pembuatan saat ini membutuhkan MSYS2 dan MINGW. Ini dapat diunduh dari http://msys2.org. Harap ikuti instruksi di situs web MSYS2 untuk instalasi.
Harap pastikan MSYS2 terbaru dengan menjalankan:
pacman -Syu
Instal prasyarat berikut:
pacman -S autoconf automake curl git make libtool gcc mingw-w64-x86_64-gcc
Kemudian untuk membangun perpustakaan C:
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
Catatan: Saat mengatur datadir, drive C: akan dimasukkan sebagai /c . Libpostal build Script secara otomatis menambahkan libpostal di ujung jalan, jadi '/c' akan menjadi C:libpostal pada windows.
.Dll yang disusun akan berada di src/.libs/ direktori dan harus disebut libpostal-1.dll .
Jika Anda memerlukan perpustakaan impor .lib untuk menautkan ini ke aplikasi Anda. Anda dapat menghasilkan satu menggunakan alat visual studio lib.exe dan file definisi libpostal.def :
lib.exe /def:libpostal.def /out:libpostal.lib /machine:x64
Model data alternatif tersedia untuk libpostal. Ini dibuat oleh Senzing Inc. untuk meningkatkan penguraian pada alamat AS, Inggris, dan Singapura dan meningkatkan penanganan alamat rute pedesaan AS. Untuk mengaktifkan MODEL=senzing ke garis Conigure selama instalasi:
./configure --datadir=[...some dir with a few GB of space...] MODEL=senzing
Data untuk model ini didapat dari OpenAddress, OpenStreetMap dan data yang dihasilkan oleh Senzing berdasarkan umpan balik pelanggan (beberapa ratus catatan), total sekitar 1,2 miliar catatan data dari lebih dari 230 negara, dalam 100+ bahasa. Data dari OpenStreetMap dan OpenAddress bagus tetapi tidak sempurna sehingga set data dimodifikasi dengan menyaring alamat yang terbentuk dengan buruk, mengoreksi token alamat yang salah diklasifikasikan dan menghapus token yang tidak termasuk dalam alamat, kapan pun kondisi ini ditemui.
Senzing membuat set data 12950 alamat dari 89 negara yang digunakannya untuk menguji dan memverifikasi kualitas modelnya. Kumpulan data dihasilkan menggunakan alamat acak dari OSM, minimal 50 per negara. Alamat yang sulit dipanaskan didapat dari tim pendukung Senzing dan pelanggan dan dari halaman Libpostal GitHub dan ditambahkan ke set ini. Model Senzing mendapatkan 4,3% hasil parsing yang lebih baik daripada model default, menggunakan set tes ini.
Ukuran model ini adalah sekitar 2.2GB dibandingkan dengan 1.8GB untuk model default jadi ingatlah jika ruang penyimpanan penting.
Informasi lebih lanjut tentang model data ini dapat ditemukan di: https://github.com/senzing/libpostal-data jika Anda mengalami masalah apa pun dengan model ini, apakah mereka ada hubungannya dengan parse, instalasi atau masalah lainnya, silakan laporkan di https://github.com/senzing/libpostal apa pun
Parser alamat internasional Libpostal menggunakan pembelajaran mesin (bidang acak bersyarat) dan dilatih pada lebih dari 1 miliar alamat di setiap negara yang dihuni di Bumi. Kami menggunakan OpenStreetMap dan OpenAddresses sebagai sumber alamat terstruktur, dan Templat Format Alamat OpenCage di: https://github.com/opencagedata/address-formatting untuk membangun data pelatihan, melengkapi dengan poing yang berisi poing, dan menghasilkan komponen sub-building seperti bilangan apartemen dan lantai. Kami juga menambahkan singkatan, keluar komponen secara acak, dll. Untuk membuat parser sekuat mungkin untuk input dunia nyata yang berantakan.
Contoh hasil parse ini diambil dari program interaktif alamat_parser yang dibangun dengan libpostal saat Anda menjalankan make . Perhatikan bahwa parser dapat menangani koma vs tidak ada koma serta berbagai selongsong dan permutasi komponen (jika inputnya hanya misalnya kota atau hanya kota/kode pos).
Parser mencapai akurasi yang sangat tinggi pada data yang ditahan, saat ini 99,45% benar parse penuh (artinya 1 dalam pembilang untuk mendapatkan setiap token di alamat yang benar).
Berikut adalah contoh API Parser menggunakan binding Python:
from postal . parser import parse_address
parse_address ( 'The Book Club 100-106 Leonard St Shoreditch London EC2A 4RH, United Kingdom' )Dan contoh dengan API C:
#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 ();
}Parser alamat secara teknis dapat menggunakan label string apa pun yang didefinisikan dalam data pelatihan, tetapi ini adalah yang saat ini didefinisikan, berdasarkan pada bidang yang ditentukan dalam perpustakaan pembentukan alamat OpenCage, serta beberapa yang ditambahkan oleh Libpostal untuk menangani pola spesifik:
API Expand_Address mengubah alamat dunia nyata yang berantakan menjadi ekuivalen yang dinormalisasi yang cocok untuk pengindeksan pencarian, hashing, dll.
Berikut adalah contoh interaktif menggunakan ikatan Python:
Libpostal berisi pengklasifikasi bahasa yang terlatih OSM untuk mendeteksi bahasa mana yang digunakan dalam alamat yang diberikan sehingga dapat menerapkan normalisasi yang sesuai. Satu -satunya input yang diperlukan adalah string alamat mentah. Berikut adalah daftar pendek beberapa normalisasi yang kurang langsung dalam berbagai bahasa.
| Masukan | Output (mungkin banyak dalam libpostal) |
|---|---|
| Seratus dua puluh E 96th 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 glise |
| ул каретный setelah, д 4, строен masuk 7 | улица каретныи ядом 4 строен masuk 7 |
| ул каретный setelah, д 4, строен masuk 7 | Ulitsa Karetnyy Ryad Dom 4 Stroyeniye 7 |
| Marktstraße 14 | Markt Strasse 14 |
Libpostal saat ini mendukung jenis normalisasi ini dalam 60+ bahasa , dan Anda dapat menambahkan lebih banyak (tanpa harus menulis c).
Untuk bacaan lebih lanjut dan beberapa alamat tepi yang aneh, lihat: Programmer kepalsuan percaya tentang alamat.
Berikut adalah contoh menggunakan binding python untuk ringkas (sebagian besar ikatan bahasa tingkat tinggi serupa):
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 )Setara C API adalah beberapa baris lagi, tetapi masih cukup sederhana:
#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 ();
}Setelah membangun Libpostal:
cd src/
./libpostal "Quatre vingt douze Ave des Champs-Élysées"
Jika Anda memiliki file teks atau streaming dengan satu alamat per baris, antarmuka baris perintah juga menerima input dari stdin:
cat some_file | ./libpostal --json
Setelah membangun Libpostal:
cd src/
./address_parser
alamat_parser adalah cangkang interaktif. Cukup ketik alamat dan libpostal akan menguraikan dan mencetak hasilnya.
Libpostal dirancang untuk digunakan oleh bahasa tingkat yang lebih tinggi. Jika Anda tidak melihat bahasa pilihan Anda, atau jika Anda menulis bahasa yang mengikat, beri tahu kami!
Binding bahasa yang didukung secara resmi
Binding Bahasa Tidak Resmi
Ekstensi basis data
API istirahat tidak resmi
Libpostal Rest Docker
Libpostal Zeromq Docker
Libpostal menggunakan yang terbesar untuk pengujian otomatis. Untuk menjalankan tes, gunakan:
make check
Menambahkan kasus uji itu mudah, bahkan jika C Anda berkarat/tidak ada, dan kami akan menyukai kontribusi. Kami menggunakan sebagian besar tes fungsional memeriksa input string terhadap output string.
Libpostal juga secara berkala diuji pertempuran pada jutaan alamat dari OSM (bersih) serta pertanyaan yang dianonimkan dari geocoder produksi (tidak terlalu bersih). Selama proses ini kami menggunakan Valgrind untuk memeriksa kebocoran memori dan kesalahan lainnya.
Libpostal perlu mengunduh beberapa file data dari S3. File-file dasar adalah representasi on-disk dari struktur data yang diperlukan untuk melakukan ekspansi. Untuk parsing alamat, karena pelatihan model memakan waktu beberapa hari, kami menerbitkan model yang sepenuhnya terlatih ke S3 dan akan memperbaruinya secara otomatis ketika alamat baru ditambahkan ke OSM, OpenAddresses, dll. Hal yang sama berlaku untuk model Classifier bahasa.
File data diunduh secara otomatis saat Anda menjalankan Make. Untuk memeriksa dan mengunduh file data baru, Anda dapat menjalankan make , atau Run:
libpostal_data download all $YOUR_DATA_DIR/libpostal
Dan ganti $ your_data_dir dengan apa pun yang Anda lewati untuk dikonfigurasi selama instal.
Libpostal berisi sejumlah kamus per-bahasa yang mempengaruhi ekspansi, pengklasifikasi bahasa, dan parser. Untuk mengeksplorasi kamus atau berkontribusi singkatan/frasa dalam bahasa Anda, lihat sumber daya/kamus.
Dalam pembelajaran mesin, sejumlah besar data pelatihan seringkali penting untuk mendapatkan hasil yang baik. Banyak proyek pembelajaran mesin open-source baik hanya merilis kode model (hasil yang dapat direproduksi jika dan hanya jika Anda Google), atau model yang sudah dipanggang di mana kondisi pelatihan tidak diketahui.
Libpostal sedikit berbeda karena dilatih pada data terbuka yang tersedia untuk semua orang, jadi kami telah merilis seluruh pipa pelatihan (paket geodata dalam repo ini), serta data pelatihan yang dihasilkan sendiri di arsip internet. Itu lebih dari 100GB unzip.
Data pelatihan disimpan di archive.org pada tanggal mereka dibuat. Ada juga file yang disimpan di direktori utama repo ini yang disebut current_parser_training_set yang menyimpan tanggal set pelatihan yang paling baru dibuat. Untuk selalu menunjuk ke data terbaru, coba sesuatu seperti: latest=$(cat current_parser_training_set) dan gunakan variabel itu sebagai pengganti tanggal.
Semua file dapat ditemukan di https://archive.org/download/libpostal-parser-training-data-yyyymmdd/$file sebagai file yang dipisahkan tab (TSV) yang diformat seperti: languagetcountrytaddress .
Jika parser tidak berkinerja sebaik yang Anda harapkan pada jenis alamat tertentu, jalan terbaik adalah menggunakan Grep/AWK untuk melihat melalui data pelatihan dan mencoba menentukan apakah ada beberapa pola/gaya alamat yang tidak ditangkap.
Ekspansi Singkatan : Misalnya memperluas "rd" => "jalan" tetapi untuk hampir semua bahasa. Dukungan LibPostal> 50 bahasa dan mudah untuk menambahkan bahasa baru atau memperluas kamus saat ini. Bahasa ideografi (tidak dipisahkan oleh whitespace misalnya Cina) didukung, seperti halnya bahasa Jerman di mana jenis jalan raya digabungkan ke ujung string, dan secara opsional dapat dipisahkan sehingga rosenstraße dan rosen straße setara.
Parsing Alamat Internasional : Bidang Acak Bersyarat yang Parses "123 Main Street New York New York" menjadi {"House_number": 123, "Road": "Main Street", "City": "New York", "State": "New York"}. Parser bekerja untuk berbagai macam negara dan bahasa, bukan hanya AS/Bahasa Inggris. Model ini dilatih pada lebih dari 1 miliar alamat dan string seperti alamat, menggunakan template dalam OpenCage Alamat Memformat repo untuk membangun contoh yang diformat dan ditandai untuk setiap negara yang dihuni di dunia. Banyak jenis normalisasi dilakukan untuk membuat data pelatihan menyerupai input geocoder yang berantakan sedekat mungkin.
Klasifikasi Bahasa : Regresi logistik multinomial dilatih (menggunakan metode FTRL-proximal untuk menginduksi sparsity) pada semua cara OpenStreetMap, addr:* Tag, toponim, dan alamat yang diformat. Label diturunkan menggunakan tes point-in-polygon untuk negara OSM dan bahasa resmi/regional untuk masing-masing negara dan admin 1 batas. Jadi, misalnya, bahasa Spanyol adalah bahasa default di Spanyol tetapi di daerah yang berbeda misalnya Catalunya, Galicia, wilayah Basque, bahasa regional masing -masing adalah default. Disambiguasi berbasis kamus digunakan dalam kasus-kasus di mana bahasa regional adalah non-default misalnya Welsh, Breton, Occitan. Kamus juga digunakan untuk menyingkat frasa kanonik seperti "calle" => "c/" (dilakukan pada pengklasifikasi bahasa dan set pelatihan parser alamat)
Ekspresi numerik parsing ("dua puluh pertama" => 21, "quatre-vingt-douze" => 92, sekali lagi menggunakan data yang disediakan dalam cldr), mendukung> 30 bahasa. Menangani bahasa dengan ekspresi gabungan misalnya milleottocento => 1800. Secara opsional menormalkan angka Romawi terlepas dari bahasa (ix => 9) yang terjadi pada nama banyak raja, paus, dll.
Tokenisasi / lexing yang cepat dan akurat : clock pada> 1m token / detik, mengimplementasikan spesifikasi TR-29 untuk segmentasi kata UTF8, tokenize bahasa Asia Timur berkapur berdasarkan karakter alih-alih di whitespace.
Normalisasi UTF8 : Secara opsional mendekomposisi bentuk normalisasi UTF8 ke NFD, strip aksen tanda misalnya à => a dan/atau menerapkan transliterasi Latin-ASCII.
Transliterasi : misalnya улица => Ulica atau Ulitsa. Menggunakan semua transformasi CLDR, data sumber yang sama persis seperti yang digunakan oleh ICU, meskipun Libpostal tidak memerlukan menarik semua ICU (mungkin bertentangan dengan versi sistem Anda). Catatan: Beberapa bahasa, terutama bahasa Ibrani, Arab, dan Thailand mungkin tidak termasuk vokal dan dengan demikian tidak akan sering cocok dengan transliterasi yang dilakukan oleh manusia. Dimungkinkan untuk mengimplementasikan transliterator statistik untuk beberapa bahasa ini.
Deteksi skrip : Mendeteksi skrip mana yang digunakan string yang diberikan (dapat berganda misalnya alamat Hong Kong atau Makau yang dapat dibentuk dapat menggunakan skrip Han dan Latin dalam alamat yang sama). Dalam transliterasi kita dapat menggunakan semua transliterator yang berlaku untuk skrip Unicode yang diberikan (Yunani misalnya dapat ditransliterasikan dengan bahasa Yunani-Latin, Yunani-Latin-BGN dan Yunani-Latin-UngEGN).
Libpostal awalnya dibuat sebagai bagian dari proyek OpenVenues untuk menyelesaikan masalah pengabdian venue. Di OpenVenues, kami memiliki set data jutaan tempat yang berasal dari terabyte halaman web dari perayapan umum. Perayapan umum diterbitkan setiap bulan, dan bahkan menggabungkan hasil dua perayapan menghasilkan duplikat yang signifikan.
Deduping adalah bidang yang relatif dipelajari, dan untuk dokumen teks seperti halaman web, makalah akademik, dll. Ada metode kesamaan perkiraan yang cukup layak seperti Minhash.
Namun, untuk alamat fisik, sering menggunakan singkatan konvensional seperti Road == RD, California == CA, atau New York City == NYC menyulitkan sedikit masalah. Bahkan menggunakan teknik seperti Minhash, yang sangat cocok untuk perkiraan kecocokan dan setara dengan kesamaan Jaccard dari dua set, kami harus bekerja dengan teks yang sangat pendek dan sering kali merupakan kasus bahwa dua alamat yang setara, satu disingkat dan satu sepenuhnya ditentukan, tidak akan sangat cocok dalam hal tumpang tindih N-gram yang ditenang. Dalam skrip non-Latin, katakanlah alamat Rusia dan setara dengan transliterasi, dapat dibayangkan bahwa dua alamat yang merujuk pada tempat yang sama mungkin tidak cocok bahkan satu karakter tunggal.
Sebagai contoh yang memotivasi, pertimbangkan dua cara setara berikut untuk menulis alamat jalanan Manhattan tertentu dengan berbagai konvensi dan tingkat verbositas:
Jelas '30 W 26th ST FL #7! = '30 Lantai Jalanan Twenty-Sixth Barat Nomor 7 'dalam arti perbandingan string, tetapi manusia dapat grok bahwa kedua alamat ini mengacu pada lokasi fisik yang sama.
Libpostal bertujuan untuk membuat string geografis yang dinormalisasi, diuraikan menjadi komponen, sehingga kita dapat lebih efektif beralasan tentang seberapa baik dua alamat sebenarnya cocok dan membuat keputusan sisi server otomatis tentang dupes.
Jika di atas terdengar sangat mirip dengan geocoding, itu karena itu ada di satu sisi, hanya dalam kasus OpenVenues, kita harus geocode tanpa UI atau pengguna untuk memilih alamat yang benar dalam dropdown lengkap. Mengingat basis data alamat sumber seperti OpenAddresses atau OpenStreetMap (atau semua hal di atas), LibPostal dapat digunakan untuk mengimplementasikan hal-hal seperti deduping alamat dan geocoding batch sisi server dalam pengaturan seperti MapReduce atau pemrosesan aliran.
Sekarang, alih-alih mencoba membuat konvensi khusus alamat ke mesin pencari dokumen tradisional seperti Elasticsearch menggunakan file sinonim raksasa, skrip, analisis khusus, token, dan sejenisnya, geocoding dapat terlihat seperti ini:
Dengan cara ini, Libpostal dapat melakukan pencocokan alamat fuzzy dalam waktu konstan relatif terhadap ukuran set data.
Libpostal ditulis dalam C karena tiga alasan (dalam urutan kepentingan):
Portabilitas/Ubiquity : Libpostal menargetkan bahasa tingkat lebih tinggi yang benar-benar digunakan orang: Python, Go, Ruby, NodeJs, dll. Keindahan C adalah bahwa hampir semua bahasa pemrograman dapat mengikatnya dan Compiler C Stand Tanpa Stand Tanpa Berdiri, dan Tuliskan Tanpa Binding. Kami mendukung Mac/Linux (Windows bukanlah prioritas tetapi dengan senang hati menerima tambalan), memiliki format file AutoTools standar dan format file endianness-agnostik untuk file data. Binding Python, dipertahankan sebagai bagian dari repo ini karena mereka diperlukan untuk membangun data pelatihan.
Efisiensi memori : Libpostal dirancang untuk berjalan dalam pengaturan MapReduce di mana kita mungkin terbatas pada <1GB RAM per proses tergantung pada konfigurasi mesin. Sebanyak mungkin libpostal menggunakan array yang berdekatan, mencoba (dibangun di atas susunan yang berdekatan), filter mekar dan matriks jarang terkompresi untuk menjaga penggunaan memori tetap rendah. Dimungkinkan untuk menggunakan Libpostal pada perangkat seluler dengan model yang dilatih di satu negara atau beberapa negara.
Kinerja : Ini terakhir dalam daftar karena suatu alasan. Sebagian besar optimasi di Libpostal adalah untuk penggunaan memori daripada kinerja. Libpostal cukup cepat mengingat jumlah pekerjaan yang dilakukannya. Ini dapat memproses 10-30k alamat / detik dalam satu utas / proses pada platform yang telah kami uji (itu berarti memproses setiap alamat di planet OSM dalam waktu lebih dari satu jam). Lihatlah program benchmark sederhana untuk menguji lingkungan Anda dan berbagai jenis input. Dalam pengaturan MapReduce, kinerja per-core tidak sama pentingnya karena semuanya dilakukan secara paralel, tetapi ada beberapa aplikasi konsumsi streaming di Mapzen di mana ini perlu dijalankan dalam proses.
Libpostal ditulis dalam modern, terbaca, c99 dan menggunakan konvensi berikut:
Paket geodata python dalam repo libpostal berisi pipa untuk preprocessing berbagai set data GEO dan membangun data pelatihan untuk model C untuk digunakan. Paket ini seharusnya tidak diperlukan untuk sebagian besar pengguna, tetapi bagi mereka yang tertarik untuk menghasilkan jenis alamat baru atau meningkatkan data pelatihan Libpostal, ini adalah tempat untuk mencari.
Pada data uji yang ditahan (makna berlabel parse yang belum pernah dilihat model sebelumnya), parser alamat mencapai 99,45% akurasi parse penuh.
Untuk beberapa tugas seperti pengenalan entitas bernama, lebih baik menggunakan sesuatu seperti skor atau varian F1, sebagian besar karena ada masalah bias kelas (sebagian besar kata adalah non-entitas, dan sistem yang hanya memprediksi non-entitas untuk setiap token sebenarnya akan bekerja dengan cukup baik dalam hal akurasi). Itu tidak berlaku untuk penguraian alamat. Setiap token memiliki label dan ada jutaan contoh setiap kelas dalam data pelatihan, sehingga akurasi lebih disukai karena merupakan ukuran kinerja yang bersih, sederhana dan intuitif.
Di sini kami menggunakan akurasi parse penuh, artinya kami hanya memberikan parser satu "titik" di pembilang jika mendapatkan setiap token dalam alamat yang benar. Itu harus menjadi ukuran yang lebih baik daripada sekadar melihat apakah masing -masing token benar.
Meskipun parser saat ini bekerja cukup baik untuk sebagian besar alamat standar, masih ada ruang untuk perbaikan, terutama dalam memastikan data pelatihan yang kami gunakan sedekat mungkin untuk alamat di alam liar. Ada dua cara utama parser alamat dapat ditingkatkan lebih jauh (dalam urutan kesulitan):
Laporan bug, masalah, dan permintaan tarik dipersilakan. Silakan baca panduan yang berkontribusi sebelum mengirimkan masalah Anda, laporan bug, atau permintaan tarik.
Kirimkan masalah di: https://github.com/openvenues/libpostal/issues.
Terima kasih khusus kepada @benk10 untuk build windows awal dan @aeroxuk untuk mengintegrasikannya dengan mulus ke dalam proyek dan menyiapkan build appveyor.
Perangkat lunak ini tersedia sebagai open source di bawah ketentuan lisensi MIT.