Module: Recommendations::User::Similarity

Included in:
Recommendations::User
Defined in:
lib/recommendations/user/similarity.rb

Instance Method Summary collapse

Instance Method Details

#similars(count = Recommendations.configuration.similar_items_count) ⇒ Object



4
5
6
# File 'lib/recommendations/user/similarity.rb', line 4

def similars(count = Recommendations.configuration.similar_items_count)
  Recommendations.redis.zrevrange("recommendations:similars:user:#{id}", 0, count - 1)
end

#update_similarsObject



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/recommendations/user/similarity.rb', line 8

def update_similars
  Recommendations.redis.del("recommendations:similars:user:#{id}")

  similar_users = {}

  ratings.each do |item_id, rating|
    similars = Item.find(item_id).ratings(rating)

    similars.reject {|uid| uid == id}.each do |user_id|
      user_rating = Recommendations.redis.zscore("recommendations:ratings:item:#{item_id}", user_id)
      difference = (Float(user_rating) - Float(rating)).abs

      similar_users[user_id] ||= [0,0]
      similar_users[user_id][0] += difference
      similar_users[user_id][1] += 1
    end
  end

  similar_users.each do |user_id, (difference, common_items)|
    difference_factor = Float(Recommendations.configuration.user_tolerance) - Float(difference)/Float(common_items)
    common_items_factor = 0.2 * Float(common_items)
    similar_users[user_id] = difference_factor + common_items_factor
  end

  similar_users.each do |user_id, score|
    Recommendations.redis.zincrby("recommendations:similars:user:#{id}", score, user_id)
  end
end