2 답변

  • 좋아요

    3

    싫어요
    채택 취소하기

    위키에서 TF, IDF 를 보고 간단히 구현해봤습니다.

    Code

    file_tf = ->file { File.readlines(file).flat_map(&:split).
                            reduce(Hash.new(0)) {|tf,term| tf[term] += 1; tf} }
    dir_tf = ->dir do
      file_tfs = Dir[dir+"/*"].map(&file_tf)
      file_tfs.reduce(Hash.new(0)) {|tf,f| f.keys.each {|t| tf[t] += f[t]}; tf }
    end
    tf = ->term,file { Math.log(file_tf[file][term] + 1) } #=> log scale freq
    idt = ->term,dir,files=Dir[dir+"/*"] do
      Math.log( files.size / files.map(&file_tf).count {|file| file[term] > 0 } )
    end
    

    Test

    require 'rspec'
    include RSpec::Matchers
    
    term = "Starbuck"
    doc_dir, file1, file2= %w(./datas ./datas/moby.txt ./datas/moby_big.txt)
    
    expect( dir_tf[doc_dir].size ).to eq 33780
    expect( file_tf[file1][term] ).to eq 22
    expect( file_tf[file2][term] ).to eq 67
    
    expect( tf[term, file1] ).to eq Math.log(22 + 1)
    expect( tf[term, file2] ).to eq Math.log(67 + 1)
    expect( idt[term, doc_dir] ).to eq Math.log(2 / 2)
    

    복잡하게 가공하는게 아니면 필요하신 내용을 직접 구현하시면 어떨까 싶네요.

    • 파일사이즈가 크면 파일 열거자에 lazy걸고, 디렉토리 사이즈가 크면 future로 비동기잡 걸어서 돌리면 되지 않을까 싶습니다.
    • 코드에 에러가 있어 손봤습니다.
  • Hashcode사이트는 Ruby on rails로 구성되어 있는데요. 얼마전에 검색을 개선하기 위해서 elastic search를 적용했습니다. Elasticsearch Gem을 참고해 보시면 좋겠네요.

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.