2章 その9
続き。
1ユーザあたり15件では足りないので、最近の100件を取得できるようにfillItem関数を修正
http://www.bitbucket.org/shokai/collective-intelligence-study/changeset/89c724b7af46/
# すべてのユーザによって投稿されたリンクを取得 def fillItems(user_dict) all_items = Hash.new user_dict.keys.each{ |user| posts = Array.new 3.times do # ユーザの最近の投稿を3回チャレンジする begin posts = @del.get_userposts(user, 100) # 100件取得 rescue puts 'Failed user ' + user + ', retrying' sleep 4 # 4秒停止してリトライ end end next if posts.length == 0 # 取得できてなかったら次のユーザへ posts.each{ |post| url = post user_dict[user][url] = 1.0 all_items[url] = 1 } # 空のアイテムを 0.0で 埋める all_items.keys.each{ |item| user_dict.keys.each{ |user| user_dict[user][item] = 0.0 if !user_dict[user].key?(item) } } } return user_dict end
で、前と同じようにarduinoタグから辿って72人分の最近のブックマークを取得した。
p.23より、あるURLと似た人に似たスコアが付いているURLをレコメンドする
irb(main):080:0> user = delusers.keys[rand(delusers.length)] => "idefarmen" irb(main):081:0> url = c.getRecommendations(delusers,user)[0].values[0] => "http://www.opengeospatial.org/projects/groups/sensorweb" irb(main):082:0> c.topMatches(c.transformPrefs(delusers),url) => [{1.0=>"http://en.wikipedia.org/wiki/Life_hack"}, {0.702179147764697=>"http://www.openrightsgroup.org/2008/09/29/capturing-the-database-state-community-photocall/"}, {0.231740595717936=>"http://www.arduino.cc/"}, {-0.0138888888888889=>"http://code.google.com/p/cgvis/"}, {-0.0197796943032309=>"http://gainer.cc/"}] irb(main):083:0> user = delusers.keys[rand(delusers.length)] => "tangobear" irb(main):084:0> url = c.getRecommendations(delusers,user)[0].values[0] => "http://www.facehunter.blogspot.com/" irb(main):085:0> c.topMatches(c.transformPrefs(delusers),url) => [{1.0=>"http://au.youtube.com/watch?v=EPsmrEmQ_lk"}, {0.702179147764697=>"http://www.nearfield.org/"}, {0.335927406179106=>"http://www.freeduino.org/"}, {-0.0138888888888889=>"http://code.google.com/p/cgvis/"}, {-0.0197796943032309=>"http://gainer.cc/"}] irb(main):086:0>