Libpostal هي مكتبة C لحلية/تطبيع عناوين الشوارع في جميع أنحاء العالم باستخدام NLP الإحصائي والبيانات المفتوحة. الهدف من هذا المشروع هو فهم الأوتار القائمة على الموقع في كل لغة ، في كل مكان. للحصول على نظرة عامة أكثر شمولاً على البحث وراء Libpostal ، تأكد من مراجعة منشورات المدونة التمهيدية (الطويلة):
؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟
العناوين والمواقع التي تمثلها ضرورية لأي تطبيق يتعامل مع الخرائط (البحث في مكان ، النقل ، خدمات عند الطلب/التوصيل ، تسجيلات الفحص ، المراجعات). ومع ذلك ، حتى أبسط العناوين مليئة بالاتفاقيات المحلية والاختصارات والسياق ، مما يجعلها من الصعب فهرسة/الاستعلام بشكل فعال مع محركات البحث النصية التقليدية. تساعد هذه المكتبة على تحويل عناوين الشكل الحرة التي يستخدمها البشر في أشكال طبيعية نظيفة مناسبة لمقارنة الماكينة وفهرسة النص الكامل. على الرغم من أن Libpostal ليس في حد ذاته مشفرًا جغرافيًا كاملًا ، إلا أنه يمكن استخدامه كخطوة قبل المعالجة لجعل أي تطبيق ترميز جغرافي أكثر ذكاءً وأبسطًا وأكثر اتساقًا دوليًا.
؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟ ؟
المكتبة الأساسية مكتوبة في روابط اللغة C. Pure C. من أجل Python و Ruby و Go و Java و PHP و NodeJs يتم دعمها رسميًا ومن السهل كتابة الروابط بلغات أخرى.
إذا كانت شركتك تستخدم libpostal ، ففكر في مطالبة مؤسستك برعاية المشروع. إن تفسير ما يعنيه البشر عندما يشيرون إلى المواقع بعيد عن مشكلة حلها ، والرعاية تساعدنا على متابعة حدود جديدة في 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: As /c . يضيف برنامج Build Libpostal تلقائيًا libpostal على نهاية المسار ، لذلك سيصبح '/c' C:libpostal على 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. لتحليل التحليل على عناوين الولايات المتحدة والمملكة المتحدة وسنغافورة وتحسين معالجة عناوين الطريق الريفية الأمريكية. لتمكين هذا إضافة 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 والعملاء ومن صفحة Github libpostal وإضافتها إلى هذه المجموعة. حصل نموذج SENZING على نتائج تحليل أفضل بنسبة 4.3 ٪ من النموذج الافتراضي ، باستخدام مجموعة الاختبار هذه.
يبلغ حجم هذا النموذج حوالي 2.2 جيجابايت مقارنة بـ 1.8 جيجابايت للنموذج الافتراضي ، لذا ضع ذلك في الاعتبار إذا كانت مساحة Storages مهمة.
يمكن العثور على مزيد من المعلومات حول نموذج البيانات هذا على: https://github.com/senzing/libpostal-data إذا واجهت أي مشكلات مع هذا النموذج ، سواء كان ذلك مع التحليلات أو التثبيت أو أي مشاكل أخرى ، فيرجى الإبلاغ عنها في https://github.com/senzing/libpostal-data
يستخدم العنوان الدولي لـ Libpostal التعلم الآلي (الحقول العشوائية الشرطية) ويتم تدريبه على أكثر من مليار عنوان في كل بلد مأهولة على الأرض. نحن نستخدم OpenStreetMap و OpenAddresses كمصادر للعناوين المنظمة ، وقوالب تنسيق عنوان OpenCage على: https://github.com/opencagedata/address-formatting لبناء بيانات التدريب ، والمكملات مع احتواء polygons ، وتوليد مكونات البناء الفرعي مثل شركات الشقة/ نضيف أيضًا اختصارات ، وتسرب المكونات بشكل عشوائي ، وما إلى ذلك لجعل المحلل قويًا قدر الإمكان إلى إدخال العالم الحقيقي.
يتم أخذ نتائج التحليل هذه من برنامج adduction address_parser الذي يبني مع libpostal عند تشغيل make . لاحظ أن المحلل يمكن أن يتعامل مع الفواصل مقابل عدم وجود فواصل بالإضافة إلى أغلفة وتباديل مختلفة للمكونات (إذا كانت المدخلات مجرد مدينة أو فقط في المدينة/الرمز البريدي).
يحقق محلل الدقة دقة عالية للغاية على البيانات المحتجزة ، حاليًا 99.45 ٪ من التحليلات الكاملة الصحيحة (بمعنى 1 في البسط للحصول على كل رمز في العنوان صحيح).
فيما يلي مثال على واجهة برمجة تطبيقات المحللين باستخدام روابط 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 للتعامل مع أنماط محددة:
يحول API expens_address عناوين العالم الحقيقي الفوضوي إلى مكافئات طبيعية مناسبة لفهرسة البحث ، والتجزئة ، وما إلى ذلك.
فيما يلي مثال تفاعلي باستخدام ربط الثعبان:
يحتوي Libpostal على مصنف لغة مدرب OSM لاكتشاف اللغة (اللغات) المستخدمة في عنوان معين حتى يتمكن من تطبيق التطبيع المناسبة. الإدخال الوحيد المطلوب هو سلسلة العنوان الخام. فيما يلي قائمة قصيرة ببعض عمليات التطبيع الأقل وضوحًا بلغات مختلفة.
| مدخل | الإخراج (قد يكون متعدد في libpostal) |
|---|---|
| مائة وعشرون هـ 96 شارع | 120 شارع 96 شارع |
| 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 ، | уица каретныи ро 4 |
| у каретный р ، д 4 ، | Ulitsa Karetnyy Ryad Dom 4 Stroyeniye 7 |
| ماركسترا 14 | ماركت ستراس 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 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_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 لاستخدامه من قبل اللغات ذات المستوى الأعلى. إذا كنت لا ترى لغتك المفضلة ، أو إذا كنت تكتب لغة ملزمة ، فيرجى إخبارنا!
روابط اللغة المدعومة رسميًا
روابط اللغة غير الرسمية
امتدادات قاعدة البيانات
واجهة برمجة تطبيقات الراحة غير الرسمية
libpostal راحة docker
Libpostal Zeromq Docker
يستخدم libpostal أكبر للاختبار الآلي. لتشغيل الاختبارات ، استخدم:
make check
تعد إضافة حالات الاختبار أمرًا سهلاً ، حتى لو كان C صدئًا/غير موجود ، ونحن نحب المساهمات. نستخدم في الغالب الاختبارات الوظيفية فحص إدخال السلسلة مقابل إخراج السلسلة.
يتم اختبار Libpostal أيضًا بشكل دوري على الملايين من العناوين من OSM (نظيفة) بالإضافة إلى استعلامات مجهولة المصدر من الجغرافي الإنتاج (غير نظيف). خلال هذه العملية ، نستخدم Valgrind للتحقق من تسرب الذاكرة والأخطاء الأخرى.
يحتاج Libpostal إلى تنزيل بعض ملفات البيانات من S3. الملفات الأساسية هي تمثيلات على هياكل البيانات اللازمة لأداء التوسع. من أجل تحليل العناوين ، نظرًا لأن التدريب النموذجي يستغرق بضعة أيام ، فإننا ننشر النموذج المدرب بالكامل على S3 وسنقوم بتحديثه تلقائيًا حيث يتم إضافة عناوين جديدة إلى OSM و OpenAddresses ، وما إلى ذلك.
يتم تنزيل ملفات البيانات تلقائيًا عند تشغيل Make. للتحقق من أي ملفات بيانات جديدة وتنزيلها ، يمكنك إما تشغيل make ، أو تشغيل:
libpostal_data download all $YOUR_DATA_DIR/libpostal
واستبدل $ your_data_dir بكل ما قمت بتكوينه أثناء التثبيت.
يحتوي Libpostal على عدد من القواميس لكل اللغة التي تؤثر على التوسع ، ومصنف اللغة ، والمحلل. لاستكشاف القواميس أو المساهمة اختصارات/عبارات في لغتك ، راجع الموارد/القواميس.
في التعلم الآلي ، غالبًا ما تكون كميات كبيرة من بيانات التدريب ضرورية لتحقيق نتائج جيدة. تنشر العديد من مشاريع التعلم الآلي مفتوح المصدر إما رمز النموذج فقط (النتائج القابلة للتكرار إذا كنت فقط إذا كنت Google) ، أو نموذجًا مسبقًا حيث تكون ظروف التدريب غير معروفة.
يختلف Libpostal قليلاً لأنه تم تدريبه على بيانات مفتوحة متاحة للجميع ، لذلك أصدرنا خط أنابيب التدريب بأكمله (حزمة الجيوداتا في هذا الريبو) ، بالإضافة إلى بيانات التدريب الناتجة نفسها على أرشيف الإنترنت. إنه أكثر من 100 جيجابايت غير مضغوطة.
يتم تخزين بيانات التدريب على Archive.org بحلول التاريخ الذي تم إنشاؤه فيه. يوجد أيضًا ملف مخزّن في الدليل الرئيسي لهذا الريبو يسمى current_parser_training_set الذي يخزن تاريخ مجموعة التدريب التي تم إنشاؤها مؤخرًا. للشرب دائمًا إلى أحدث البيانات ، جرب شيئًا مثل: latest=$(cat current_parser_training_set) واستخدم هذا المتغير بدلاً من التاريخ.
يمكن العثور على جميع الملفات على https://archive.org/download/libpostal-parser-training-data-yyyymmdd/$file كملفات Gzip'd tab-separated (TSV) منسقة مثل: languagetcountrytaddress .
إذا كان المحلل لا يعمل جيدًا كما كنت تأمل في نوع معين من العنوان ، فإن أفضل اللجوء هو استخدام GREP/AWK للنظر في بيانات التدريب ومحاولة تحديد ما إذا كان هناك نمط/نمط من العنوان الذي لا يتم التقاطه.
توسيع الاختصار : على سبيل المثال توسيع "RD" => "الطريق" ولكن لأي لغة تقريبًا. يدعم Libpostal> 50 لغة ومن السهل إضافة لغات جديدة أو توسيع القواميس الحالية. يتم دعم اللغات الإيديوغرافية (التي لا يتم فصلها بواسطة المساحة البيضاء مثل الصينية) ، وكذلك اللغات الجرمانية حيث يتم تسلسل أنواع الشريان في نهاية السلسلة ، وقد يتم فصلها اختياريًا بحيث تكون Rosenstraße و Rosen Straße متكافئة.
تحليل العنوان الدولي : الحقل العشوائي المشروط الذي يحلل "123 Main Street New York" في {"House_Number": 123 ، "Road": "Main Street" ، "City": "New York" ، "State": "New York"}. يعمل المحلل في مجموعة واسعة من البلدان واللغات ، وليس فقط الولايات المتحدة/اللغة الإنجليزية. يتم تدريب النموذج على أكثر من مليار عناوين وسلاسل شبيهة بالعناوين ، باستخدام القوالب الموجودة في تنسيق عنوان Opencage لتنسيق إعادة تدوين الأمثلة المنسقة ، الموسومة لكل بلد مأهول في العالم. يتم تنفيذ العديد من أنواع التطبيع لجعل بيانات التدريب تشبه مدخلات الجيولوجية الحقيقية الفوضوية بأكبر قدر ممكن.
تصنيف اللغة : تم تدريب الانحدار اللوجستي متعدد الحدود (باستخدام الطريقة Ftrl-Proxyal للحث على تفاوت) على جميع طرق OpenStreetMap ، Addr:* العلامات ، أسماء الأعلى والعناوين المنسقة. يتم اشتقاق الملصقات باستخدام اختبارات نقاط في البوليجون لكل من دول OSM واللغات الرسمية/الإقليمية للبلدان وحدود المسؤول 1 على التوالي. لذلك ، على سبيل المثال ، اللغة الإسبانية هي اللغة الافتراضية في إسبانيا ولكن في مناطق مختلفة ، مثل Catalunya ، Galicia ، منطقة الباسك ، اللغات الإقليمية المعنية هي الافتراضي. يتم استخدام الغموض القائم على القاموس في الحالات التي تكون فيها اللغة الإقليمية غير متناظرة على سبيل المثال ، على سبيل المثال ، بريتون ، أوكيتان. يتم استخدام القواميس أيضًا لختصر عبارات قانونية مثل "Calle" => "C/" (يتم تنفيذها على كل من مصنف اللغة ومجموعات تدريب المحللات المحلي))
تحليل التعبير الرقمي ("Twenty First" => 21st ، "Quatre-Lingt-Douze" => 92 ، مرة أخرى باستخدام البيانات المقدمة في CLDR) ، تدعم> 30 لغة. يتعامل مع اللغات مع التعبيرات المتسلسلة على سبيل المثال milleottocento => 1800. تطبيع اختياريًا الأرقام الرومانية بغض النظر عن اللغة (التاسع => 9) التي تحدث في أسماء العديد من الملوك ، الباباوات ، إلخ.
الرمز المميز / lexing سريع ودقيق : تم تسجيله عند> 1M الرموز / ثانية ، ينفذ المواصفات TR-29 لتجزئة الكلمات UTF8 ، ورمز لغات شرق آسيا Chracter بواسطة الشخصية بدلاً من المسافة البيضاء.
تطبيع UTF8 : تحلل اختياريًا من نموذج تطبيع UTF8 إلى NFD ، فإن علامات لهجة الشرائط على سبيل المثال à => A و/أو يطبق ترجمة Latin-ASCII.
ترجمة : على سبيل المثال уица => ulica أو Ulitsa. يستخدم جميع تحويلات CLDR ، نفس بيانات المصدر الدقيقة التي تستخدمها وحدة العناية المركزة ، على الرغم من أن libpostal لا يتطلب سحب جميع وحدة العناية المركزة (قد تتعارض مع إصدار نظامك). ملاحظة: قد لا تشمل بعض اللغات ، وخاصة العبرية والعربية والتايلاندية ، حروف العلة ، وبالتالي لن تتطابق غالبًا مع ترجمة يقوم بها الإنسان. قد يكون من الممكن تنفيذ المترجمين الإحصائيين لبعض هذه اللغات.
الكشف عن البرنامج النصي : يكتشف ما هو البرنامج النصي الذي يستخدمه سلسلة معينة (يمكن أن تكون متعددة على سبيل المثال ، قد يستخدم عنوان هونغ كونغ أو Macau مجانيًا على كل من نصوص HAN و LATIN في نفس العنوان). في الترجمة ، يمكننا استخدام جميع المترجمين المعمول بهما في برنامج نصي يونيكود معين (يمكن ترجمة اليونانية على سبيل المثال مع اللاتين اليوناني واللاتين-اللاتين-BGN و Greek-Latin-Bungegn).
تم إنشاء Libpostal في الأصل كجزء من مشروع OpenVenues لحل مشكلة Ectuping مكان. في OpenVenues ، لدينا مجموعة بيانات من الملايين من الأماكن المستمدة من terabytes من صفحات الويب من الزحف الشائع. يتم نشر الزحف الشائع شهريًا ، وبالتالي فإن دمج نتائج الزحفين ينتج عنه تكرارات كبيرة.
يعد Deduping مجالًا جيدًا نسبيًا ، وبالنسبة للوثائق النصية مثل صفحات الويب ، والأوراق الأكاديمية ، وما إلى ذلك ، توجد أساليب تشابه تقريبية لائقة مثل Minhash.
ومع ذلك ، بالنسبة للعناوين المادية ، فإن الاستخدام المتكرر للاختصارات التقليدية مثل الطريق == RD ، كاليفورنيا == CA ، أو مدينة نيويورك == مدينة نيويورك تعقد الأمور قليلاً. حتى باستخدام تقنية مثل Minhash ، والتي تعد مناسبة تمامًا للمباريات التقريبية وهي تعادل تشابه jaccard لمجموعتين ، يتعين علينا العمل مع نصوص قصيرة جدًا ، وغالبًا ما تكون هذه الحالة معادلة معادلة ، واحدة مختصرة والآخر محدد تمامًا ، لن يتطابق بشكل وثيق للغاية من حيث مجموعة N-Gram. في البرامج النصية غير اللاتينية ، على سبيل المثال عنوان روسي ومكافئه المترجم ، من المتصور أن عنوانان يشيران إلى نفس المكان قد لا يتطابقان حتى مع شخصية واحدة.
كمثال محفز ، ضع في اعتبارك طريقتان مكافئتان التاليتان لكتابة عنوان شارع مانهاتن معين مع اتفاقيات مختلفة ودرجات من الأفعال:
من الواضح أن '30 W 26th st fl #7! = '30 West Sixth Sixth Number Number 7 'بمعنى مقارنة بين السلسلة ، ولكن يمكن للإنسان أن يشير هذين العنوان إلى نفس الموقع المادي.
يهدف Libpostal إلى إنشاء سلاسل جغرافية طبيعية ، محسّنة في مكونات ، بحيث يمكننا أن نسبب بشكل أكثر فعالية حول مدى تطابق العنوانين فعليًا واتخاذ قرارات تلقائية من جانب الخادم حول الغموض.
إذا كان ما سبق يشبه إلى حد كبير الترميز الجغرافي ، فهذا لأنه بطريقة ما ، فقط في حالة OpenVenues ، يتعين علينا الترميز الجغرافي بدون واجهة مستخدم أو مستخدم لتحديد العنوان الصحيح في القائمة المنسدلة الإضافية. بالنظر إلى قاعدة بيانات عن عناوين المصدر مثل OpenAddresses أو OpenStreetMap (أو كل ما سبق) ، يمكن استخدام libpostal لتنفيذ أشياء مثل إلغاء العنوان والدفعة الجغرافية من جانب الخادم في إعدادات مثل MapReduce أو معالجة الدفق.
الآن ، بدلاً من محاولة خبز الاتفاقيات الخاصة بعنوان في محركات البحث عن المستندات التقليدية مثل Elasticsearch باستخدام ملفات المرادفات العملاقة ، والبرمجة النصية ، والمحللين المخصصين ، والرمز المميز ، وما شابه ذلك ، يمكن أن يبدو الترميز الجيولوجي هذا:
وبهذه الطريقة ، يمكن أن يؤدي Libpostal عن عنوان غامض في وقت ثابت بالنسبة لحجم مجموعة البيانات.
Libpostal مكتوب في C لثلاثة أسباب (حسب الأهمية):
قابلية الحمل/الانتشار : يستهدف libpostal اللغات ذات المستوى الأعلى الذي يستخدمه الأشخاص فعليًا يوميًا: Python ، Go ، Ruby ، Nodejs ، إلخ. نحن ندعم Mac/Linux (لا يعد Windows أولوية ولكنه يسعدني قبول التصحيحات) ، ولديك بناء Autotools قياسي وتنسيق ملف endianness-agnostic لملفات البيانات. يتم الحفاظ على روابط Python كجزء من هذا الريبو لأنها ضرورية لبناء بيانات التدريب.
كفاءة الذاكرة : تم تصميم libpostal لتشغيله في إعداد MapReduce حيث قد يقتصر على <1 جيجابايت من ذاكرة الوصول العشوائي لكل عملية اعتمادًا على تكوين الجهاز. قدر الإمكان يستخدم libpostal صفائف متجاورة ومحاولات (مبنية على صفائف متجاورة) ، مرشحات بلوم ومصفوفات متناثرة مضغوطة للحفاظ على انخفاض استخدام الذاكرة. من الممكن استخدام libpostal على جهاز محمول مع نماذج مدربة على بلد واحد أو حفنة من البلدان.
الأداء : هذا هو الأخير في القائمة لسبب ما. معظم التحسينات في libpostal هي لاستخدام الذاكرة بدلاً من الأداء. Libpostal سريع للغاية بالنظر إلى مقدار العمل الذي يقوم به. يمكنه معالجة عناوين 10-30K / ثانية في سلسلة / عملية واحدة على المنصات التي اختبرناها (وهذا يعني معالجة كل عنوان في OSM Planet في غضون ما يزيد قليلاً عن ساعة). تحقق من البرنامج القياسي البسيط للاختبار على بيئتك وأنواع مختلفة من المدخلات. في إعداد MapReduce ، لا يكون الأداء لكل النواة مهمًا لأن كل شيء يتم بالتوازي ، ولكن هناك بعض تطبيقات ابتلاع البث في Mapzen حيث يحتاج هذا إلى تشغيل العملية.
Libpostal مكتوب في الحديثة ، مقروء ، C99 ويستخدم الاتفاقيات التالية:
تحتوي حزمة Geodata Python في REPO Libpostal على خط الأنابيب للمعالجة المسبقة لمجموعات بيانات GEO المختلفة وبناء بيانات التدريب لنماذج C لاستخدامها. لا ينبغي أن تكون هناك حاجة إلى هذه الحزمة لمعظم المستخدمين ، ولكن بالنسبة للمهتمين بإنشاء أنواع جديدة من العناوين أو تحسين بيانات التدريب الخاصة بـ Libpostal ، فهذا هو المكان الذي يجب أن ننظر إليه.
في بيانات الاختبار المنعطف (بمعنى أن الأمواج التي لم يسبق لها مثيل النموذج الذي لم يسبق له مثيل) ، يحقق محلل العنوان 99.45 ٪ من الدقة الكاملة.
بالنسبة لبعض المهام مثل التعرف على الكيان المسماة ، من الأفضل استخدام شيء مثل درجة أو متغيرات F1 ، في الغالب لأن هناك مشكلة تحيز الطبقة (معظم الكلمات غير مخصصة ، ونظام تنبأ ببساطة بعدم الارتياح لكل رمز سيحقق جيدًا في الواقع من حيث الدقة). هذا ليس هو الحال بالنسبة لتحليل العنوان. كل رمز له علامة وهناك ملايين الأمثلة لكل فئة في بيانات التدريب ، لذلك فإن الدقة هي الأفضل لأنها مقياس نظيف وبسيط للأداء.
هنا نستخدم دقة الحاجز الكامل ، مما يعني أننا نعطي فقط "نقطة" المحلل الأول في البسط إذا كان كل رمز واحد في العنوان صحيح. يجب أن يكون هذا مقياسًا أفضل من مجرد النظر إلى ما إذا كان كل رمز صحيحًا.
على الرغم من أن المحلل الحالي يعمل بشكل جيد بالنسبة لمعظم العناوين القياسية ، إلا أنه لا يزال هناك مجال للتحسين ، لا سيما في التأكد من أن بيانات التدريب التي نستخدمها أقرب ما يمكن للعناوين في البرية. هناك طريقتان أساسيتان يمكن تحسين محلل العنوان بشكل أكبر (حسب ترتيب الصعوبة):
تقارير الأخطاء والمشكلات وطلبات السحب موضع ترحيب. يرجى قراءة دليل المساهمة قبل تقديم مشكلتك أو تقرير الأخطاء أو طلب السحب.
إرسال المشكلات على: https://github.com/openvenues/libpostal/issues.
شكر خاص لـ @benk10 لبناء Windows الأولي و Aeroxuk لدمجه بسلاسة في المشروع وإعداد بناء Appveyor.
البرنامج متاح كمصدر مفتوح بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا.