문제
관련/공통 키워드 또는 태그의 공간 맵을 구축하기 위한 전략이나 아이디어를 이해하려고 노력하고 있습니다.SO를 예로 사용합니다.당신이 가면 https://stackoverflow.com/tags "python"을 입력하면 해당 단어가 포함된 모든 태그가 표시되지만 밀접하게 관련된 태그(WSGI, Google App Engine, 비행 등)는 표시되지 않습니다.
내 질문에 따르면, 검색에서 밀접하게 관련된 태그/키워드를 무게순으로 정렬하여 찾기 위해 쿼리할 수 있는 공간 맵을 어떻게 구축할 수 있습니까?그렇다면 태그 foo의 가중치를 잠재적으로 더 많은 수의 태그에 저장하고 시스템의 응답성을 유지하는 방법은 무엇입니까?
저는 이미 David Weinberger가 진행한 Google Tech-talk를 시청했는데, 이는 저를 생각하게 만드는 훌륭한 기술 강연입니다.http://video.google.com/videoplay?docid=2159021324062223592&ei=qseASZvgI6e4qAP91a2PDg&q=google+tech+talk
해결책
O'Reilly의 클러스터링 개념을 확인하세요. "집단지성 프로그래밍".
다른 팁
그러한 관계에 관한 데이터를 구축하는 가장 가능성 있는 방법은 어떤 태그가 가장 자주 함께 표시되는지, 동시에 가장 적은 수의 다른 태그와 함께 표시되는지를 분류하는 것인 것 같습니다.
즉, "c++"와 "stl"은 함께 많이 등장하고, "stl"은 "c++" 없이는 거의(?) 나오지 않으므로 서로 관련이 있다(적어도 한 방향으로)."c++"와 "알고리즘"도 함께 많이 등장하지만, 따로 등장하는 경우가 더 많아 서로 관련이 없습니다.
데이터가 어떻게 구성될 수 있는지 생각하면서 제가 생각한 아이디어 중 하나는 아마도 4개의 테이블 시스템일 수 있었습니다.하나의 테이블은 소스 데이터입니다(예:SO를 사용하면 일종의 질문 테이블이 있어야 하며, 이는 태그 테이블에 조인된 다음 태그 테이블에 다시 조인되는 태그 가중치 테이블입니다.
#pseudo code
source table {
id: int
source_data: text
}
source_tag table {
source_id: int
tag_id: int
}
tag table{
id: int
tag: String(30)
}
tag_weight table {
base_tag_id: int
weight: float( 0-10 or 100 ) or int ( count of mutual occurrence )
source_tag_id: int
}
이 구조가 얼마나 효율적인지는 모르겠지만, 작업할 부분이 있다고 생각합니다.그렇지 않으면 소스 데이터에 대한 새로운 승인이 업데이트 후 트리거를 실행하거나 백그라운드에서 작업자 프로세스가 미리 설정된 시간에 가중치를 재조정하도록 할 수 있습니다.