ruby on rails 에서 형태소 분석기와 tf-idf 를 통해서 문서 score 알고리즘을 구현하고 싶은데요, 참고할 만한 사이트나 자료없을까요??

mecab 이용을 하여 구현해보려 했으나, 어렵네요...방법이 없을까요?

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을 참고해 보시면 좋겠네요.

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

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.