2012-06-01 3 views
0

문제가 있으며 사소한 것처럼 들리지만 간단하고 확장 가능하고 효율적인 솔루션을 찾기 란 쉽지 않습니다. 웹 사이트 사용자가 위치를 검색 할 수있는 입력 텍스트가 하나 있습니다.문자열 내부의 블록의 의미 론적 가치를 찾는 데 팁이 필요합니다.

오늘 위치는 도시, 도시의 도시 또는 도시의 주소 일 수 있으며 사용자는 쉼표를 사용하여 도시에서 주소 또는 이웃을 도시와 분리해야합니다. 그러면 문자열을 쉽게 분할 할 수 있습니다 첫 번째 블록이 주소, 이웃 또는 도시인지 확인하십시오. 사용자가 필요한 모든 정보로 입력 내용을 채우지 못하고 도시가없는 주소를 입력하고 동일한 이름을 가진 거리와 일치하는 경우, 우리는 그 사람이 올바른 위치를 선택하도록 모든 위치를 표시합니다.

검색 로그를 사용하면 대부분의 사용자가 위치 검색 (thx google : p)을 사용하는 방법을 알려주는 모든 도구 설명과 함께 쉼표를 사용하지 않는다는 것을 알 수 있습니다.

그래서, 위치 검색에 대한 새로운 요구 사항은 같은 비 쉼표로 구분 된 주소, 받아 들일 필요하다 :

1. "5th Avenue" 
2. "Manhattan" 
3. "New York" 
4. "5th Avenue Manhattan" 
5. "5th Avenue Manhattan New York" 
6. "Manhattan New York" 
7. "5th Avenue New York" 

을하지만 각 블록 또는 동적의 의미를 찾을 수있는 방법을 찾을 수 없습니다 이 일을하는 방법. 즉, "New Yok"과 같은 문자열을 얻으면 "new"는 주소가 될 수 있고 "york"는 도시가 될 수 있습니다.

내 질문은, 내가 원하는 것을 얻기 위해 기술이나 프레임 워크를 사용하고 있습니까? 아니면 구체적으로 할 알고리즘 (단어, 쉼표 등의 수를 기준으로)을 사용하여 작업해야합니까?

EDIT1 :

나는 SQL 서버를 사용하기 때문에, 나는 정확한 나중에 전에 정확히 일치를하고 아닌, 전체 텍스트 검색을 여러 열 검색에 대해 생각하고

. 하지만 일부 불완전한 주소는 수천 개의 행을 반환합니다.

+0

당신이 세계 accros 모든 주소에 대한 일반적인 솔루션을 찾고 :

확인, 일반 전략을 확장? 또는 검색에 제약 조건을 적용 할 수 있습니까? 즉 : 미국 기반 주소에만 관심이 있습니다. –

+0

국가마다 다릅니다. – user1330271

+0

데이터베이스/모든 도시의 목록을 유지하고 입력 된 마지막 부분을 해당 도시 목록과 비교하는 방법은 어떻습니까? –

답변

1

특이성이 왼쪽에서 오른쪽으로 감소하는 열쇠가 아닙니까? 즉, 뉴욕 (뉴욕) 또는 맨해튼 (Manhattan)에 관계없이 항상 가장 구체적인 의미 요소가 가장 적습니다 (Borough 인 경우 도시에 대해 걱정할 필요가 없습니다. 스트리트라면 걱정하지 않아도됩니다.)

그래서 토큰을 뒤집어서 완전한 히트 ("맨하탄") 또는 키워드 ("애비뉴", "스트리트", "뉴") 중 하나를 찾으십시오. 의미 요소의 시작 또는 끝을 나타냅니다. 그래서 패스, 당신은 할 수 있습니다

"5th Avenue" -> TOKEN STREET_END_TOKEN 
"Manhattan" -> BOROUGH 
"New York" -> COMPOUND_BEGIN_TOKEN TOKEN 
"5th Avenue Manhattan" -> TOKEN STREET_END_TOKEN BOROUGH 
"5th Avenue Manhattan New York" -> TOKEN STREET_END_TOKEN BOROUGH COMPOUND_BEGIN_TOKEN TOKEN 
"Manhattan New York" -> BOROUGH COMPOUND_BEGIN_TOKEN TOKEN 
"5th Avenue New York" -> TOKEN STREET_END_TOKEN COMPOUND_BEGIN_TOKEN TOKEN 

한다고이에 대한 패턴 일치에 충분히 당신을 줄 수 있습니다.

UPDATE :

Step 1 : Generate a pattern of the query structure by identifying keywords ("Manhattan"), and semantically-meaningful ("Street", "Avenue") or grammatically-significant ("New", "Saint") tokens. 
Step 2: Match the generated pattern against a set of templates -- "* BOROUGH *" -> (Street) (BOROUGH) (City)", "* STREET_END_TOKEN" -> (Street name) (Street type), etc. 
Step 3: The result of Step 2 ought to give you a sense of what kind of query you're dealing with. You'll have to apply domain rules at that point (if you know the complete query is TOKEN STREET_END_TOKEN then you know "Well, this is a query that just specifies a street" and you have to apply whatever rule is appropriate (grab the locale of their browser? Use their query history to guess which neighborhood and city? etc.) 
+0

맞아. 네가 괜찮 으면 조금 더 정교하게 물어 보겠다. 나는 크게 난잡하다. – user1330271