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>