ruby on rails 에서 형태소 분석기와 tf-idf 를 통해서 문서 score 알고리즘을 구현하고 싶은데요, 참고할 만한 사이트나 자료없을까요??
조회수 1263회
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
위키에서 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을 참고해 보시면 좋겠네요.
댓글 입력