Rubyで書くMovieLensデータセットの変換
MovieLensと呼ばれる映画の批評データを使って映画の推薦を行ってみよう,という試みです.
今回は元データをこれまでに作ったプログラムで使えるように変換するところまでやります.
MovieLensデータセットの変換
データの形式をこれまでのcritics(いわゆるHashのHash)と同じようにします.
やりかたは色々ありますが,ここではCSVライブラリを使いました.
require 'csv' module My class MovieLens def initialize(item_file, critic_file) @item_file = item_file @critic_file = critic_file end # # critics形式に変換したHashを返す # def to_hash movies = extract_movies extract_critics(movies) end # # 映画IDと映画名の組み合わせを得る # def extract_movies movies = {} # カラムセパレータが'|'なので注意 CSV.open(@item_file, 'r', '|') do |item| id = item[0].to_i title = item[1].to_s movies[id] = title end movies end # # ユーザIDと映画の評価値の組み合わせを得る # def extract_critics(movies) critics = Hash.new({}) # カラムセパレータがタブなので注意 CSV.open(@critic_file, 'r', "\t") do |critic| user = critic[0].to_i title = movies[critic[1].to_i] rating = critic[2].to_f critics[user] = critics[user].merge({ title => rating }) end critics end end end
実行結果
このデータセットを後で使えるように,Marshalでファイルに保存します.
movie_lens = My::MovieLens.new('u.item', 'u.data') File.open('movie_lens.dump', 'w') do |file| Marshal.dump(movie_lens.to_hash, file) end
いざ,実行!
% ./movie_lens.rb % ls -la movie_lens.dump -rw-r--r-- 1 user staff 719626 8 25 17:20 movie_lens.dump
MovieLensデータセットのでき上がり.