推荐者应用。图片由作者提供。
推荐系统 (RSs)无处不在**。亚马逊、网飞、Spotify、YouTube 以及我们日常使用的更多服务和应用在后端都有某种推荐引擎。**
RSs 帮助用户找到他们感兴趣的项目**,这可以增加平台上的参与度:如果一个平台推荐感兴趣的项目,用户会在那个平台上花更多的时间。**
我刚刚在波尔扎诺自由大学完成了 RS 课程,我意识到这个领域有多广阔。基于特定的应用领域**(音乐、旅游、电影……),有许多技术和策略来**构建现代而强大的 RSs****
在本文中,我将为电影推荐构建一个简单的 web 应用程序。特别是,我将采用一种基于内容的方法。****
主要有两种类型的 RSs: 基于内容的 RSs 和协同过滤 RSs** 。然后,不同的高级技术可以应用于以提高推荐的质量(上下文感知、会话感知、重新排序等等)。**
在中,基于纯内容的 RSs** 条目被表示为一组特征,通常用自然语言表示为元数据(标题、描述、关键字、标签……)。这个名字来源于我们用每个项目的内容作为描述**。****
这组元数据然后被转换成一个矢量**(矢量化),并且所有的矢量被相互比较,形成一个“相似性矩阵”。通过查找该矩阵,可以获得给定项目的**建议。****
当建立一个 RS 的时候,有很多事情到到到需要考虑,伦理方面就是其中之一。一个 RS 应该通过向所有用户和覆盖所有物品空间的推荐好物品来公平。例如,我们不希望只有少数用户收到好的推荐,我们也希望所有可用的项目有相同的概率被检索。****
另一个重点是关于评估**。由于数据的稀疏性(在协作过滤方法的情况下)和缺乏基础事实(标签),评估一个 RS 不是无足轻重的,需要知识和实验。**
在本节中,我报告了我对电影上的提取和组合** 信息执行的预处理 操作的**概述。****
对于这个项目,我使用的是 TMDB 5000 电影数据集,它包含了来自“电影数据集”(TMDB) [1]的大约 5000 个电影元数据。
数据集来自两个 CSV 文件** : credit.csv、包含电影的演职人员信息,以及 *movies.csv、*包含所有其他信息**,排列在 20 列中。并非所有的列都将被使用。**
需要注意的是,有些列包含 JSON 属性。
第一个操作是合并两个数据集**,然后我解析 JSON 值以获得普通属性。这个操作之后,我选择了属性作为**“内容”来描述物品(电影)。我特别选了:片名、剧情简介、流派、关键词、演职人员、剧组人员。
最后,我创建了一个包含所有电影和相关元数据的新数据集**,连接在一个名为“tags”的单列中。该列包含代表每部电影的**属性。****
我还添加了“ popularity ”列:该信息可用于细化推荐**,但我不会在这个简单的项目中使用它。**
元数据数据集。图片由作者提供。
例如,下面是头像电影的“标签”列的内容:
“阿凡达”电影的元数据示例。图片由作者提供。
相似性矩阵是基于内容的 RSs 的基本组成部分。该矩阵包含物品之间的成对相似性,并且给出一个物品允许系统检索最相似的物品**。**
在这个项目中,我使用了三种不同的矢量化方法将元数据转换成矢量**,然后我使用余弦相似度计算相似度矩阵。**
首先:什么是余弦相似度?
余弦相似性是一个相似性度量用来表达两个数字向量的相似程度。该度量的范围从-1,表示完全不同,到 1,表示完全相似。给定向量 A 和 B,下面的公式将计算余弦相似度。[2]****
余弦相似度。图片由作者提供。
正如我所说的,我使用了三种矢量化方法**,然后是相似性矩阵的**计算:****
- TF-IDF 矢量器 : 术语频率—逆文档频率是一种技术,用于对文档集合中文档中每个单词的重要性进行评分。其思想是,如果单词 w 在文档 a 中频繁出现,但在集合 D 的所有其他文档中不频繁出现,那么单词 w 在文档a中是重要的,该工具产生一个向量,其值表示每个文档 中单词的重要性。 [3]**
TF-IDF 矢量化和相似性矩阵。作者代码。
- 计数矢量器 : 该工具产生一个矢量,其值基于所有文档中每个单词的频率(计数)。主要思路是映射出最多和最少**的常用词【4】。**
计数矢量化和相似性矩阵。作者代码。
- 哈希矢量器 : 该矢量器对每个文档中的词频应用**哈希函数。它是计数矢量器[5]的变体。**
哈希矢量化和相似矩阵。作者代码。
****最终矩阵通过乘以来自先前步骤的矩阵获得:
组合相似性矩阵。作者代码。
最后,我连载了的《黑客帝国:
矩阵序列化。作者代码。
现在我们可以在我们的推荐函数中使用这个矩阵。
推荐系统的核心部分是推荐功能**。该功能**根据与所选项目的相似性对现有项目进行排序:当用户选择一部电影时,该功能将推荐与 a. 相似的 n 部电影
该函数将电影的标题和相似矩阵作为输入,并且返回前 n 部相似电影的海报和剧情**。海报和情节由" get_poster_plot() "函数检索,该函数使用 OMDb API [6]。**
代码如下:
推荐功能。作者代码。
作为最后一步,我决定用Streamlit【7】构建一个简单的 web 应用程序**,以展示推荐系统。你可以在我的拥抱脸上找到这个应用程序:**
huggingface.co](https://huggingface.co/spaces/EdBianchi/JustMovie)
app 由三个主要部分组成。在第一部中,一个选择栏允许用户在可用电影之间搜索/滚动并选择一部。
第二部分展示 top-9 推荐电影,有海报和剧情。最后一部分显示了最近查看的项目。
如果您不熟悉 Streamlit 并希望了解更多,请参考本文:
[## 如何用 8 个简单的步骤构建一个有效的 Web 应用程序
python .平原英语. io](https://python.plainenglish.io/how-to-build-an-effective-web-app-in-8-simple-steps-391310ebfbea)
下面是网络应用的完整代码:
在本文中,我为电影构建了一个简单、纯粹的基于内容的 RS。试一试,让我知道你的想法。
除了简单之外,我认为的建议还不错。由于我们只利用了“内容”,即项目描述,因此所提出的推荐是非个性化的(对所有用户都一样)。
更多高级 RSs 会考虑多个方面,如用户历史和上下文,通常还会考虑用户到用户的相似性(需要用户的数据)。这些因素导致个性化推荐,也就是说不同的用户即使选择了同一个项目也会得到不同的建议。
一般来说,现代 RSs 结合了不同的技术来进一步细化推荐。
感谢阅读!
[1]电影数据库、 TMDB 5000 电影数据集 (2017)、ka ggle 【2】余弦相似度 (2022)、维基百科 【3】tfidf 矢量器 (2022)、Scikit-learn 【4】计数矢量器 (2022)、Scikit-learn 【5】哈希矢量器**