Project Icon

disco

Ruby协同过滤推荐系统库 支持用户和物品推荐

Disco是一个用于Ruby和Rails的推荐系统库,基于协同过滤技术。该库支持用户和物品推荐,可处理显式和隐式反馈数据,并使用高性能矩阵分解算法。Disco提供简洁的API,支持存储推荐结果和模型,能够解决冷启动问题。此外,它可与近似最近邻库集成,提升大规模数据集的性能。

Disco

:fire: 使用协同过滤为Ruby和Rails提供推荐

  • 支持基于用户和基于项目的推荐
  • 适用于显式和隐式反馈
  • 使用高性能矩阵分解

构建状态

安装

在应用程序的Gemfile中添加以下行:

gem "disco"

入门

创建一个推荐器

recommender = Disco::Recommender.new

如果用户直接对项目进行评分,这被称为显式反馈。使用以下方式训练推荐器:

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

ID可以是整数、字符串或任何其他数据类型

如果用户不直接对项目进行评分(例如,他们在购买商品或阅读文章),这被称为隐式反馈。此时不需要包含评分。

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

每个user_id/item_id组合应该只出现一次

获取基于用户的推荐 - "与你相似的用户也喜欢"

recommender.user_recs(user_id)

获取基于项目的推荐 - "喜欢这个项目的用户也喜欢"

recommender.item_recs(item_id)

使用count选项指定推荐数量(默认为5)

recommender.user_recs(user_id, count: 3)

获取特定用户和项目的预测评分

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

获取相似用户

recommender.similar_users(user_id)

示例

MovieLens

加载数据

data = Disco.load_movielens

创建推荐器并获取相似电影

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

Ahoy

Ahoy是一个很好的隐式反馈来源

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

创建推荐器并为用户获取推荐文章

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

存储推荐

Disco使在Rails中存储推荐变得简单。

rails generate disco:recommendation
rails db:migrate

对于基于用户的推荐,使用:

class User < ApplicationRecord
  has_recommended :products
end

:products更改为与您要推荐的模型相匹配

保存推荐

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

获取推荐

user.recommended_products

对于基于项目的推荐,使用:

class Product < ApplicationRecord
  has_recommended :products
end

为一个模型指定多种类型的推荐:

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

并使用相应的方法:

user.update_recommended_products_v2(recs)
user.recommended_products_v2

存储推荐器

如果您更喜欢即时进行推荐,可以存储推荐器

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

序列化的推荐器包含训练数据中的用户活动(以避免推荐之前已评分的项目),所以请确保保护它。您可以将其保存到文件、数据库或任何其他存储系统,或使用Trove等工具。此外,用户和项目ID应为整数或字符串。

加载推荐器

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

另外,您也可以只存储因子,并使用像Neighbor这样的库。请参阅示例

算法

Disco使用高性能矩阵分解。

指定因子数和迭代次数

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

如果推荐看起来不太理想,可以尝试修改"factors"参数。默认值是8,但对某些应用来说3可能更好,对其他应用300可能更合适。

验证

通过以下方式传入验证集:

recommender.fit(data, validation_set: validation_set)

冷启动

协同过滤存在冷启动问题。在没有用户或项目数据的情况下,它无法做出好的推荐,这对新用户和新项目来说是个问题。

recommender.user_recs(new_user_id) # 返回空数组

有多种方法可以解决这个问题,以下是一些常见的方法:

  • 对于基于用户的推荐,向新用户展示最受欢迎的项目
  • 对于基于项目的推荐,使用像tf-idf-similarity这样的gem进行基于内容的推荐

获取热门项目:

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

这对显式反馈使用Wilson分数,对隐式反馈使用项目频率。

数据

数据可以是哈希数组

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

或Rover数据框

Rover.read_csv("ratings.csv")

或Daru数据框

Daru::DataFrame.from_csv("ratings.csv")

性能

如果你有大量用户或项目,可以使用近似最近邻库如Faiss来提高某些方法的性能。

在应用的Gemfile中添加以下行:

gem "faiss"

优化user_recs方法:

recommender.optimize_user_recs

优化item_recs方法:

recommender.optimize_item_recs

优化similar_users方法:

recommender.optimize_similar_users

这应在拟合或加载推荐器后调用。

参考

获取ID

recommender.user_ids
recommender.item_ids

获取全局平均值

recommender.global_mean

获取因子

recommender.user_factors
recommender.item_factors

获取特定用户和项目的因子

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

致谢

感谢:

  • LIBMF提供高性能矩阵分解
  • Implicit作为用户和项目相似度的初始参考
  • @dasch提供gem名称

历史

查看更新日志

贡献

我们鼓励每个人帮助改进这个项目。以下是一些你可以帮助的方式:

开始开发:

git clone https://github.com/ankane/disco.git
cd disco
bundle install
bundle exec rake test
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号