disco

disco

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

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

推荐系统协同过滤RubyRails矩阵分解Github开源项目

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

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多