Libpostal เป็นห้องสมุด C สำหรับการแยกวิเคราะห์/การปรับที่อยู่บนถนนทั่วโลกโดยใช้ NLP ทางสถิติและข้อมูลแบบเปิด เป้าหมายของโครงการนี้คือการเข้าใจสตริงที่ใช้สถานที่ในทุกภาษาทุกที่ สำหรับภาพรวมที่ครอบคลุมมากขึ้นของการวิจัยที่อยู่เบื้องหลัง libpostal โปรดตรวจสอบโพสต์บล็อกเบื้องต้น (ยาว):
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ที่อยู่และสถานที่ที่พวกเขาเป็นตัวแทนมีความจำเป็นสำหรับแอปพลิเคชันใด ๆ ที่เกี่ยวข้องกับแผนที่ (การค้นหาสถานที่การขนส่งบริการตามความต้องการ/การจัดส่งเช็คอินทบทวน) ถึงกระนั้นที่อยู่ที่ง่ายที่สุดก็เต็มไปด้วยการประชุมตัวย่อและบริบทในท้องถิ่นทำให้ยากต่อการจัดทำดัชนี/สอบถามอย่างมีประสิทธิภาพด้วยเครื่องมือค้นหาข้อความแบบเต็มแบบดั้งเดิม ไลบรารีนี้ช่วยแปลงที่อยู่ฟรีฟอร์มที่มนุษย์ใช้เป็นรูปแบบปกติที่สะอาดเหมาะสำหรับการเปรียบเทียบเครื่องและการจัดทำดัชนีข้อความเต็มรูปแบบ แม้ว่า Libpostal จะไม่ได้เป็น Geocoder เต็มรูปแบบ แต่ก็สามารถใช้เป็นขั้นตอนการประมวลผลล่วงหน้าเพื่อให้แอปพลิเคชัน Geocoding ใด ๆ ฉลาดขึ้นง่ายขึ้นและสอดคล้องกันในระดับสากลมากขึ้น
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ห้องสมุดหลักเขียนด้วยการผูกภาษา C. บริสุทธิ์สำหรับ Python, Ruby, GO, Java, PHP และ NodeJs ได้รับการสนับสนุนอย่างเป็นทางการและเป็นเรื่องง่ายที่จะเขียนการผูกในภาษาอื่น ๆ
หาก บริษัท ของคุณใช้ libpostal ให้พิจารณาขอให้องค์กรของคุณสนับสนุนโครงการ การตีความสิ่งที่มนุษย์หมายถึงเมื่อพวกเขาอ้างถึงสถานที่นั้นอยู่ไกลจากปัญหาที่ได้รับการแก้ไขและการสนับสนุนช่วยให้เราติดตามพรมแดนใหม่ใน Geospatial NLP ในฐานะสปอนเซอร์โลโก้ บริษัท ของคุณจะปรากฏอย่างเด่นชัดในหน้า GitHub Repo พร้อมกับลิงก์ไปยังเว็บไซต์ของคุณ ข้อมูลการสนับสนุน
ผู้ใช้แต่ละคนยังสามารถช่วยสนับสนุนการวิจัย Geo NLP แบบเปิดโดยการบริจาครายเดือน:
ก่อนที่คุณจะติดตั้งตรวจสอบให้แน่ใจว่าคุณมีข้อกำหนดเบื้องต้นดังต่อไปนี้:
บน Ubuntu/Debian
sudo apt-get install curl autoconf automake libtool pkg-config
บน centos/rhel
sudo yum install curl autoconf automake libtool pkgconfig
บน Mac OSX
brew install curl autoconf automake libtool pkg-config
จากนั้นเพื่อติดตั้งไลบรารี C:
หากคุณใช้ M1 Mac ให้เพิ่ม --disable-sse2 ไปยังคำสั่ง ./configure ซึ่งจะส่งผลให้ประสิทธิภาพต่ำกว่า แต่การสร้างจะประสบความสำเร็จ
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 มีการสนับสนุน PKG-Config ดังนั้นคุณสามารถใช้ PKG-Config เพื่อพิมพ์ธงที่จำเป็นในการเชื่อมโยงโปรแกรมของคุณกับมัน:
pkg-config --cflags libpostal # print compiler flags
pkg-config --libs libpostal # print linker flags
pkg-config --cflags --libs libpostal # print both
ตัวอย่างเช่นหากคุณเขียนโปรแกรมที่เรียกว่า app.c คุณสามารถรวบรวมได้เช่นนี้:
gcc app.c `pkg-config --cflags --libs libpostal`
MSYS2/MINGW
สำหรับ Windows ขั้นตอนการสร้างปัจจุบันต้องใช้ MSYS2 และ MINGW สามารถดาวน์โหลดได้จาก http://msys2.org โปรดทำตามคำแนะนำในเว็บไซต์ MSYS2 สำหรับการติดตั้ง
โปรดตรวจสอบให้แน่ใจว่า MSYS2 เป็นข้อมูลล่าสุดโดยการรัน:
pacman -Syu
ติดตั้งข้อกำหนดเบื้องต้นต่อไปนี้:
pacman -S autoconf automake curl git make libtool gcc mingw-w64-x86_64-gcc
จากนั้นเพื่อสร้างห้องสมุด 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
หมายเหตุ: เมื่อตั้งค่า Datadir ไดรฟ์ C: จะถูกป้อนเป็น /c สคริปต์ libpostal build เพิ่ม libpostal โดยอัตโนมัติในตอนท้ายของเส้นทางดังนั้น '/c' จะกลายเป็น C:libpostal on Windows
. dll ที่รวบรวมจะอยู่ใน src/.libs/ ไดเรกทอรีและควรเรียกว่า libpostal-1.dll
หากคุณต้องการไลบรารีนำเข้า. LIB เพื่อเชื่อมโยงสิ่งนี้กับแอปพลิเคชันของคุณ คุณสามารถสร้างหนึ่งโดยใช้เครื่องมือ Visual Studio lib.exe และไฟล์นิยาม libpostal.def :
lib.exe /def:libpostal.def /out:libpostal.lib /machine:x64
รูปแบบข้อมูลทางเลือกมีให้สำหรับ libpostal มันถูกสร้างขึ้นโดย Senzing Inc. เพื่อปรับปรุงการแยกวิเคราะห์ที่อยู่ในสหรัฐอเมริกาสหราชอาณาจักรและสิงคโปร์และปรับปรุงการจัดการที่อยู่ในชนบทของสหรัฐอเมริกา เพื่อเปิดใช้งาน Add MODEL=senzing ไปยังสาย conigure ระหว่างการติดตั้ง:
./configure --datadir=[...some dir with a few GB of space...] MODEL=senzing
ข้อมูลสำหรับรุ่นนี้ได้มาจาก OpenAddress, OpenStreetMap และข้อมูลที่สร้างขึ้นโดย Senzing ตามความคิดเห็นของลูกค้า (ไม่กี่ร้อยระเบียน) รวมข้อมูลทั้งหมด 1.2 พันล้านบันทึกจากกว่า 230 ประเทศใน 100 ภาษา ข้อมูลจาก OpenStreetMap และ OpenAddress นั้นดี แต่ไม่สมบูรณ์แบบดังนั้นชุดข้อมูลได้รับการแก้ไขโดยการกรองที่อยู่ที่เกิดขึ้นไม่ดีการแก้ไขโทเค็นที่อยู่ที่จำแนกประเภทและถอดโทเค็นที่ไม่ได้อยู่ในที่อยู่เมื่อใดก็ตามที่พบเงื่อนไขเหล่านี้
Senzing สร้างชุดข้อมูลของ 12950 ที่อยู่จาก 89 ประเทศที่ใช้ในการทดสอบและตรวจสอบคุณภาพของแบบจำลอง ชุดข้อมูลถูกสร้างขึ้นโดยใช้ที่อยู่สุ่มจาก OSM น้อยที่สุด 50 ต่อประเทศ ที่อยู่ที่ยากต่อการเสียค่าใช้จ่ายมาจากทีมสนับสนุน Senzing และลูกค้าและจากหน้า Libpostal GitHub และเพิ่มเข้าไปในชุดนี้ โมเดล Senzing ได้ผลลัพธ์การแยกวิเคราะห์ที่ดีกว่ารุ่นเริ่มต้น 4.3% โดยใช้ชุดทดสอบนี้
ขนาดของรุ่นนี้อยู่ที่ประมาณ 2.2GB เมื่อเทียบกับ 1.8GB สำหรับรุ่นเริ่มต้นดังนั้นโปรดจำไว้ว่าถ้าพื้นที่เก็บรักษามีความสำคัญ
ข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบข้อมูลนี้สามารถดูได้ที่: https://github.com/senzing/libpostal-data หากคุณพบปัญหาใด ๆ กับรุ่นนี้ไม่ว่าพวกเขา
ตัวแยกวิเคราะห์ที่อยู่ระหว่างประเทศของ Libpostal ใช้การเรียนรู้ของเครื่องจักร (เขตข้อมูลแบบสุ่มตามเงื่อนไข) และได้รับการฝึกฝนในที่อยู่มากกว่า 1 พันล้านที่อยู่ในทุกประเทศที่อาศัยอยู่บนโลก เราใช้ OpenStreetMap และ OpenAddresses เป็นแหล่งที่อยู่ที่มีโครงสร้างและเทมเพลตรูปแบบที่อยู่ opencage ที่: https://github.com/opencagedata/address- รูปแบบเพื่อสร้างข้อมูลการฝึกอบรมเสริมด้วยการมีรูปหลายเหลี่ยม นอกจากนี้เรายังเพิ่มตัวย่อวางส่วนประกอบแบบสุ่ม ฯลฯ เพื่อให้ตัวแยกวิเคราะห์มีความแข็งแกร่งที่สุดเท่าที่จะเป็นไปได้ในการป้อนข้อมูลในโลกแห่งความเป็นจริง
ตัวอย่างการแยกวิเคราะห์เหล่านี้นำมาจากโปรแกรม address_parser แบบโต้ตอบที่สร้างด้วย libpostal เมื่อคุณเรียกใช้ make โปรดทราบว่าตัวแยกวิเคราะห์สามารถจัดการเครื่องหมายจุลภาคกับไม่มีเครื่องหมายจุลภาครวมถึงปลอกและการเรียงสับเปลี่ยนของส่วนประกอบต่าง ๆ (หากอินพุตเป็นเพียงแค่เมืองหรือเพียงแค่เมือง/รหัสไปรษณีย์)
Parser บรรลุความแม่นยำสูงมากในข้อมูลที่ถือออกมาปัจจุบัน 99.45% ถูกต้องพาร์ทูเต็มรูปแบบ (หมายถึง 1 ในตัวเศษเพื่อให้ได้โทเค็น ทุกอย่าง ในที่อยู่ที่ถูกต้อง)
นี่คือตัวอย่างของ Parser API โดยใช้การผูก Python:
from postal . parser import parse_address
parse_address ( 'The Book Club 100-106 Leonard St Shoreditch London EC2A 4RH, United Kingdom' )และตัวอย่างกับ 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 ();
}ตัวแยกวิเคราะห์ที่อยู่สามารถใช้ป้ายกำกับสตริงใด ๆ ที่กำหนดไว้ในข้อมูลการฝึกอบรม แต่สิ่งเหล่านี้เป็นสิ่งที่กำหนดไว้ในปัจจุบันตามฟิลด์ที่กำหนดไว้ในไลบรารีการจัดรูปแบบที่อยู่ของ OpenCage รวมถึง Libpostal ที่เพิ่มเข้ามาเพื่อจัดการรูปแบบเฉพาะ:
Expand_address API แปลงที่อยู่ในโลกแห่งความเป็นจริงเป็นเรื่องปกติเทียบเท่ากับการทำดัชนีการค้นหาการแฮช ฯลฯ
นี่คือตัวอย่างแบบโต้ตอบโดยใช้การผูก Python:
Libpostal มีตัวจําแนกภาษาที่ได้รับการฝึกอบรมเกี่ยวกับ OSM เพื่อตรวจจับภาษาที่ใช้ในที่อยู่ที่กำหนดเพื่อให้สามารถใช้การปรับสภาพที่เหมาะสม อินพุตที่ต้องการเพียงอย่างเดียวคือสตริงที่อยู่ดิบ นี่คือรายการสั้น ๆ ของการปกติที่ตรงไปตรงมาน้อยกว่าในภาษาต่างๆ
| ป้อนข้อมูล | เอาต์พุต (อาจมีหลายใน libpostal) |
|---|---|
| หนึ่งร้อยยี่สิบ E 96th เซนต์ | 120 East 96th Street |
| c/ ocho, pi 4 | Calle 8 Polígono Industrial 4 |
| v xx settembre, 20 | ผ่าน 20 Settembre 20 |
| Quatre Vingt Douze R. de l'église | 92 rue de l eglise |
| укаретныйря, д 4, строение 7 | уицакаретныирядом 4 строение 7 |
| укаретныйря, д 4, строение 7 | Ulitsa Karetnyy Ryad Dom 4 Stroyeniye 7 |
| Marktstraße 14 | Markt Strasse 14 |
ปัจจุบัน Libpostal รองรับการปกติประเภทนี้ใน 60 ภาษา และคุณสามารถเพิ่มได้มากขึ้น (โดยไม่ต้องเขียน C)
สำหรับการอ่านเพิ่มเติมและที่อยู่ที่แปลกประหลาดบางกรณีโปรดดู: โปรแกรมเมอร์เท็จเชื่อเกี่ยวกับที่อยู่
นี่คือตัวอย่างที่ใช้การผูก python เพื่อความกระชับ (ส่วนใหญ่ของการผูกภาษาระดับสูงกว่านั้นคล้ายกัน):
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 )C เทียบเท่า 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_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 ();
}หลังจากสร้าง libpostal:
cd src/
./libpostal "Quatre vingt douze Ave des Champs-Élysées"
หากคุณมีไฟล์ข้อความหรือสตรีมที่มีหนึ่งที่อยู่ต่อบรรทัดอินเตอร์เฟสบรรทัดคำสั่งยังรับอินพุตจาก stdin:
cat some_file | ./libpostal --json
หลังจากสร้าง libpostal:
cd src/
./address_parser
address_parser เป็นเปลือกแบบโต้ตอบ เพียงพิมพ์ที่อยู่และ libpostal จะแยกวิเคราะห์และพิมพ์ผลลัพธ์
Libpostal ได้รับการออกแบบให้ใช้โดยภาษาระดับสูง หากคุณไม่เห็นภาษาที่คุณเลือกหรือหากคุณกำลังเขียนภาษามีผลผูกพันโปรดแจ้งให้เราทราบ!
การเชื่อมโยงภาษาที่ได้รับการสนับสนุนอย่างเป็นทางการ
การผูกภาษาที่ไม่เป็นทางการ
ส่วนขยายฐานข้อมูล
ส่วนที่เหลืออย่างไม่เป็นทางการ API
Libpostal Rest Docker
Libpostal Zeromq Docker
Libpostal ใช้มากที่สุดสำหรับการทดสอบอัตโนมัติ ในการเรียกใช้การทดสอบใช้:
make check
การเพิ่มกรณีทดสอบเป็นเรื่องง่ายแม้ว่า C ของคุณจะเป็นสนิม/ไม่มีอยู่จริงและเราชอบการมีส่วนร่วม เราใช้การทดสอบการทำงานส่วนใหญ่ตรวจสอบอินพุตสตริงกับเอาต์พุตสตริง
Libpostal ยังได้รับการทดสอบการต่อสู้เป็นระยะ ๆ เกี่ยวกับที่อยู่นับล้านจาก OSM (สะอาด) รวมถึงการสืบค้นที่ไม่ระบุชื่อจาก Geocoder ที่ผลิต (ไม่สะอาด) ในระหว่างกระบวนการนี้เราใช้ Valgrind เพื่อตรวจสอบการรั่วไหลของหน่วยความจำและข้อผิดพลาดอื่น ๆ
libpostal ต้องการดาวน์โหลดไฟล์ข้อมูลบางส่วนจาก S3 ไฟล์พื้นฐานคือการแสดงบนดิสก์ของโครงสร้างข้อมูลที่จำเป็นในการขยายการขยายตัว สำหรับการแยกวิเคราะห์ที่อยู่เนื่องจากการฝึกอบรมแบบจำลองใช้เวลาสองสามวันเราจึงเผยแพร่โมเดลที่ผ่านการฝึกอบรมอย่างเต็มที่ไปยัง S3 และจะอัปเดตโดยอัตโนมัติเมื่อที่อยู่ใหม่ได้รับการเพิ่มลงใน OSM, OpenAddresses ฯลฯ เหมือนกันไปสำหรับรูปแบบการแยกประเภทภาษา
ไฟล์ข้อมูลจะถูกดาวน์โหลดโดยอัตโนมัติเมื่อคุณเรียกใช้ ในการตรวจสอบและดาวน์โหลดไฟล์ข้อมูลใหม่ใด ๆ คุณสามารถเรียกใช้ make หรือ Run:
libpostal_data download all $YOUR_DATA_DIR/libpostal
และแทนที่ $ your_data_dir ด้วยสิ่งที่คุณผ่านไปเพื่อกำหนดค่าระหว่างการติดตั้ง
Libpostal มีพจนานุกรมต่อภาษาจำนวนมากที่มีอิทธิพลต่อการขยายตัวตัวจําแนกภาษาและตัวแยกวิเคราะห์ ในการสำรวจพจนานุกรมหรือมีส่วนร่วมตัวย่อ/วลีในภาษาของคุณดูทรัพยากร/พจนานุกรม
ในการเรียนรู้ของเครื่องข้อมูลการฝึกอบรมจำนวนมากมักเป็นสิ่งจำเป็นสำหรับการได้รับผลลัพธ์ที่ดี โครงการการเรียนรู้ของเครื่องโอเพนซอร์ซจำนวนมากจะเปิดตัวเฉพาะรหัสรุ่น
Libpostal นั้นแตกต่างกันเล็กน้อยเพราะได้รับการฝึกฝนเกี่ยวกับข้อมูลแบบเปิดที่ทุกคนมีให้ดังนั้นเราจึงได้เปิดตัวไปป์ไลน์การฝึกอบรมทั้งหมด (แพ็คเกจ GeoData ใน repo นี้) รวมถึงข้อมูลการฝึกอบรมที่เกิดขึ้นบนคลังอินเทอร์เน็ต มันมีการคลายออกมามากกว่า 100GB
ข้อมูลการฝึกอบรมจะถูกเก็บไว้ใน Archive.org ภายในวันที่พวกเขาถูกสร้างขึ้น นอกจากนี้ยังมีไฟล์ที่เก็บไว้ในไดเรกทอรีหลักของ repo นี้ที่เรียกว่า current_parser_training_set ซึ่งเก็บวันที่ของชุดฝึกอบรมที่สร้างขึ้นล่าสุด หากต้องการชี้ไปที่ข้อมูลล่าสุดให้ลองบางอย่างเช่น: latest=$(cat current_parser_training_set) และใช้ตัวแปรนั้นแทนวันที่
ไฟล์ทั้งหมดสามารถดูได้ที่ https://archive.org/download/libpostal-parser-training-data-yyyymmdd/$file เป็นไฟล์ GZIP'd Tab ที่แยก (TSV) รูปแบบ: languagetcountrytaddress
หากตัวแยกวิเคราะห์ไม่ทำงานเช่นเดียวกับที่คุณหวังไว้ในที่อยู่ประเภทใดประเภทหนึ่งการขอความช่วยเหลือที่ดีที่สุดคือการใช้ GREP/AWK เพื่อดูข้อมูลการฝึกอบรมและพยายามตรวจสอบว่ามีรูปแบบ/รูปแบบของที่อยู่ที่ไม่ได้ถูกจับหรือไม่
การขยายตัวของตัวย่อ : เช่นการขยาย "RD" => "Road" แต่สำหรับเกือบทุกภาษา libpostal รองรับ> 50 ภาษาและง่ายต่อการเพิ่มภาษาใหม่หรือขยายพจนานุกรมปัจจุบัน ได้รับการสนับสนุนภาษาอุดมการณ์ (ไม่ได้คั่นด้วยช่องว่างเช่นภาษาจีน) เช่นเดียวกับภาษาเยอรมันที่ประเภททางสัญจรถูกต่อกันไปที่จุดสิ้นสุดของสตริงและอาจถูกแยกออกจากกัน
การแยกวิเคราะห์ที่อยู่ระหว่างประเทศ : สนามสุ่มแบบมีเงื่อนไขซึ่งแยกวิเคราะห์ "123 Main Street New York New York" เป็น {"House_number": 123, "Road": "Main Street", "City": "New York", "State": "New York"} ตัวแยกวิเคราะห์ใช้งานได้สำหรับประเทศและภาษาที่หลากหลายไม่ใช่แค่สหรัฐอเมริกา/อังกฤษ โมเดลได้รับการฝึกฝนบนที่อยู่มากกว่า 1 พันล้านที่อยู่และสตริงที่อยู่ที่อยู่โดยใช้เทมเพลตในการจัดรูปแบบที่อยู่ OpenCage เพื่อสร้างรูปแบบการจัดรูปแบบแท็กตัวอย่าง traning สำหรับทุกประเทศที่อาศัยอยู่ในโลก มีการทำงานให้เป็นมาตรฐานหลายประเภทเพื่อให้ข้อมูลการฝึกอบรมมีลักษณะคล้ายกับอินพุต Geocoder ที่ยุ่งเหยิงจริงอย่างใกล้ชิดที่สุด
การจำแนกประเภทภาษา : การฝึกอบรมการถดถอยแบบพหุนาม (ใช้วิธี FTRL-Proximal เพื่อกระตุ้นให้เกิด sparsity) ในทุกวิธี OpenStreetMap, ADDR:* แท็ก, toponyms และที่อยู่ที่จัดรูปแบบ ฉลากได้รับมาโดยใช้การทดสอบแบบพอยต์อินโพลีกอนสำหรับทั้งประเทศ OSM และภาษาอย่างเป็นทางการ/ภูมิภาคสำหรับประเทศและเขตแดนผู้ดูแลระบบ 1 ตามลำดับ ตัวอย่างเช่นภาษาสเปนเป็นภาษาเริ่มต้นในสเปน แต่ในภูมิภาคต่าง ๆ เช่น Catalunya, Galicia, ภูมิภาคบาสก์, ภาษาภูมิภาคที่เกี่ยวข้องเป็นค่าเริ่มต้น ความไม่ลงรอยกันตามพจนานุกรมใช้ในกรณีที่ภาษาระดับภูมิภาคไม่ได้รับการป้องกันเช่น Welsh, Breton, Occitan พจนานุกรมยังใช้ในการย่อวลีที่เป็นที่ยอมรับเช่น "Calle" => "C/" (ดำเนินการทั้งในตัวจําแนกภาษาและชุดฝึกอบรมที่อยู่
การแยกวิเคราะห์นิพจน์ตัวเลข ("ยี่สิบคนแรก" => 21, "quatre-vistt-douze" => 92 อีกครั้งโดยใช้ข้อมูลที่ให้ไว้ใน CLDR) รองรับ> 30 ภาษา จัดการภาษาด้วยนิพจน์ที่ต่อกันเช่น Milleottocento => 1800. เป็นทางเลือกให้เป็นปกติของตัวเลขโรมันโดยไม่คำนึงถึงภาษา (ix => 9) ซึ่งเกิดขึ้นในชื่อของพระมหากษัตริย์พระสันตะปาปา ฯลฯ จำนวนมาก ฯลฯ
Tokenization / Lexing ที่รวดเร็วและแม่นยำ : โอเวอร์คล็อกที่> 1M โทเค็น / วินาทีใช้ข้อมูลจำเพาะ TR-29 สำหรับการแบ่งส่วนคำ UTF8, tokenizes ภาษาเอเชียตะวันออก Chracter โดยตัวละครแทนบนช่องว่าง
การทำให้เป็นมาตรฐานของ UTF8 : การย่อยสลาย UTF8 เป็นแบบฟอร์มการทำให้เป็นมาตรฐาน NFD, เครื่องหมายสำเนียงแถบเช่นà => a และ/หรือใช้การแปลภาษาละติน -ASCII
การแปล : เช่นуица => ulica หรือ ulitsa ใช้การแปลง CLDR ทั้งหมดข้อมูลแหล่งข้อมูลเดียวกับที่ใช้โดย ICU แม้ว่า Libpostal ไม่จำเป็นต้องดึงใน ICU ทั้งหมด (อาจขัดแย้งกับเวอร์ชันของระบบของคุณ) หมายเหตุ: บางภาษาโดยเฉพาะภาษาฮีบรูอาหรับและไทยอาจไม่รวมเสียงสระและมักจะไม่ตรงกับการถอดเสียงโดยมนุษย์ อาจเป็นไปได้ที่จะใช้เครื่องพ่นต่อสถิติสำหรับบางภาษาเหล่านี้
การตรวจจับสคริปต์ : ตรวจพบสคริปต์ที่สตริงที่กำหนดใช้ (สามารถเป็นหลายอย่างเช่นที่อยู่ฮ่องกงหรือมาเก๊าแบบอิสระอาจใช้ทั้งสคริปต์ฮันและละตินในที่อยู่เดียวกัน) ในการแปลเราสามารถใช้ตัวแปลความหมายทั้งหมดที่เกี่ยวข้องสำหรับสคริปต์ Unicode ที่กำหนด (กรีกสามารถทำเช่นนั้นได้กับการทับถมด้วยกรีก-ลาติน, กรีก-ลาติน-บินและกรีก-ลาติน-อิงเน็กน์)
Libpostal ถูกสร้างขึ้นเป็นส่วนหนึ่งของโครงการ OpenVenues เพื่อแก้ปัญหาการอุทิศสถานที่ ใน OpenVenues เรามีชุดข้อมูลหลายล้านแห่งที่ได้มาจากหน้าเว็บของหน้าเว็บจากการรวบรวมข้อมูลทั่วไป การรวบรวมข้อมูลทั่วไปได้รับการตีพิมพ์เป็นรายเดือนและแม้กระทั่งการรวมผลลัพธ์ของการรวบรวมข้อมูลสองครั้งทำให้เกิดซ้ำที่สำคัญ
Deduping เป็นสาขาที่ค่อนข้างมีการศึกษาดีและสำหรับเอกสารข้อความเช่นหน้าเว็บเอกสารทางวิชาการ ฯลฯ มีวิธีการที่คล้ายคลึงกันโดยประมาณที่เหมาะสมเช่น Minhash
อย่างไรก็ตามสำหรับที่อยู่ทางกายภาพการใช้ตัวย่อแบบดั้งเดิมบ่อยครั้งเช่น Road == RD, California == CA หรือ New York City == NYC มีความซับซ้อนเล็กน้อย แม้จะใช้เทคนิคเช่น Minhash ซึ่งเหมาะสำหรับการแข่งขันโดยประมาณและเทียบเท่ากับความคล้ายคลึงกันของ Jaccard ของสองชุดเราต้องทำงานกับข้อความสั้น ๆ มากและมักจะเป็นกรณีที่ที่อยู่ที่เทียบเท่าสองตัว ในสคริปต์ที่ไม่ใช่ละตินพูดว่าที่อยู่รัสเซียและที่เทียบเท่ากับการถอดเสียงนั้นเป็นไปได้ว่าที่อยู่สองที่อ้างถึงสถานที่เดียวกันอาจไม่ตรงกับแม้แต่ตัวละครตัวเดียว
เป็นตัวอย่างที่สร้างแรงบันดาลใจให้พิจารณาสองวิธีที่เทียบเท่าต่อไปนี้ในการเขียนที่อยู่ถนนแมนฮัตตันโดยเฉพาะที่มีการประชุมที่แตกต่างกันและองศาของคำกริยา:
เห็นได้ชัดว่า '30 W 26th St Fl #7! = '30 West Twenty-Sixth Street Number 7 'ในความหมายเปรียบเทียบสตริง แต่มนุษย์สามารถ grok ที่ที่อยู่ทั้งสองนี้อ้างถึงตำแหน่งทางกายภาพเดียวกัน
Libpostal มีจุดมุ่งหมายเพื่อสร้างสตริงทางภูมิศาสตร์ปกติแยกวิเคราะห์เป็นส่วนประกอบเพื่อให้เราสามารถให้เหตุผลได้อย่างมีประสิทธิภาพมากขึ้นเกี่ยวกับที่อยู่สองที่ตรงกับจริงและทำการตัดสินใจด้านเซิร์ฟเวอร์อัตโนมัติเกี่ยวกับ DUPES
หากข้างต้นฟังดูคล้ายกับ Geocoding นั่นเป็นเพราะมันเป็นไปในกรณีเฉพาะในกรณี OpenVenues เราต้องใช้ geocode โดยไม่ต้องใช้ UI หรือผู้ใช้เพื่อเลือกที่อยู่ที่ถูกต้องในแบบเลื่อนลงอัตโนมัติ ด้วยฐานข้อมูลของที่อยู่แหล่งที่อยู่เช่น OpenAdDresses หรือ OpenStreetMap (หรือทั้งหมดข้างต้น) LibPostal สามารถใช้เพื่อใช้สิ่งต่าง ๆ เช่นการจัดสรรที่อยู่และการเรียกร้องทางภูมิศาสตร์ด้านเซิร์ฟเวอร์ในการตั้งค่าเช่น MapReduce หรือการประมวลผลสตรีม
ตอนนี้แทนที่จะพยายามอบอนุสัญญาเฉพาะที่อยู่ลงในเครื่องมือค้นหาเอกสารแบบดั้งเดิมเช่น Elasticsearch โดยใช้ไฟล์คำพ้องความหมายยักษ์, สคริปต์, เครื่องวิเคราะห์ที่กำหนดเอง, โทเคนิเซอร์และสิ่งที่คล้ายกัน
ด้วยวิธีนี้ Libpostal สามารถทำการจับคู่ที่อยู่ฟัซซี่ในเวลาคงที่เมื่อเทียบกับขนาดของชุดข้อมูล
libpostal เขียนใน C ด้วยเหตุผลสามประการ (ตามลำดับความสำคัญ):
การพกพา/ubiquity : libpostal กำหนดเป้าหมายภาษาระดับสูงกว่าที่ผู้คนใช้จริง ๆ ในแต่ละวัน: Python, ไป, ทับทิม, nodejs ฯลฯ ความงามของ C คือภาษาการเขียนโปรแกรมใด ๆ ที่สามารถผูกมัดได้และคอมไพเลอร์ C เรารองรับ Mac/Linux (Windows ไม่ได้มีความสำคัญ แต่ยินดีที่จะรับ Patches) มีการสร้างอัตโนมัติแบบอัตโนมัติและรูปแบบไฟล์ endianness-Agnostic สำหรับไฟล์ข้อมูล การผูกมัด Python ได้รับการดูแลเป็นส่วนหนึ่งของ repo นี้เนื่องจากพวกเขาจำเป็นต้องสร้างข้อมูลการฝึกอบรม
ประสิทธิภาพของหน่วยความจำ : libpostal ได้รับการออกแบบให้ทำงานในการตั้งค่า MapReduce ซึ่งเราอาจถูก จำกัด ให้ <1GB ของ RAM ต่อกระบวนการขึ้นอยู่กับการกำหนดค่าเครื่อง มากที่สุดเท่าที่จะเป็นไปได้ libpostal ใช้อาร์เรย์ที่ต่อเนื่องกันพยายาม (สร้างขึ้นบนอาร์เรย์ที่ต่อเนื่องกัน) ตัวกรองบลูมและเมทริกซ์เบาบางบีบอัดเพื่อให้การใช้หน่วยความจำต่ำ เป็นไปได้ที่จะใช้ libpostal บนอุปกรณ์มือถือที่มีรุ่นที่ผ่านการฝึกอบรมในประเทศเดียวหรือประเทศไม่กี่ประเทศ
ประสิทธิภาพ : นี่คือสุดท้ายในรายการด้วยเหตุผล การเพิ่มประสิทธิภาพส่วนใหญ่ใน libpostal นั้นมีไว้สำหรับการใช้หน่วยความจำมากกว่าประสิทธิภาพ Libpostal ค่อนข้างเร็วเนื่องจากปริมาณงานที่ทำ มันสามารถประมวลผลที่อยู่ 10-30K / วินาทีในเธรด / กระบวนการเดียวบนแพลตฟอร์มที่เราทดสอบ (นั่นหมายถึงการประมวลผลทุกที่อยู่ใน OSM Planet ในเวลาน้อยกว่าหนึ่งชั่วโมง) ตรวจสอบโปรแกรมมาตรฐานอย่างง่ายเพื่อทดสอบสภาพแวดล้อมและอินพุตประเภทต่างๆ ในการตั้งค่า MapReduce ประสิทธิภาพต่อคอร์ไม่สำคัญเพราะทุกอย่างดำเนินการในแบบคู่ขนาน แต่มีแอปพลิเคชั่นการบริโภคสตรีมมิ่งที่ Mapzen ซึ่งจำเป็นต้องใช้ในกระบวนการ
libpostal เขียนในสมัยใหม่อ่านง่าย C99 และใช้อนุสัญญาต่อไปนี้:
แพ็คเกจ Geodata Python ใน libpostal repo มีท่อสำหรับการประมวลผลล่วงหน้าชุดข้อมูล GEO ต่างๆและการสร้างข้อมูลการฝึกอบรมสำหรับรุ่น C ที่จะใช้ แพ็คเกจนี้ไม่จำเป็นสำหรับผู้ใช้ส่วนใหญ่ แต่สำหรับผู้ที่สนใจในการสร้างที่อยู่ประเภทใหม่หรือปรับปรุงข้อมูลการฝึกอบรมของ Libpostal นี่คือสถานที่ที่จะมอง
ในข้อมูลการทดสอบที่จัดขึ้น (หมายถึงการแยกวิเคราะห์ที่มีป้ายกำกับว่าแบบจำลอง ไม่ เคยเห็นมาก่อน) ตัวแยกวิเคราะห์ที่อยู่ได้รับความแม่นยำในการแยกวิเคราะห์แบบเต็ม 99.45%
สำหรับงานบางอย่างเช่นการจดจำเอนทิตีที่มีชื่อดีกว่าที่จะใช้บางสิ่งบางอย่างเช่นคะแนน F1 หรือตัวแปรส่วนใหญ่เป็นเพราะมีปัญหาอคติในชั้นเรียน (คำส่วนใหญ่ไม่ใช่เอนทิตีและระบบที่คาดการณ์ว่าไม่ใช่เรื่องสำหรับโทเค็นทุกคนจะทำได้ดีในแง่ของความแม่นยำ) นั่นไม่ใช่กรณีสำหรับการแยกวิเคราะห์ที่อยู่ โทเค็นทุกคนมีฉลากและมีตัวอย่างหลายล้านตัวอย่างของแต่ละชั้นเรียนในข้อมูลการฝึกอบรมดังนั้นความแม่นยำจึงเป็นที่นิยมมากกว่าเนื่องจากเป็นการวัดประสิทธิภาพที่สะอาดเรียบง่ายและใช้งานง่าย
ที่นี่เราใช้ความแม่นยำในการแยกวิเคราะห์เต็มรูปแบบซึ่งหมายความว่าเราจะให้ "จุด" ตัวแยกวิเคราะห์หนึ่ง "ในตัวเศษถ้ามันได้รับโทเค็นทุกตัวในที่อยู่ที่ถูกต้อง นั่นควรเป็นมาตรการที่ดีกว่าเพียงแค่ดูว่าแต่ละโทเค็นนั้นถูกต้องหรือไม่
แม้ว่าตัวแยกวิเคราะห์ปัจจุบันจะทำงานได้ค่อนข้างดีสำหรับที่อยู่มาตรฐานส่วนใหญ่ แต่ก็ยังมีช่องว่างสำหรับการปรับปรุงโดยเฉพาะอย่างยิ่งในการตรวจสอบให้แน่ใจว่าข้อมูลการฝึกอบรมที่เราใช้นั้นใกล้เคียงที่สุดเท่าที่จะทำได้เพื่อที่อยู่ในป่า มีสองวิธีหลักที่ตัวแยกวิเคราะห์ที่อยู่สามารถปรับปรุงได้ยิ่งขึ้น (ตามลำดับความยาก):
ยินดีต้อนรับรายงานข้อผิดพลาดปัญหาและคำขอดึง โปรดอ่านคู่มือการบริจาคก่อนที่จะส่งปัญหาข้อผิดพลาดรายงานหรือดึงคำขอ
ส่งปัญหาได้ที่: https://github.com/openvenues/libpostal/issues
ขอขอบคุณเป็นพิเศษสำหรับ @benk10 สำหรับ Windows Build และ @aeroxuk สำหรับการรวมเข้ากับโครงการอย่างราบรื่นและตั้งค่าการสร้างแอพ
ซอฟต์แวร์นี้มีให้เป็นโอเพ่นซอร์สภายใต้ข้อกำหนดของใบอนุญาต MIT