Spotify——基于内容的音乐会推荐

Spotify——基于内容的音乐会推荐

作者: 希尔丁·瓦利德 , 萨马迪·马纳尔 , 安托万·拉邦

项目经理: 洛伊克·阿米安德,弗朗索瓦·贝利埃雷斯

Git 仓库: 音乐会-推荐-与-Spotify

概括

- 介绍

— 基于内容的过滤
— 协同过滤
— 上下文感知

- 我们的项目

— 使用的数据
- 第一次尝试
— 为我们现有的歌曲添加功能
— 余弦相似度模型
— 检索艺术家音乐会
— 构建应用程序

介绍

在过去十年中,机器学习推荐已被绝大多数向用户推荐内容的服务广泛使用。在线内容平台,如 Twitter、Facebook、Youtube、Spotify、Netflix ……为了吸引我们的注意力而不断地相互竞争。结果,工程师不得不想办法让我们留在他们的平台上,所以我们不会退出。

图片:Freepik.com

这就是为什么内容推荐在过去十年中得到如此记录的原因。已经开发了大量技术来使平台能够了解用户可能喜欢什么,并向他们推荐他们想要的内容。

ML 中的推荐是一个引人入胜且范围广泛的主题,我们将在这里介绍它的三个主要家族,以音乐流服务为例。

基于内容的过滤:

基于内容特征和内容元数据的推荐。该算法试图找到与用户已经喜欢的内容相似的内容。
例如:用户喜欢具有高 BPM 的流行歌曲,算法会找到符合此条件的音乐。

基于内容的过滤主要有三种方法:

  • 定性的 :使用允许为歌曲分配特征的专业库(舞蹈能力、流派、响度、声学……)
  • 定量的 :功能由社区手动填充。参与的人越多,获得的特征就越准确。
  • 分类 :我们使用机器学习自动从歌曲中获取特征,这需要大量的标记数据集。

协同过滤:

通过协同过滤,该算法考虑了相似用户喜欢推荐的内容,而不考虑内容特征本身。
例如:用户 A 与用户 B 共享其播放列表的 80%,因此,我们会将用户 A 播放列表的其余部分推荐给用户 B,反之亦然。
协同过滤会引发冷启动问题,如果我们没有足够的关于用户 A 的数据,我们就无法与其他用户建立相似性。

有两种主要方法可以判断用户是否喜欢一首歌:

  • 明确评级 :用户返回很明确,用户“喜欢”或“分享”歌曲,我们假设他喜欢这首歌。
  • 隐式评级 :我们根据用户活动预测评分。如果用户不“喜欢”一首歌但听了 20 次,我们假设他还是喜欢这首歌。

上下文感知:

这种方法更具异国情调,使用较少但非常有趣。这是最近的一个,它包括会计用户

  • 基于环境 : 我们根据地理数据进行推荐。例如:当用户访问 Venise 时推荐 Vivaldi 歌曲。
  • 用户相关 :我们在各种环境下听音乐:锻炼、步行到工作场所、烹饪、游戏、聚会……这些环境都会被考虑在内,以推荐合适的歌曲。

亚瑟梅洛 迈向数据科学

我们的项目

我们的目标是使用用户喜欢的歌曲或播放列表制作音乐会推荐应用。这在某种程度上是一个音乐推荐项目,只是我们只对那些推荐歌曲的艺术家感兴趣,以便向用户推荐这些艺术家的音乐会。

这个项目是由 Deepnet 成员向我们提出的。 Deepnet 是一个独立的协会,其目的是帮助学生提高机器学习技能并与志同道合的人建立联系。更多在 https://deepnet.fr .

我们可以自由选择任何方法和数据来制作这个项目,并且有大约 4 个月的空闲时间来完成它。

在我们审查不同技术的最先进阶段之后,我们决定首先寻找可用的数据。

使用的数据

在搜索数据时,我们意识到协同过滤和上下文感知推荐几乎不可能实现,因为我们无法收集当然受在线服务保护的用户相关或用户活动数据。

我们最终找到了 Spotify 自己发布的数据集,作为 Spotify 百万播放列表数据集挑战赛的一部分。

该数据集由 1000 个 json 文件组成,每个文件包含 1000 个播放列表,其中包含多个信息,例如名称、曲目数量、曲目名称、曲目 ID 等。这是一

来自 Spotify 百万播放列表数据集的示例 json 文件

第一次尝试

使用这个数据集,我们制作了第一个简单的模型,看看我们是否可以在没有额外数据的情况下获得一些结果。我们使用 pandas 解析 json 文件,以获取歌曲的数据框及其播放列表 ID(稍后我们将需要):

然后我们只保留了 track_uri 和 playlists.pid,并从它们中制作了一个交叉表。这个交叉表允许我们将每个播放列表放在一行中,歌曲放在列上,每个单元格是歌曲出现在这个播放列表中的次数。然后我们使用 pandas 的剪辑方法,因此最大频率为 1,因为我们认为一首歌曲在播放列表中出现不止一次会使我们的模型产生偏差。

然后我们将交叉表安装在 最近的邻居 模型,它允许我们输入一个播放列表,并在模型的图表中获取最接近这个播放列表的播放列表。

使用的度量是“jaccard”,因为它比其他度量更适合二进制数据,因为模型计算播放列表之间的距离。

当我们测试这个模型时,我们只得到了不相关的播放列表,并且模型偏爱具有相同歌曲的播放列表,这对推荐没有意义。所以我们决定尝试一种不同的方法,输入更多的数据。

为我们现有的歌曲添加功能

由于该模型不能仅基于声音是否属于播放列表,因此我们寻找为歌曲获取更多功能的方法。

然后我们想到了一个简单的想法:如果 Spotify API 可以为我们提供这些额外的数据呢?

值得庆幸的是,情况就是这样。 Spotify 有一个 API 路由,当我们提供歌曲 ID 时,它会返回这首歌的 json 特征。

使用 参差不齐 ,Spotify API 的 python 库,以下是我们从这条路线获得的功能:

 舞蹈能力,能量,键,响度,模式,演讲,声学,工具性,活力,价,节奏,持续时间_毫秒,时间签名

有了这个,我们现在有了一个包含更多数据的数据集,允许我们比较它们之间的歌曲,而不是比较播放列表的内容。

余弦相似度模型

在我们的最新技术中,我们看到在推荐系统中,最简单但最强大的技术之一是余弦相似度计算。

余弦相似度测量两个向量之间夹角的余弦值。由于我们数据集中的每首歌曲都是一个多维向量,因此余弦相似度计算了我们数据集中每个歌曲对的余弦相似度,并且可以计算新输入与我们现有歌曲的余弦相似度。

本钱布利 走向数据科学

以下是给定播放列表的工作方式:

这些额外的数据使我们能够获得一个非常强大的模型,从给定的播放列表中推荐相关的艺术家。

现在我们只需要为这些推荐的艺术家获取音乐会,然后将它们推荐给用户。

检索艺术家音乐会

在寻找检索音乐会的方法时,我们首先采用了抓取解决方案。我们使用 但我们最终放弃了这个解决方案,主要有两个原因:

  • 我们运行爬虫的网站太慢了,我们不得不预料会出现冻结页面加载的弹出窗口,导致爬虫在关闭窗口之前无法检索信息。
  • Selenium 本身非常繁重,需要大量计算资源,这在部署应用程序时一直是个问题。
  • 此外,我们必须从很多艺术家那里检索音乐会,即使是我们的应用程序运行一次,所以速度慢和计算问题太有害了。

再一次,我们决定使用 API,并选择了 TicketMaster 的 API 我们确定的更符合我们的需求。这个解决方案比前一个解决方案快了大约 15 倍,所以我们在项目的其余部分坚持使用它。

我们使用了他们 API 的两条路线:

  • /发现/v2/景点 :给定艺术家名称,返回与艺术家对应的景点 ID。
  • /发现/v2/事件 :给定一个景点 ID,返回一个涉及艺术家的事件列表。

我们所要做的就是从 API 的响应中检索我们需要的信息:预订链接、日期、价格、地点、邮政编码、城市和国家。

构建应用程序

在这一点上,我们拥有了我们需要的所有部件,我们剩下要做的就是组装它们。为此,我们构建了一个 Flask 应用程序,用户必须在其中输入播放列表或他选择的歌曲,然后他会得到推荐的音乐会作为回应。

由于我们都没有前端经验,所以我们决定暂时坚持使用简单的 API。

这是一个使用 Postman 的示例请求:

以下路线的完整注释代码:

示例响应:

走得更远

这个项目有很多方面可以改进。首先,我们只从 Spotify Million Playlists Dataset 中提取了 1 个 json 文件来构建我们的模型,但我们取得了令人印象深刻的结果。使用更多文件可以进一步提高我们艺术家建议的相关性。我们没有使用更多播放列表的唯一原因是,用于提取歌曲特征的 Spotify API 非常非常慢(仅 64,050 首歌曲大约需要 4 小时)。

基本算法余弦相似度是一个非常简单的模型,还有更多的推荐算法可能会给我们带来更好的结果。

我们的主要遗憾是我们无法访问用户活动数据,我们需要这些数据来实施协作过滤方法,这在在线内容平台中更为常见。

最终,应用程序可以通过前端进行改进,但更重要的是,用户可以使用他的 Spotify 帐户登录网站,我们可以使用他的帐户直接推荐音乐会,而无需他输入歌曲或播放列表。

结论

我们对我们得到的结果非常满意,这个项目让我们三个人在推荐领域迈出了一步,这非常有趣,其应用程序在互联网上随处可见。

我们要感谢我们的学校、HETIC,尤其是它的协会 Deepnet,它每年都领导项目,让新生参与令人惊叹的人工智能和软件工程项目。

感谢马克斯·科恩

你不能为草稿鼓掌

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/11630/48550311

posted @   哈哈哈来了啊啊啊  阅读(143)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示