2010-05-27 4 views
3

저는 벽에 특정 게시물 (페이스 북에서 사용하는 것과 비슷한 종류의 벽)을 찾는 무료 텍스트 검색 알고리즘을 작성하려고합니다. 사용자는 검색 필드에 몇 단어를 쓰고 해당 단어가 포함 된 게시물에 조회수를 기록 할 수 있다고 가정합니다. 일치하는 점수에 따라 상단과 그 다음 다른 게시물의 순서가 가장 잘 맞습니다.게시물 검색 알고리즘 작성하기

나는 쿼리 단어 "x"및 게시물 단어 "y"와 비교할 때 각 게시물의 점수를 계산하기 위해 "distance (Levenshtein)"e (x, y) = e "를 사용합니다 : score (x, y) = 2^(2 - e) (1 - min (e, | x |)/| x | 검색어의 문자 수입니다.

게시물의 각 단어는 특정 게시물의 총 점수에 기여합니다. 이 방법은 게시물의 크기가 대략 같을 때 잘 작동하는 것으로 보이지만 때로는 특정 큰 게시물이 실제로는 검색어와 관련이없는 동안 많은 단어가있는 경우에만 점수를 올릴 수 있습니다.

나는이 문제를 잘못된 방식으로 접근하고 있습니까, 아니면 제가 생각하지 못한 점수를 정상화 할 수있는 방법이 있습니까?

답변

1

예. 당신이 사용할 수있는 많은 정규화 방법이 있습니다. 이것은 잘 연구 된 분야입니다!

the vector space model을 살펴보십시오. TDF/IDF는 자신이하는 일과 관련이 있습니다. 엄격하게 당신이 사용하고있는 방법과 관련이 없지만 당신에게 어떤 표준화 리드를 줄 수 있습니다.

각 게시물을 비교하는 것은 O (N)이고 매우 느려질 수 있습니다. 문자열 거리 대신 stemmming을 사용하면 더 나은 결과를 얻을 수 있습니다. 그런 다음 VSM 역 색인에 넣을 수 있습니다.

많은 데이터베이스 (MySQL 및 Postgres 포함)에는 전체 텍스트 검색이 있습니다. 아마 직접하는 것보다 실용적 일 것입니다.

+0

감사합니다. tf-idf는 유망 해 보입니다. 나는 내가 사용하고있는 검색 질의가 동일한 글에 존재할 때 그들의 발생이 더 중요해야하는 몇 개의 단어로 구성 될 수 있기 때문에 단지 나의 문제에 그것을 적용 할 필요가있다. 벽에있는 게시물의 수는 꽤 겸손합니다 (최대 10000 개의 게시물). 그러나 모든 게시물의 모든 단어와 각 검색어를 비교해야하므로 O (N^3)을 얻습니다. 전체 텍스트 검색은 MS SQL 2008 데이터베이스에 통합되었습니다. 내가 그것을 조사하기 시작한 이유는 퍼지 단어 검색을 원했기 때문 이었지만, 아마도 데이터베이스가이를 처리 할 수 ​​있었을까요? – MdaG

+0

MSSQL에 대해 모르겠지만 Postgres는 매우 훌륭하고 사용자 정의가 가능합니다. 나는 당신과 비슷한 것을하려고 시도했다. (텍스트가 아닌 문서상에서 일치하는 퍼지 문자열). 현재의 솔루션은 퍼지 매칭 알고리즘을 중심으로 분할하고 중간에 벡터 공간 검색을 배치하는 것입니다. 나를 위해 일하는 것 같다! folktunefinder.com – Joe