Recommendify - Ruby/Redis-based recommendation engine

Once application content grows to a certain size, it becomes a challenge to help users find what interests them. Sites like Amazon have offered product recommendations for years based on shoppers’ browsing and buying habits. Recommendify from Paul Asmuth brings that sort of collaborative filtering to your Ruby application. Using a Redis backend, Recommendify lets you build “interaction sets” and retrieve recommendations:

# Our similarity matrix, we calculate the similarity via co-concurrence 
# of products in "orders" using the jaccard similarity measure.
class MyRecommender < Recommendify::Base

  # store only the top fifty neighbors per item
  max_neighbors 50

  # define an input data set "order_items". we'll add "order_id->product_id"
  # pairs to this input and use the jaccard coefficient to retrieve a 
  # "customers that ordered item i1 also ordered item i2" statement and apply
  # the result to the item<->item similarity matrix with a weight of 5.0
  input_matrix :order_items,  
    # :native => true,
    :similarity_func => :jaccard,    
    :weight => 5.0


recommender =

# add `order_id->product_id` interactions to the order_item_sim input
# you can add data incrementally and call RecommendedItem.process! to update
# the similarity matrix at any time.
recommender.order_items.add_set("order1", ["product23", "product65", "productm23"])
recommender.order_items.add_set("order2", ["product14", "product23"])

# Calculate all elements of the similarity matrix

# ...or calculate a specific row of the similarity matrix (a specific item)
# use this to avoid re-processing the whole matrix after incremental updates

# retrieve similar products to "product23"
  => [ <Recommendify::Neighbor item_id:"product65" similarity:0.23>, (...) ]

I can’t wait for a Spree plugin. Almost 400 watchers in the last week, grab the source on GitHub.

News Films

Our little film studio focuses on telling developer-centric stories that need to be seen.

GopherCon 2016 Conference Recap

0:00 / 0:00