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


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

  • 2016년 07월 18일에 작성됨

조회수 154


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로 비동기잡 걸어서 돌리면 되지 않을까 싶습니다.
  • 코드에 에러가 있어 손봤습니다.
  • 2016년 07월 25일에 작성됨


Hashcode사이트는 Ruby on rails로 구성되어 있는데요. 얼마전에 검색을 개선하기 위해서 elastic search를 적용했습니다. Elasticsearch Gem을 참고해 보시면 좋겠네요.

  • 2016년 07월 19일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close