class Recommendify::JaccardInputMatrix
Public Class Methods
new(opts={})
click to toggle source
Calls superclass method
Recommendify::InputMatrix::new
# File lib/recommendify/jaccard_input_matrix.rb, line 5 def initialize(opts={}) check_native if opts[:native] super(opts) end
Public Instance Methods
similarities_for(item1)
click to toggle source
# File lib/recommendify/jaccard_input_matrix.rb, line 14 def similarities_for(item1) return run_native(item1) if @opts[:native] calculate_similarities(item1) end
similarity(item1, item2)
click to toggle source
# File lib/recommendify/jaccard_input_matrix.rb, line 10 def similarity(item1, item2) calculate_jaccard_cached(item1, item2) end
Private Instance Methods
calculate_jaccard(set1, set2)
click to toggle source
# File lib/recommendify/jaccard_input_matrix.rb, line 32 def calculate_jaccard(set1, set2) (set1&set2).length.to_f / (set1 + set2).uniq.length.to_f end
calculate_jaccard_cached(item1, item2)
click to toggle source
# File lib/recommendify/jaccard_input_matrix.rb, line 27 def calculate_jaccard_cached(item1, item2) val = ccmatrix[item1, item2] val.to_f / (item_count(item1)+item_count(item2)-val).to_f end
calculate_similarities(item1)
click to toggle source
# File lib/recommendify/jaccard_input_matrix.rb, line 21 def calculate_similarities(item1) (all_items - [item1]).map do |item2| [item2, similarity(item1, item2)] end end
check_native()
click to toggle source
# File lib/recommendify/jaccard_input_matrix.rb, line 49 def check_native return true if ::File.exists?(native_path) raise "recommendify_native not found - you need to run rake build_native first" end
native_path()
click to toggle source
# File lib/recommendify/jaccard_input_matrix.rb, line 54 def native_path ::File.expand_path('../../../bin/recommendify', __FILE__) end
redis_url()
click to toggle source
# File lib/recommendify/jaccard_input_matrix.rb, line 58 def redis_url Recommendify.redis.client.location end
run_native(item_id)
click to toggle source
# File lib/recommendify/jaccard_input_matrix.rb, line 36 def run_native(item_id) res = %x{#{native_path} --jaccard "#{redis_key}" "#{item_id}" "#{redis_url}"} raise "error: dirty exit (#{$?})" if $? != 0 res.split("\n").map do |line| sim = line.match(/OUT: \(([^\)]*)\) \(([^\)]*)\)/) unless sim raise "error: #{res}" unless (res||"").include?('exit:') else [sim[1], sim[2].to_f] end end.compact end