2012-02-21 3 views
2

블로그의 게시물에 '관련 항목'기능을 구현하려면 어떻게해야합니까? 게시물 제목 분석을 기반으로 유사한 게시물 목록을 반환하고 싶습니다."관련 항목"in Ruby

이 작업을 수행하는 내 아이디어는 매우 비효율적 인 것처럼 보이고 이미이 기능을 지원하는 도구가 있는지 궁금합니다. Google, 루비 도구 상자를 통해 도움을 얻지 못했고 태양 흑점 API를 보았습니다. 블로그 응용 프로그램/콘텐츠 사이트에서 어떻게 구현합니까? 이것은 관련 게시물의 배열을 반환

@find_related = Post.search do 
    fulltext params[:title] 
end 

:이 기능에 관심있는 사람들을 위해

업데이트

, 나는 내 show 행동이를 사용할 수 있습니다 태양 흑점과 함께 가기로 결정 :

@related = @find_related.results 

모든 피드백이 감사 railscast가 있었던 큰 도움

답변

2

물론 좋은 도구가 있습니다. 기술적으로 원하는 것은 게시물 제목/기타 데이터의 색인 된 데이터베이스에서 전체 텍스트 검색입니다. Google은 모든 검색 및 색인 생성을 처리하는 외부 데이터베이스를 실행하는 도구를 제공합니다. 그 백엔드는 보편적이며 루비가 아닙니다. 앱에서 클라이언트 논리 만 사용합니다. 이는 기존 알고리즘보다 다른 알고리즘을 구현할 수 없기 때문에 매우 효율적입니다. 루씬

  • sunspot에 대한 래퍼 - - 스핑크스
  • elastic search에 대한 래퍼 - SOLR에 대한 래퍼
  • 이 라이브러리는 데이터 교환을위한 클라이언트 논리를 제공 위에서 언급과

    • ThinkingSphinx이 : 나는 다음을 추천 할 것입니다 검색 엔진 (모두 Apache 기초)

    +0

    감사합니다, 나는에 대한 이동하는 방법의 더 나은 아이디어가 생각 이. – Dru

    1

    귀하의 요구 사항이 허용하는 경우 확실하지 않지만 블로그 게시물에는 일반적으로 태그가 있습니다.

    비슷한 태그가있는 게시물은 어떻게 든 관련되어야하므로 다른 블로그 게시물을 필터링하는 방법으로 블로그 게시물의 태그를 사용할 수 있습니다. 일치하는 태그 수와 게시 된 최신 날짜를 기준으로 정렬 할 수 있습니다.

    1

    두 가지 방법이 있습니다. 다른 찬반 양론.

    쉬운 방법은 게시물에 키워드를 태그로 지정하고 일치하는 태그가있는 다른 기사를 가져 와서 그 결과를 동일한 태그의 수로 정렬하는 것입니다. 콘텐츠에 태그를 붙이면 잘 나타납니다. 그러면 오탐 (false positive)없이 좋은 결과를 얻을 수 있습니다. 그리고 내가 아는 한, 많은 블로깅 플랫폼이이 기능을 구현하고 있습니다.

    더 복잡한 방법은 NLP를 사용하여 각 게시물의 제목을 구문 분석하고 다른 게시물의 적합도를 계산하는 것입니다. 여기에는 더 많은 코드를 작성하고 오탐 (false positive)이 발생할 수 있습니다. 그러나 손으로 게시물에 태그를 지정할 필요가 없으며 특정 단어 나 구문에 가중치를 부여하려는 경우 게시물을 찾는 데 사용되는 방법을 조정할 수 있습니다. Treat, the Text Retrieval, Extraction and Annotation Toolkit을 살펴보면 Ruby NLP의 좋은 출발점처럼 보입니다.당신은 제목에 단어려고하는 경우에

    1

    이 원유 단순한 솔루션은 당신에게 준비가 뭔가 생산을위한 디딤돌 줄 수 있습니다

    #assume titles is an array of arrays of the words of titles and title is the one we are trying to mach with 
    HOW_MANY_RELATED_WORDS=3 
    titleWords=title.split(' ').sort 
    related=[] 
    trues=0 
    titles.each do |t| 
        t.each do |word| 
        true+=1 if titleWords.include?(word) 
        end 
        related<<t.join(' ') if(trues>=HOW_MANY_RELATED_WORDS) 
    end