Libpostal은 통계 NLP 및 오픈 데이터를 사용하여 전 세계의 거리 주소를 구문 분석/정규화하기위한 C 라이브러리입니다. 이 프로젝트의 목표는 모든 언어의 위치 기반 문자열을 어디에서나 이해하는 것입니다. Libpostal의 연구에 대한보다 포괄적 인 개요를 보려면 (긴) 입문 블로그 게시물을 확인하십시오.
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
주소와 그들이 대표하는 위치는지도를 다루는 응용 프로그램에 필수적입니다 (장소 검색, 운송, 주문형/배송 서비스, 체크인, 리뷰). 그러나 가장 간단한 주소조차도 현지 컨벤션, 약어 및 컨텍스트로 가득 차있어 기존의 전체 텍스트 검색 엔진으로 효과적으로 색인/쿼리가 어렵습니다. 이 라이브러리는 인간이 사용하는 자유 형식 주소를 기계 비교 및 전체 텍스트 인덱싱에 적합한 깨끗한 정규화 된 형태로 변환하는 데 도움이됩니다. libpostal은 그 자체가 완전한 지구 코더는 아니지만, 지오 코딩 응용 프로그램을 더 똑똑하고 단순하며 국제적으로 일관되게 만들기위한 전처리 단계로 사용할 수 있습니다.
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
Core Library는 Python, Ruby, Go, Java, PHP 및 Nodejs에 대한 Pure C. Language Bindings로 작성되어 공식적으로 지원되며 다른 언어로 바인딩을 쉽게 작성하기가 쉽습니다.
회사가 libpostal을 사용하는 경우 조직에 프로젝트를 후원하도록 요청하십시오. 위치를 언급 할 때 인간이 의미하는 바를 해석하는 것은 해결 된 문제와는 거리가 멀고 후원은 우리가 지리 공간 NLP에서 새로운 국경을 추구하는 데 도움이됩니다. 스폰서로서, 회사 로고는 사이트 링크와 함께 Github Repo 페이지에 두드러지게 나타납니다. 후원 정보
개별 사용자는 또한 월별 기부금을 제공함으로써 Open Geo NLP 연구를 지원할 수 있습니다.
설치하기 전에 다음과 같은 전제 조건이 있는지 확인하십시오.
우분투/데비안에서
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을 사용하는 경우 ./configure 명령에 --disable-sse2 추가하십시오. 이로 인해 성능이 저하되지만 빌드는 성공할 것입니다.
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 빌드 스크립트는 경로 끝에 libpostal 자동으로 추가하므로 '/c'는 Windows에서 C:libpostal 가됩니다.
컴파일 된 .dll은 src/.libs/ directory에 있으며 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 사용하여 :
./configure --datadir=[...some dir with a few GB of space...] MODEL=senzing
이 모델의 데이터는 OpenAddress, OpenStreetMap 및 Senzing이 고객 피드백 (수백 레코드)을 기반으로 생성 된 데이터에서 100 개 이상의 언어로 230 개국 이상의 데이터의 총 12 억 레코드를 기반으로 생성 된 데이터에서 얻은 것입니다. OpenStreetMap 및 OpenAdDress의 데이터는 양호하지만 완벽하지 않으므로 잘못 형성된 주소를 필터링하여 잘못 분류 된 주소 토큰을 수정하고 이러한 조건이 발생할 때마다 주소에 속하지 않은 토큰을 제거하여 데이터 세트가 수정되었습니다.
Senzing은 89 개국에서 모델의 품질을 테스트하고 확인하는 데 사용하는 12950 개의 주소 데이터 세트를 만들었습니다. 데이터 세트는 OSM의 임의 주소를 사용하여 전국당 최소 50 개를 사용하여 생성되었습니다. PARSE가 어려운 주소는 Senzing Support Team 및 고객과 Libpostal Github 페이지에서 얻었 으며이 세트에 추가되었습니다. Senzing 모델은이 테스트 세트를 사용하여 기본 모델보다 4.3% 더 나은 구문 분석 결과를 얻었습니다.
이 모델의 크기는 기본 모델의 1.8GB에 비해 약 2.2GB이므로 Storages 공간이 중요한 경우 명심하십시오.
이 데이터 모델에 대한 자세한 내용은 https://github.com/senzing/libpostal-data 파르즈, 설치 또는 기타 문제와 관련이 있는지 여부에 관계 없이이 모델과 관련된 문제가 발생하면 https://github.com/sithub.com/senzing/libpostal-data에서 확인하십시오.
Libpostal의 국제 주소 파서는 기계 학습 (조건부 임의의 필드)을 사용하며 지구의 모든 거주 국가에서 10 억 개가 넘는 주소로 교육을받습니다. 우리는 OpenStreetMap 및 OpenAdDresses를 구조화 된 주소의 출처로 사용하고 OpenCage 주소 형식의 템플릿을 사용하여 https://github.com/opencagedata/address-formatting을 위해 훈련 데이터를 구성하고 폴리이고 포함 및 아파트/층 번호 및시 박스와 같은 하위 제작 구성 요소를 생성합니다. 우리는 또한 약어를 추가하고, 무작위로 구성 요소를 드롭 아웃합니다.
이 예제 구문 분석 결과는 make 실행할 때 libpostal과 함께 구축하는 대화식 주소 _parser 프로그램에서 가져옵니다. 파서는 쉼표와 쉼표가없는 다양한 케이싱 및 구성 요소를 처리 할 수 있습니다 (입력이 도시 또는 도시/우편 번호가있는 경우).
파서는 보류 데이터에서 매우 높은 정확도를 달성합니다. 현재 99.45%의 수정 된 전체 구문 분석 (주소의 모든 토큰을 올바르게 얻기위한 분자의 1).
다음은 파이썬 바인딩을 사용하는 파서 API의 예입니다.
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는 지저분한 실제 주소를 검색 인덱싱, 해싱 등에 적합한 정규화 된 등가로 변환합니다.
파이썬 바인딩을 사용하는 대화식 예는 다음과 같습니다.
libpostal에는 주어진 주소에서 사용되는 언어를 감지하기 위해 OSM 교육 언어 분류기가 포함되어있어 적절한 정규화를 적용 할 수 있습니다. 필요한 유일한 입력은 원시 주소 문자열입니다. 다음은 다양한 언어로 덜 간단한 정규화의 짧은 목록입니다.
| 입력 | 출력 (libpostal에서 다중 일 수 있음) |
|---|---|
| 100 개의 20 e 96th st | 120 이스트 96 번가 |
| c/ ocho, pi 4 | Calle 8 Polígono Industrial 4 |
| v xx settembre, 20 | 20 SENTEMBRE를 통해 20 |
| Quatre Vingt Douze R. de l 'église | 92 Rue de l Eglise |
| ул 견정 дя д, д 4, строение 7 | ули а 견없는 stroc 4 строение 7 |
| ул 견정 дя д, д 4, строение 7 | Ulitsa Karetnyy Ryad Dom 4 Stroyeniye 7 |
| Marktstraße 14 | 마크 스트라스 14 |
Libpostal은 현재 60 개 이상의 언어 로 이러한 유형의 정규화를 지원하며 C를 쓰지 않아도 더 추가 할 수 있습니다.
추가 읽기 및 기괴한 주소 에지 케이스는 다음을 참조하십시오. Falsehoods 프로그래머는 주소에 대해 믿습니다.
간결함에 대한 파이썬 바인딩을 사용하는 예는 다음과 같습니다 (대부분의 상위 언어 바인딩은 비슷합니다).
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는 몇 줄이 더 있지만 여전히 간단합니다.
#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은 고급 언어로 사용되도록 설계되었습니다. 선택한 언어가 보이지 않거나 언어 구속력을 쓰는 경우 알려주십시오.
공식적으로 지원되는 언어 바인딩
비공식 언어 바인딩
데이터베이스 확장
비공식 휴식 API
libpostal Rest Docker
libpostal Zeromq docker
Libpostal은 자동화 된 테스트에 가장 큰 것을 사용합니다. 테스트를 실행하려면 사용하십시오.
make check
C가 녹슨/존재하지 않더라도 테스트 케이스를 추가하는 것은 쉽고 기여를 좋아합니다. 문자열 출력에 대한 문자열 입력을 확인하는 대부분 기능 테스트를 사용합니다.
Libpostal은 또한 OSM (Clean)의 수백만 주소와 생산 지오 코더 (Clean Clean)의 익명화 된 쿼리에서 주기적으로 전투 테스트를받습니다. 이 과정에서 우리는 Valgrind를 사용하여 메모리 누출 및 기타 오류를 확인합니다.
libpostal은 S3에서 일부 데이터 파일을 다운로드해야합니다. 기본 파일은 확장을 수행하는 데 필요한 데이터 구조의 온 디스크 표현입니다. 주소 구문 분석의 경우 모델 교육은 며칠이 걸리므로 완전히 훈련 된 모델을 S3에 게시하고 OSM, OpenAddresses 등에 새 주소가 추가되면 자동으로 업데이트됩니다. 언어 분류기 모델도 마찬가지입니다.
Make를 실행할 때 데이터 파일이 자동으로 다운로드됩니다. 새 데이터 파일을 확인하고 다운로드하려면 make 실행하거나 실행할 수 있습니다.
libpostal_data download all $YOUR_DATA_DIR/libpostal
그리고 $ your_data_dir를 설치 중에 구성하기 위해 전달한 모든 것으로 바꾸십시오.
Libpostal에는 확장, 언어 분류기 및 파서에 영향을 미치는 수많은 언어 사전이 포함되어 있습니다. 사전을 탐색하거나 언어로 약어/문구를 기여하려면 리소스/사전을 참조하십시오.
머신 러닝에서는 많은 양의 교육 데이터가 종종 좋은 결과를 얻는 데 필수적입니다. 많은 오픈 소스 머신 러닝 프로젝트는 모델 코드 만 출시하거나 (Google 이면서만 재현 가능) 또는 교육 조건이 알려지지 않은 사전 구운 모델입니다.
Libpostal은 모든 사람이 사용할 수있는 개방형 데이터에 대해 교육을 받았기 때문에 약간 다르므로 전체 교육 파이프 라인 (이 리포지트의 GeoData 패키지)과 인터넷 아카이브의 교육 데이터 자체를 출시했습니다. 100GB 이상 압축되어 있습니다.
교육 데이터는 생성 된 날짜에 따라 archive.org에 저장됩니다. 또한 가장 최근에 만든 교육 세트 날짜를 저장하는 current_parser_training_set 이라는이 repo의 기본 디렉토리에 저장된 파일도 있습니다. 항상 최신 데이터를 가리키려면 다음과 같은 것을 시도하고 latest=$(cat current_parser_training_set) 같은 것을 시도하고 날짜 대신 해당 변수를 사용하십시오.
모든 파일은 https://archive.org/download/libpostal-parser-training-data-yyymmdd/$file에서 찾을 languagetcountrytaddress 있습니다.
파서가 특정 유형의 주소에서 기대하고 있지 않은 경우, 가장 좋은 상환은 GREP/AWK를 사용하여 교육 데이터를 살펴보고 캡처되지 않은 주소의 패턴/스타일이 있는지 확인하는 것입니다.
약어 확장 : 예를 들어 "rd"=> "도로"확장이지만 거의 모든 언어에 대해. Libpostal은> 50 언어를 지원하며 새로운 언어를 추가하거나 현재 사전을 확장하기 쉽습니다. 도로 유형이 문자열의 끝에 연결되는 게르인드 언어와 마찬가지로, 중국어로 분리되지 않음)는 지원됩니다. Rosenstraße와 Rosen Straße가 동등하게 사용되도록 선택적으로 분리 될 수 있습니다.
국제 주소 구문 분석 : "123 Main Street New York New York"을 구문 분석하는 조건부 임의의 필드 { "House_Number": 123, "Road": "Main Street", "City": "New York", "State": "New York"}. 파서는 미국/영어뿐만 아니라 다양한 국가와 언어에서 일합니다. 이 모델은 OpenCage 주소 형식의 템플릿을 사용하여 세계의 모든 거주 국가에 대한 형식, 태그 트랜 링 예제를 구성하여 10 억 개가 넘는 주소 및 주소와 같은 문자열로 교육을받습니다. 훈련 데이터가 가능한 한 실질적인 지저분한 지오 코더 입력과 유사하게하기 위해 많은 유형의 정규화가 수행됩니다.
언어 분류 : 모든 OpenStreetMap 방식, ADDR :* 태그, 지문 및 형식 주소에서 다중 로지스틱 회귀 (FTRL 프록시 메소드 방법을 사용하여 희소성을 유발). 라벨은 각각 OSM 국가 및 국가 및 관리 1 경계 모두에 대한 폴리그폰 테스트를 사용하여 파생됩니다. 예를 들어, 스페인어는 스페인의 기본 언어이지만, 바스크 지역의 카탈루냐 (Catalunya), 즉 바스크 지역, 각 지역 언어는 기본값입니다. 사전 기반의 명확성은 지역 언어가 웨일즈 (Welsh), Breton, Breton, Occitan 인 경우가 아닌 경우에 사용됩니다. 사전은 또한 "calle"=> "c/"와 같은 표준 문구를 약화시키는 데 사용됩니다 (언어 분류기와 주소 파서 트레이닝 세트 모두에서 수행됨)
숫자 표현 구문 분석 ( "Twenty First"=> 21st, "Quatre-vingt-douze"=> 92, CLDR에 제공된 데이터를 다시 사용)는> 30 언어를 지원합니다. Milleottocento => 1800에 연결된 표현이있는 언어를 처리합니다. 선택적으로 많은 군주, 교황 등의 이름으로 발생하는 언어 (ix => 9)에 관계없이 로마 숫자를 정규화합니다.
빠르고 정확한 토큰 화 / Lexing :> 1m 토큰 / Sec에서 클럭킹되면 UTF8 워드 세분화에 대한 TR-29 사양을 구현하고, 백인이 아닌 동아시아 언어로 문자별로 토큰 화됩니다.
UTF8 정규화 : 선택적으로 UTF8을 NFD 정규화 형태로 분해, 스트립 악센트 마크 예를 들어 à => a 및/또는 라틴 아스피아 음역을 적용합니다.
음역 : 예 : улица => ulica 또는 ulitsa. LibPostal은 모든 ICU를 당기는 것이 필요하지 않지만 (시스템 버전과 충돌 할 수 있음) 모든 CLDR 변환을 사용하지만 ICU에서 사용하는 것과 동일한 소스 데이터를 사용합니다. 참고 : 일부 언어, 특히 히브리어, 아랍어 및 태국에는 모음이 포함되어 있지 않으므로 종종 인간이 수행하는 음역과 일치하지 않습니다. 이러한 언어 중 일부에 대한 통계적 음역자를 구현할 수 있습니다.
스크립트 감지 : 주어진 문자열이 사용하는 스크립트를 감지합니다 (예 : 자유 형식 홍콩 또는 마카오 주소는 동일한 주소에서 한 및 라틴 스크립트를 모두 사용할 수 있습니다). 음역에서 우리는 주어진 유니 코드 스크립트에 적용 가능한 모든 음역자를 사용할 수 있습니다 (그리스어는 그리스-라틴, 그리스-라틴 -BGN 및 그리스-라틴-ungeGN으로 음역 할 수 있습니다).
Libpostal은 원래 Openvenues 프로젝트의 일부로 제작하여 공연장의 문제를 해결했습니다. OpenVenues에는 공통 크롤링의 웹 페이지 테라 바이트에서 파생 된 수백만 개의 데이터 세트가 있습니다. 공통 크롤링은 매월 게시되므로 두 크롤의 결과를 병합하면 상당한 복제물이 생성됩니다.
Destuping은 비교적 잘 연구 된 분야이며 웹 페이지, 학술 논문 등과 같은 텍스트 문서의 경우 Minhash와 같은 대략적인 유사성 방법이 있습니다.
그러나 물리적 주소의 경우 Road == Rd, California == CA 또는 New York City == NYC와 같은 기존 약어를 자주 사용하면 문제가 약간 복잡해집니다. 대략적인 일치에 적합하고 두 세트의 Jaccard 유사성과 동등한 Minhash와 같은 기술을 사용하더라도, 우리는 매우 짧은 텍스트로 작업해야하며, 두 개의 동등한 주소, 하나의 약칭 및 완전히 지정된 하나는 N-Gram 세트 겹침과 매우 밀접하게 일치하지 않는 경우가 종종 있습니다. 라틴이 아닌 스크립트에서 러시아 주소와 음역에 해당하는 것은 같은 장소를 언급하는 두 개의 주소가 단일 문자조차 일치하지 않을 수 있다고 생각할 수 있습니다.
동기 부여의 예로서, 다양한 규칙과 수준의 구동성으로 특정 맨해튼 거리 주소를 작성하는 다음 두 가지 방법을 고려하십시오.
분명히 '30 W 26th St Fl #7! = '30 West West Twenty-Six Street Floor Number 7 '은 문자열 비교 의미에서, 인간은이 두 주소가 동일한 물리적 위치를 가리킨다 고 생각할 수 있습니다.
Libpostal은 정규화 된 지리적 문자열을 만들고 구성 요소에 구문 분석하여 두 개의 주소가 실제로 얼마나 잘 일치하는지에 대해보다 효과적으로 추론하고 Dupes에 대한 자동화 된 서버 측 결정을 내릴 수 있습니다.
위의 부분이 지오 코딩과 비슷하게 들리면 OpenVenues 케이스에서만 UI 또는 사용자가 자동 완성 드롭 다운에서 올바른 주소를 선택하려면 GeoCode가 필요하기 때문입니다. OpenAddresses 또는 OpenStreetMap (또는 위의 모든)과 같은 소스 주소 데이터베이스가 주어지면 LibPostal은 MapReduce 또는 스트림 처리와 같은 설정에서 주소 DEDUPING 및 SERVER-SIDE Batch Geocoding과 같은 것들을 구현하는 데 사용할 수 있습니다.
이제 거대한 동의어 파일, 스크립팅, 사용자 정의 분석기, 토큰 화기 등을 사용하여 Elasticsearch와 같은 기존 문서 검색 엔진으로 주소 별 규칙을 굽는 대신 다음과 같은 모습이 보일 수 있습니다.
이러한 방식으로, Libpostal은 데이터 세트의 크기에 비해 일정한 시간에 퍼지 주소 일치를 수행 할 수 있습니다.
libpostal은 세 가지 이유로 C로 작성됩니다 (중요 순서대로) :
휴대 성/유비 퀴티 : Libpostal은 사람들이 실제로 매일 사용하는 더 높은 수준의 언어를 대상으로합니다 : Python, Go, Ruby, Nodejs 등 C의 아름다움은 거의 모든 프로그래밍 언어가 IT에 묶을 수 있고 C 컴파일러가 어디에나 있으므로 좋아하는 사람을 선택하고 바인딩을 작성할 수 있다는 것입니다. 우리는 Mac/Linux를 지원합니다 (Windows는 우선 순위가 아니지만 패치를 수락하는 것이 행복합니다), 표준 Autotools 빌드 및 데이터 파일에 대한 Endianness-Agnostic 파일 형식이 있습니다. 파이썬 바인딩은 훈련 데이터를 구성하는 데 필요하기 때문에이 레포의 일부로 유지됩니다.
메모리 효율성 : LibPostal은 기계 구성에 따라 프로세스 당 <1GB RAM으로 제한 될 수있는 MapReduce 설정에서 실행되도록 설계되었습니다. 가능한 Libpostal은 연속 어레이를 사용하여 (연속 어레이에 구축), 블룸 필터 및 압축 된 희소 행렬을 사용하여 메모리 사용을 낮게 유지합니다. 단일 국가 또는 소수의 국가에서 훈련 된 모델이있는 모바일 장치에서 libpostal을 사용할 수 있습니다.
성능 : 이것은 이유가 마지막입니다. libpostal의 최적화의 대부분은 성능보다는 메모리 사용을위한 것입니다. libpostal은 작업량이 많은 일을 감안할 때 상당히 빠릅니다. 테스트 한 플랫폼에서 단일 스레드 / 프로세스에서 10-30k 주소 / 초를 처리 할 수 있습니다 (즉, OSM Planet의 모든 주소를 한 시간 만에 처리하는 것을 의미합니다). 환경과 다양한 유형의 입력을 테스트 할 간단한 벤치 마크 프로그램을 확인하십시오. MapReduce 설정에서는 모든 것이 병렬로 수행되기 때문에 코어 당 성능이 중요하지 않지만 Mapzen에는 프로세스 내에서 실행 해야하는 스트리밍 섭취 애플리케이션이 있습니다.
Libpostal은 현대적이고 읽기 쉬운 C99로 작성되었으며 다음과 같은 규칙을 사용합니다.
Libpostal Repo의 Geodata Python 패키지에는 다양한 GEO 데이터 세트를 전처리하고 C 모델을 사용할 수있는 교육 데이터를 구축하기위한 파이프 라인이 포함되어 있습니다. 이 패키지는 대부분의 사용자에게는 필요하지 않지만 새로운 유형의 주소를 생성하거나 Libpostal의 교육 데이터를 개선하는 데 관심이있는 사람들에게는 볼 수있는 곳입니다.
보류 테스트 데이터 (모델이 이전에 보지 못한 구문 분석)에서 주소 파서는 99.45%의 전체 구문 분석 정확도를 달성합니다.
이름이 지정된 엔티티 인식과 같은 일부 작업의 경우 F1 스코어 또는 변형과 같은 것을 사용하는 것이 바람직합니다. 대부분 클래스 바이어스 문제가 있기 때문에 (대부분의 단어는 비 엔트리티이며, 모든 토큰에 대해 단순히 비 엔티티를 예측하는 시스템은 실제로 정확성 측면에서 상당히 잘 수행됩니다). 주소 구문 분석의 경우는 아닙니다. 모든 토큰에는 레이블이 있으며 교육 데이터에 각 클래스의 수백만 가지 예가 있으므로 깨끗하고 단순하며 직관적 인 성능 측정이므로 정확도가 바람직합니다.
여기서 우리는 전체 구문 분석 정확도를 사용합니다. 즉, 주소의 모든 단일 토큰을 올바르게 얻는 경우 분자에 구문 분석기에 "포인트"를 제공합니다. 그것은 단순히 각 토큰이 올바른지를 보는 것보다 더 나은 척도가되어야합니다.
현재 파서는 대부분의 표준 주소에서 상당히 잘 작동하지만 여전히 개선의 여지가 있습니다. 특히 우리가 사용하는 훈련 데이터가 야생의 주소에 대해 가능한 한 가깝습니다. 주소 파서를 더욱 향상시킬 수있는 두 가지 주요 방법이 있습니다 (어려움의 순서대로).
버그 보고서, 문제 및 풀 요청을 환영합니다. 문제를 제출하기 전에 기고 가이드를 읽으십시오. 버그 보고서 또는 요청 요청.
https://github.com/openvenues/libpostal/issues에서 문제를 제출하십시오.
초기 Windows 빌드의 @Benk10과 프로젝트에 원활하게 통합하고 앱베이어 빌드를 설정 한 @Aeroxuk에게 특별한 감사를드립니다.
이 소프트웨어는 MIT 라이센스의 조건에 따라 오픈 소스로 제공됩니다.