2章 その6

今度は商品を中心に考える。

商品への趣向のリストから似た人を計算してきたが、要素を入れ替えるだけで似た商品を求める事ができる。
ユーザ達にされた評価(良いと付けたものも悪いと付けたものも)の傾向が似ている商品は、内容が似た商品になる

{人1 => {アイテム1=>2.5, アイテム2=>3.5},
 人2 => {アイテム1=>3.0, アイテム2=>3.5}}

だったのを

{アイテム1 => {人1=>2.5, 人2=>3.0},
 アイテム2 => {人1=>3.5, 人2=>3.5}}

に変換したい。

p.18,19より 人のアイテム=>スコアのリストを、アイテムの人=>スコアのリストに変形する関数を recommendations.rb に追加
http://www.bitbucket.org/shokai/collective-intelligence-study/src/fc808ee3ad93/recommendations.rb

  # 人のアイテム=>スコアのリストを、アイテムの人=>スコアのリストに変形する
  def transformPrefs(prefs)
    result = Hash.new
    prefs.keys.each{ |person|
      prefs[person].keys.each{ |item|
        # itemとpersonを入れ替える
        result[item] = Hash.new if result[item] == nil
        result[item][person] = prefs[person][item]
      }
    }
    return result
  end

動かしてみる
irb -r recommendations.rb

>> c = Critics.new
=> #<Critics:0x692544 @users={"Jack Matthews"=>{"The Night Listener"=>3.0, "Superman Returns"=>5.0, "Lady in the Water"=>3.0, "Snake on a Plane"=>4.0, "You, Me and Dupree"=>3.5}, "Gene Seymour"=>{"The Night Listener"=>3.0, "Superman Returns"=>5.0, "Lady in the Water"=>3.0, "Snake on a Plane"=>3.5, "You, Me and Dupree"=>3.5, "Just My Luck"=>1.5}, "Mick LaSalle"=>{"The Night Listener"=>3.0, "Superman Returns"=>3.0, "Lady in the Water"=>3.0, "Snake on a Plane"=>4.0, "You, Me and Dupree"=>2.0, "Just My Luck"=>2.0}, "Toby"=>{"Superman Returns"=>4.0, "Snake on a Plane"=>4.5, "You, Me and Dupree"=>1.0}, "Claudia Puig"=>{"The Night Listener"=>4.5, "Superman Returns"=>4.0, "Snake on a Plane"=>3.5, "You, Me and Dupree"=>2.5, "Just My Luck"=>3.0}, "Lisa Rose"=>{"The Night Listener"=>3.0, "Superman Returns"=>3.5, "Lady in the Water"=>2.5, "Snake on a Plane"=>3.5, "You, Me and Dupree"=>2.5, "Just My Luck"=>3.0}, "Michael Phillips"=>{"The Night Listener"=>4.0, "Superman Returns"=>3.5, "Lady in the Water"=>2.5, "Snake on a Plane"=>3.0}}>
>> movies = c.transformPrefs(c.users)
=> {"The Night Listener"=>{"Jack Matthews"=>3.0, "Gene Seymour"=>3.0, "Mick LaSalle"=>3.0, "Lisa Rose"=>3.0, "Claudia Puig"=>4.5, "Michael Phillips"=>4.0}, "Superman Returns"=>{"Jack Matthews"=>5.0, "Gene Seymour"=>5.0, "Mick LaSalle"=>3.0, "Toby"=>4.0, "Lisa Rose"=>3.5, "Claudia Puig"=>4.0, "Michael Phillips"=>3.5}, "Lady in the Water"=>{"Jack Matthews"=>3.0, "Gene Seymour"=>3.0, "Mick LaSalle"=>3.0, "Lisa Rose"=>2.5, "Michael Phillips"=>2.5}, "Snake on a Plane"=>{"Jack Matthews"=>4.0, "Gene Seymour"=>3.5, "Mick LaSalle"=>4.0, "Toby"=>4.5, "Lisa Rose"=>3.5, "Claudia Puig"=>3.5, "Michael Phillips"=>3.0}, "Just My Luck"=>{"Gene Seymour"=>1.5, "Mick LaSalle"=>2.0, "Lisa Rose"=>3.0, "Claudia Puig"=>3.0}, "You, Me and Dupree"=>{"Jack Matthews"=>3.5, "Gene Seymour"=>3.5, "Mick LaSalle"=>2.0, "Toby"=>1.0, "Lisa Rose"=>2.5, "Claudia Puig"=>2.5}}


似た映画を求める

>> c.topMatches(movies, 'Superman Returns')
=> [{0.657951694959769=>"You, Me and Dupree"}, {0.487950036474269=>"Lady in the Water"}, {0.111803398874989=>"Snake on a Plane"}, {-0.179847194799054=>"The Night Listener"}, {-0.422890031611031=>"Just My Luck"}]


映画名から、この映画に相性の良さそうでかつ映画をまだ見ていない人をリストアップ

>> c.getRecommendations(movies, 'Just My Luck')
=> [{4.0=>"Michael Phillips"}, {3.0=>"Jack Matthews"}]

Michaelがこれまで見た映画につけたスコア傾向から、Just My Luckを薦めるとよさそうとわかる