2014-04-16 3 views
2

사용자가 주소 양식을 작성하는 데 소요되는 시간을 줄이려고합니다. 이 양식에는 주소, 우편 번호, 도시, 지구 및 준 지구가 필요합니다. 이렇게하려면문자열에서 비 주소 정보를 필터링하는 방법

그래서 지금처럼 열기 거리지도의 Nominatim API를 쿼리 : 다음 반환 된 몸에서 우편 번호 같은 것들을 분석

var 
    request = require('request'), 
    address = 'Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road', 
    baseUri = 'http://nominatim.openstreetmap.org/search?format=json&addressdetails=1', 
    query = '&accept-language=en&q=' + encodeURIComponent(address); 

request(baseUri + query, function(err, res, body) { 
    console.log(JSON.parse(body)); 
}); 

.

문제는이 문제가 바닥 수와 관련이없는 "정상적인 주소"에만 적용됩니다.

var address = 'Sukhumvit 21 Road'; 

을하지만이 작동하지 않습니다 : 즉,이 작동 이제

var address = 'Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road'; 

내가 지금처럼 가능한 시험의 매우 원유 세트와 API 여러 번 쿼리 오전 :

Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road 
Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road 
Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road 
Unit 255/109 15th Flr., Sukhumvit 21 Road 
255/109 15th Flr., Sukhumvit 21 Road 
15th Flr., Sukhumvit 21 Road 
Flr., Sukhumvit 21 Road 
Sukhumvit 21 Road ==> it works! 
0,123,516 : 그것은이 모든 문자열을 시도한다는 것을 의미
//create trials 
    var 
    trials = [], 
    addressParts = address.split(' '); 

    for (var i = 0, il = addressParts.length; i < il; i++) { 
    if (il - i >= 2) trials.push(addressParts.slice(i, il).join(' ')); 
    } 

많은 요청이 필요하므로 매우 느립니다.

"주소가 아닌"정보를 걸러내는 더 효과적인 방법이 있습니까? 태국어와 같은 비 서구어에서이 작업을 수행 할 방법을 찾고 있습니다.

+0

미국 주소 인 경우 SmartyStreets에는 [주소 추출 API] (http://smartystreets.com/products/liveaddress-api/extract)가 있는데 ... 태국인에게 도움이 될 수 있습니다 ... – Matt

+0

@ 매트 내 진짜 질문은 알고리즘이 작동하는 방법이라고 생각합니다. ;) – Tom

+1

글쎄, 그건 복잡해. 적어도 ... 내가 여기서 널 도울 수 있으면 좋겠다. – Matt

답변

0

시퀀스 태그 지정 문제를 살펴 봐야합니다. 이것은 본질적으로 여기에있는 것입니다. 두드러진 예가 named entity recognition입니다.

작업은 문자열에서 특정 태그가있는 단어로 추출하려는 내용을 확인하는 것입니다. 태그가 'Relavant'라고 가정 해 봅시다. 그런 다음 해당 태그를 필요로 문자열의 각 단어를 생각할 수 있습니다 : 나는 단어를 나타 내기 위해 태그 [R]을 사용

'Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road' 
'[NR] [NR]   [NR] [NR] [NR] [NR] [R]  [R][R] 

쿼리와 관련이있다. 그런 다음 관련 단어만으로 쿼리를 작성할 수 있습니다 (또는 더 적합한 경우 견고성을 높이기 위해 실제로 가장 긴 인접한 관련 단어 문자열).

그러면 작업은 쿼리에서 관련성이없는 단어의 관련성을 식별하는 시퀀스 태그 지정자를 작성하는 것입니다. 이를 교육용 데이터 (학습 결과를 반환하는 쿼리가 유효하고 다른 모든 쿼리가 유효하지 않다고 가정하여 교육 데이터를 얻을 수 있음)를 감독 문제로 사용하려고합니다. 가장 경쟁력있는 시퀀스 태그 생성기는 조건부 임의 필드로, 태그 지정을 빠르고 정확하게 수행 할 수 있습니다.

조심하십시오 --- 이것은 빠른 해결책이 아닙니다. 데이터 수집, 관련 기능 확인 및 평가에 상당한 시간을 투자해야합니다. 이 물건이 너에게 얼마나 중요한지 모르겠다!

+0

그러나 흥미로운 것은, 그러한 교육 자료가 어떻게 Grand Parkview Asoke와 관련이없고 Sukhumvit과 관련이 있는지를 구별 할 수있는 방법은 무엇입니까? 이것들은 모두 이름이며, 심지어 수 백만 건의 테스트가 있더라도 수크 쿰빗은 단 한 번의 거리 이름이기 때문에 한 번만 입력 할 수 있습니다. – Tom

+0

아이디어는 단어의 특징 (문자열의 위치, 알려진 거리/건물 목록, 근처 단어 (예 : "도로"옆에있는 경우 거리 등일 수 있음)을 사용하는 것입니다. 단지 하나의 가능한 기능 일 뿐이므로이 예에서는 유용하지 않을 것입니다. –

+0

이 문자열의 임의적 인 임의성으로 인해보다 합리적인 순서의 재판을 만드는 것이 더 합리적이지 않습니까? 예를 들어, 전체 문자열로 시작한 다음 하나씩 단어를 제거하는 것보다 일괄 적으로 단어를 시도하는 것이 더 의미가 있습니다. – Tom

1

특정 주소 입력란이있는 양식이없는 경우. 좋은 접근법은 문자열 주소를 잘 정의 된 부분으로 분리하는 것입니다. 예.

"Grand Parkview Asoke, Unit 255/109 15th Flr., Sukhumvit 21 Road" 
1st part: "Grand Parkview Asoke" 
2nd part: "Unit 255/109 15th Flr." 
3rd part: "Sukhumvit 21 Road" 
// Of course it would be more complex than just splitting at commas. 

주소는 전통적으로 정보가 문자열 끝에 밀집 해있는 형태로 작성됩니다.밀도가 높다는 것은 인터넷에서 사용 가능한 정보의 양이 더 많을 확률을 의미합니다. 따라서 마지막 부분 즉, 정보 출처의 Sukhumvit 21 Road은 한 번에 전체 문자열보다 더 많은 결과를 제공합니다.

아니오. 귀하가받는 결과 중
1) 둘 이상의 결과 : 검색어 문자열에 더 많은 정보를 추가하십시오. Unit 255/109 15th Flr., Sukhumvit 21 Road
2) 결과 없음 : 쿼리 문자열의 일부를 제거합니다. 예 : 21 Road

양식을 다른 주소로 분해하면 다른 제안이 이미 나와 있습니다. 거리 주소 등. 더 나은 상태가되어 질의를 작성합니다.

다시 말하지만, 이것은 내가 생각한 것입니다. 분명히 문제의 수학적 모델링을 기반으로 훨씬 더 나은 접근법이있을 것입니다.

+0

사람들은 대개 쉼표를 사용하지 않으며 주소가 중국어로 된 상황을 고려하지 않습니다. 또는 타이 스크립트. – Tom