Class: Recommendify::SimilarityMatrix

Inherits:
Object
  • Object
show all
Defined in:
lib/recommendify/similarity_matrix.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ SimilarityMatrix

Returns a new instance of SimilarityMatrix.



5
6
7
8
# File 'lib/recommendify/similarity_matrix.rb', line 5

def initialize(opts={})
  @opts = opts
  @write_queue = Hash.new{ |h,k| h[k] = {} }
end

Instance Attribute Details

#write_queueObject (readonly)

Returns the value of attribute write_queue.



3
4
5
# File 'lib/recommendify/similarity_matrix.rb', line 3

def write_queue
  @write_queue
end

Instance Method Details

#[](item_id) ⇒ Object



28
29
30
31
32
33
34
# File 'lib/recommendify/similarity_matrix.rb', line 28

def [](item_id)
  if @write_queue.has_key?(item_id)
    @write_queue[item_id]
  else
    retrieve_item(item_id)
  end
end

#commit_item!(item_id) ⇒ Object



36
37
38
39
40
# File 'lib/recommendify/similarity_matrix.rb', line 36

def commit_item!(item_id)
  serialized = serialize_item(item_id)
  Recommendify.redis.hset(redis_key, item_id, serialized)
  @write_queue.delete(item_id)    
end

#max_neighborsObject



14
15
16
# File 'lib/recommendify/similarity_matrix.rb', line 14

def max_neighbors
  @opts[:max_neighbors] || Recommendify::DEFAULT_MAX_NEIGHBORS
end

#redis_key(append = nil) ⇒ Object



10
11
12
# File 'lib/recommendify/similarity_matrix.rb', line 10

def redis_key(append=nil)
  [@opts.fetch(:redis_prefix), @opts.fetch(:key), append].flatten.compact.join(":")
end

#retrieve_item(item_id) ⇒ Object

optimize: the items are already stored in a sorted fashion. we shouldn’t throw away this info by storing them in a hash (and re-sorting later). maybe use activesupport’s orderedhash?



45
46
47
48
49
# File 'lib/recommendify/similarity_matrix.rb', line 45

def retrieve_item(item_id)
  data = Recommendify.redis.hget(redis_key, item_id)
  return {} if data.nil?
  Hash[data.split("|").map{ |i| (k,s=i.split(":")) && [k,s.to_f] }]
end

#update(item_id, neighbors) ⇒ Object



18
19
20
21
22
23
24
25
26
# File 'lib/recommendify/similarity_matrix.rb', line 18

def update(item_id, neighbors)
  neighbors.each do |neighbor_id, score|
    if @write_queue[item_id].has_key?(neighbor_id)
      @write_queue[item_id][neighbor_id] += score
    else
      @write_queue[item_id][neighbor_id] = score
    end
  end
end