百科.dev
全部条目在线工具AI 编程趋势榜开源项目技术资讯提交条目
登录
< 返回工具列表
D

disco

> 编程语言
开源

针对使用协作过滤的 Ruby 和 Rails 的建议

609 stars0 点赞2 次浏览
访问官网GitHub

工具介绍

针对使用协作过滤的 Ruby 和 Rails 的建议

Disco

:fire: Recommendations for Ruby and Rails using collaborative filtering

  • Supports user-based and item-based recommendations
  • Works with explicit and implicit feedback
  • Uses high-performance matrix factorization

Installation

Add this line to your application’s Gemfile:

ruby
gem "disco"

Getting Started

Create a recommender

ruby
recommender = Disco::Recommender.new

If users rate items directly, this is known as explicit feedback. Fit the recommender with:

ruby
recommender.fit([
  {user_id: 1, item_id: 1, rating: 5},
  {user_id: 2, item_id: 1, rating: 3}
])

IDs can be integers, strings, or any other data type

If users don’t rate items directly (for instance, they’re purchasing items or reading posts), this is known as implicit feedback. Leave out the rating.

ruby
recommender.fit([
  {user_id: 1, item_id: 1},
  {user_id: 2, item_id: 1}
])

Each user_id/item_id combination should only appear once

Get user-based recommendations - “users like you also liked”

ruby
recommender.user_recs(user_id)

Get item-based recommendations - “users who liked this item also liked”

ruby
recommender.item_recs(item_id)

Use the count option to specify the number of recommendations (default is 5)

ruby
recommender.user_recs(user_id, count: 3)

Get predicted ratings for specific users and items

ruby
recommender.predict([{user_id: 1, item_id: 2}, {user_id: 2, item_id: 4}])

Get similar users

ruby
recommender.similar_users(user_id)

Examples

MovieLens

Load the data

ruby
data = Disco.load_movielens

Create a recommender and get similar movies

ruby
recommender = Disco::Recommender.new(factors: 20)
recommender.fit(data)
recommender.item_recs("Star Wars (1977)")

Ahoy

Ahoy is a great source for implicit feedback

ruby
views = Ahoy::Event.where(name: "Viewed post").group(:user_id).group_prop(:post_id).count

data =
  views.map do |(user_id, post_id), _|
    {
      user_id: user_id,
      item_id: post_id
    }
  end

Create a recommender and get recommended posts for a user

ruby
recommender = Disco::Recommender.new
recommender.fit(data)
recommender.user_recs(current_user.id)

Storing Recommendations

Disco makes it easy to store recommendations in Rails.

bash
rails generate disco:recommendation
rails db:migrate

For user-based recommendations, use:

ruby
class User  Change `:products` to match the model you’re recommending

Save recommendations

```ruby
User.find_each do |user|
  recs = recommender.user_recs(user.id)
  user.update_recommended_products(recs)
end

Get recommendations

ruby
user.recommended_products

For item-based recommendations, use:

ruby
class Product < ApplicationRecord
  has_recommended :products
end

Specify multiple types of recommendations for a model with:

ruby
class User < ApplicationRecord
  has_recommended :products
  has_recommended :products_v2, class_name: "Product"
end

And use the appropriate methods:

ruby
user.update_recommended_products_v2(recs)
user.recommended_products_v2

Storing Recommenders

If you’d prefer to perform recommendations on-the-fly, store the recommender

ruby
json = recommender.to_json
File.write("recommender.json", json)

The serialized recommender includes user activity from the training data (to avoid recommending previously rated items), so be sure to protect it. You can save it to a file, database, or any other storage system, or use a tool like Trove. Also, user and item IDs should be integers or strings for this.

Load a recommender

ruby
json = File.read("recommender.json")
recommender = Disco::Recommender.load_json(json)

Alternatively, you can store only the factors and use a library like Neighbor. See the examples.

Algorithms

Disco uses high-performance matrix factorization.

  • For explicit feedback, it uses stochastic gradient descent
  • For implicit feedback, it uses coordinate descent

Specify the number of factors and epochs

ruby
Disco::Recommender.new(factors: 8, epochs: 20)

If recommendations look off, trying changing factors. The default is 8, but 3 could be good for some applications and 300 good for others.

Validation

Pass a validation set with:

ruby
recommender.fit(data, validation_set: validation_set)

Cold Start

Collaborative filtering suffers from the cold start problem. It’s unable to make good recommendations without data on a user or item, which is problematic for new users and items.

ruby
recommender.user_recs(new_user_id) # returns empty array

There are a number of ways to deal with this, but here are some common ones:

  • For user-based recommendations, show new users the most popular items
  • For item-based recommendations, make content-based recommendations with a gem like tf-idf-similarity

Get top items with:

ruby
recommender = Disco::Recommender.new(top_items: true)
recommender.fit(data)
recommender.top_items

This uses Wilson score for explicit feedback and item frequency for implicit feedback.

Data

Data can be an array of hashes

ruby
[{user_id: 1, item_id: 1, rating: 5}, {user_id: 2, item_id: 1, rating: 3}]

Or a Rover data frame

ruby
Rover.read_csv("ratings.csv")

Performance

If you have a large number of users or items, you can use an approximate nearest neighbors library like Faiss to improve the performance of certain methods.

Add this line to your application’s Gemfile:

ruby
gem "faiss"

Speed up the user_recs method with:

ruby
recommender.optimize_user_recs

Speed up the item_recs method with:

ruby
recommender.optimize_item_recs

Speed up the similar_users method with:

ruby
recommender.optimize_similar_users

This should be called after fitting or loading the recommender.

Reference

Get ids

ruby
recommender.user_ids
recommender.item_ids

Get the global mean

ruby
recommender.global_mean

Get factors

ruby
recommender.user_factors
recommender.item_factors

Get factors for specific users and items

ruby
recommender.user_factors(user_id)
recommender.item_factors(item_id)

…

bash
sh
git clone https://github.com/ankane/disco.git
cd disco
bundle install
bundle exec rake test

Issues· 0 开放

查看全部 Issues在 GitHub 打开

暂无开放 Issues,或尚未同步最近议题。

> 标签

Rubyrecommendation-enginerecommender-system

暂无评论,来聊聊你的看法吧

> 工具信息

发布日期2026年8月1日
最后更新2026年9月17日
分类编程语言
定价开源

> 相关工具

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言