推荐系统:基于内容的过滤

标签: 推荐系统 过滤 | 发表时间:2023-04-20 14:09 | 作者:MobotStone
出处:https://juejin.cn/tag/%E6%9E%B6%E6%9E%84

上一篇文章我们介绍了 推荐系统:ARL(关联规则学习),可以通过关联规则挖掘算法Apriori来实现关联规则推荐系统,今天我们来聊聊如何通过基于内容的过滤来实现推荐系统。

基于内容的过滤是用作推荐系统的另一种常用方法之一。内容的相似性是根据产品元数据计算的,它提供了制定推荐的选择,推荐与用户过往购买过的产品相关性最相似的产品。

元数据代表产品/服务的特性。例如,一部电影的导演、演员、编剧;作者、封底文章、书籍的译者或产品的类别信息。( 别问我为什么用国外的数据)

image-1674008532086

此图像包含用户喜欢的电影的描述。根据用户喜欢的电影向用户推荐电影,需要使用这些描述得到一个数学形式,即文本应该是可测量的,然后通过与其他电影进行比较来找到相似的描述。

我们有各种电影和关于这些电影的数据。为了能够比较这些电影数据,需要对数据进行矢量化。在向量化这些描述时,必须创建所有电影描述(假设 n)和所有电影(假设 m)中的唯一词矩阵。列中有所有唯一的单词,行中有所有电影,每个单词在交叉点的电影中使用了多少。这样,文本就可以被矢量化。

基于内容的过滤步骤:

  1. 以数学方式表示文本(文本矢量化):
  • 计数向量
  • 特遣队-IDF

2.计算相似度

1.文本向量化

文本矢量化是基于文本处理、文本挖掘和自然语言处理的最重要的步骤。诸如将文本转换为向量并计算它们的相似度距离等方法构成了分析数据的基础。如果文本可以用向量表示,那么就可以进行数学运算。

将文本表示为向量的两种常见方法是计数向量和 TF-IDF。

- 计数向量:

  • 第 1 步:所有唯一术语都放在列中,所有文档都放在行中。

image-1674008274542

  • 第 2 步:将文档中术语的频率放置在交叉点的单元格中

image-1674008286357

- TF-IDF:

TF-IDF 对文本和整个语料库(即我们关注的数据)中的单词频率执行归一化过程。换句话说,它对我们将创建的词向量进行了一般标准化,同时考虑了文档术语矩阵、整个语料库、所有文档以及术语的频率。这样就消除了一些由于Count Vector产生的偏差。

  • 第 1 步:计算 Count Vectorizer(每个文档中每个单词的频率)

image-1674008297933

  • 第 2 步:计算 TF(词频)

(相关文档中术语 t 的频率)/(文档中的术语总数)

image-1674008312104

  • 第 3 步:计算 IDF(逆向文档频率)

1 + loge((文档数 + 1) / (包含术语 t 的文档数 + 1))

样本检查文件总数:4

image-1674008341567

如果一个词t在整个语料库中出现频率很高,说明这个相关词影响了整个语料库。在这种情况下,对术语和整个语料库中的通过频率进行归一化。

  • 第 4 步:计算 TF * IDF

image-1674008352808

  • 第 5 步:L2 归一化

求行的平方和的平方根,并将相应的单元格除以找到的值。

image-1674008367758

L2 规范化再次纠正某些行中存在缺失值而无法显示其效果的单词。

2.计算相似度

假设我们有 m 部电影,在这些电影的描述中有 n 个独特的词。在我们以编程方式找到这些电影基于内容的相似性之前,让我们看看我们如何实际地做到这一点:

image-1674008380579

我们可以使用欧几里得距离或余弦相似度来找到向量化电影的相似度。

- 欧氏距离

通过计算欧几里德距离,可以得到两部电影之间的距离值,它表示电影之间的相似性。可以看出,随着距离的减小,相似度增加。这样,就可以进行推荐过程了。

image-1674008393896

image-1674008403420

- 余弦相似度:

image-1674008411805

欧几里得中有距离的概念,而余弦相似性中有相似性的概念。距离接近性和相似性不同性对应于这里的相同概念。

image-1674008419448

现在我们已经介绍了基于内容的过滤的逻辑,我们可以深入了解一下基于内容的过滤推荐。

问题:

一个新成立的在线电影平台想要向其用户推荐电影。由于用户的登录率很低,用户的习惯是未知的。但是,可以从浏览器中的痕迹访问有关用户观看了哪些电影的信息。根据这些信息,希望向用户推荐电影。

关于数据集:

主要电影元数据文件。包含有关 Full MovieLens 数据集中的 45,000 部电影的信息。功能包括海报、背景、预算、收入、发行日期、语言、制作国家和公司。

您可以在 此处访问数据集。 详细代码地址

创建 TF-ID 矩阵:

在项目开始时导入了必要的库,并读取了数据集。

这里要应用的第一个过程是使用 TF-IDF 方法。为此,调用了在项目开始时导入的 TfidfVectorizer 方法。输入stop_words='english'参数,删除语言中常用的不带测量值的词(and, the, at, on等)。这样做的原因是为了避免在要创建的 TF-IDF 矩阵中稀疏值会导致的问题。

image-1674008434743

tfidf_matrix 的形状为 (45466, 75827),其中 45466 表示概览数,75827 表示独特词数。为了能够在处理这种大小的数据时取得更好的进展,我会将 tfidf_matrix 交集处的值类型转换为 float32 并进行相应处理。

image-1674008444629

现在我们在 tfidf_matrix 的交集处有了分数,我们现在可以构建余弦相似度矩阵并观察电影之间的相似度。

创建余弦相似度矩阵:

使用项目开始时导入的cosine_similarity方法,求每部电影与其他电影的相似度值。

image-1674008453908

例如,我们可以找到第一个索引中的电影与所有其他电影的相似度得分如下:

image-1674008462657

根据相似性提出建议:

相似度是用余弦相似度计算的,但需要电影的名称来评估这些分数。为此,一个 pandas 系列包含哪部电影在哪个索引中被创建为 indices = pd.Series(df.index, index=df[‘title’]).

如下所示,在一些电影中观察到多路复用。

image-1674008471764

我们需要保留这些倍数中的一个并消除其余的,在最近的日期取这些倍数中最近的一个。这可以通过以下方式完成:

image-1674008479733

作为操作的结果,可以观察到每个标题都变成单数并且可以通过单个索引信息访问。

假设我们想要查找 10 部类似于夏洛克·福尔摩斯的电影。首先,通过在cosine_sim中输入福尔摩斯的索引信息来选择福尔摩斯电影,并访问表示这部电影与其他电影之间相似关系的分数。

image-1674008488090

名为 similarity_scores 的数据框被创建为更具可读性的格式。与 cosine_sim[movie_index] 的选定相似性保存为该数据框中的“分数”变量。

image-1674008497245

上面选择了与夏洛克电影最相似的 10 部电影的索引。这些索引对应的电影名称可以通过如下方式访问:

image-1674008505349

这10部电影在描述上与福尔摩斯最相似。这些电影可以推荐给看过福尔摩斯-夏洛克的用户。也可以尝试不同的电影,并观察推荐结果。

上一篇文章我们介绍了 推荐系统:ARL(关联规则学习),可以通过关联规则挖掘算法Apriori来实现关联规则推荐系统,今天我们来聊聊如何通过基于内容的过滤来实现推荐系统。

基于内容的过滤是用作推荐系统的另一种常用方法之一。内容的相似性是根据产品元数据计算的,它提供了制定推荐的选择,推荐与用户过往购买过的产品相关性最相似的产品。

元数据代表产品/服务的特性。例如,一部电影的导演、演员、编剧;作者、封底文章、书籍的译者或产品的类别信息。( 别问我为什么用国外的数据)

image-1674008532086

此图像包含用户喜欢的电影的描述。根据用户喜欢的电影向用户推荐电影,需要使用这些描述得到一个数学形式,即文本应该是可测量的,然后通过与其他电影进行比较来找到相似的描述。

我们有各种电影和关于这些电影的数据。为了能够比较这些电影数据,需要对数据进行矢量化。在向量化这些描述时,必须创建所有电影描述(假设 n)和所有电影(假设 m)中的唯一词矩阵。列中有所有唯一的单词,行中有所有电影,每个单词在交叉点的电影中使用了多少。这样,文本就可以被矢量化。

基于内容的过滤步骤:

  • 文本向量化
  • 计数向量
  • 特遣队-IDF

2.计算相似度

1.文本向量化

文本矢量化是基于文本处理、文本挖掘和自然语言处理的最重要的步骤。诸如将文本转换为向量并计算它们的相似度距离等方法构成了分析数据的基础。如果文本可以用向量表示,那么就可以进行数学运算。

将文本表示为向量的两种常见方法是计数向量和 TF-IDF。

- 计数向量:

  • 第 1 步:所有唯一术语都放在列中,所有文档都放在行中。

image-1674008274542

  • 第 2 步:将文档中术语的频率放置在交叉点的单元格中

image-1674008286357

- TF-IDF:

TF-IDF 对文本和整个语料库(即我们关注的数据)中的单词频率执行归一化过程。换句话说,它对我们将创建的词向量进行了一般标准化,同时考虑了文档术语矩阵、整个语料库、所有文档以及术语的频率。这样就消除了一些由于Count Vector产生的偏差。

  • 第 1 步:计算 Count Vectorizer(每个文档中每个单词的频率)

image-1674008297933

  • 第 2 步:计算 TF(词频)

(相关文档中术语 t 的频率)/(文档中的术语总数)

image-1674008312104

  • 第 3 步:计算 IDF(逆向文档频率)

1 + loge((文档数 + 1) / (包含术语 t 的文档数 + 1))

样本检查文件总数:4

image-1674008341567

如果一个词t在整个语料库中出现频率很高,说明这个相关词影响了整个语料库。在这种情况下,对术语和整个语料库中的通过频率进行归一化。

  • 第 4 步:计算 TF * IDF

image-1674008352808

  • 第 5 步:L2 归一化

求行的平方和的平方根,并将相应的单元格除以找到的值。

image-1674008367758

L2 规范化再次纠正某些行中存在缺失值而无法显示其效果的单词。

2.计算相似度

假设我们有 m 部电影,在这些电影的描述中有 n 个独特的词。在我们以编程方式找到这些电影基于内容的相似性之前,让我们看看我们如何实际地做到这一点:

image-1674008380579

我们可以使用欧几里得距离或余弦相似度来找到向量化电影的相似度。

- 欧氏距离

通过计算欧几里德距离,可以得到两部电影之间的距离值,它表示电影之间的相似性。可以看出,随着距离的减小,相似度增加。这样,就可以进行推荐过程了。

image-1674008393896

image-1674008403420

- 余弦相似度:

image-1674008411805

欧几里得中有距离的概念,而余弦相似性中有相似性的概念。距离接近性和相似性不同性对应于这里的相同概念。

image-1674008419448

现在我们已经介绍了基于内容的过滤的逻辑,我们可以深入了解一下基于内容的过滤推荐。

问题:

一个新成立的在线电影平台想要向其用户推荐电影。由于用户的登录率很低,用户的习惯是未知的。但是,可以从浏览器中的痕迹访问有关用户观看了哪些电影的信息。根据这些信息,希望向用户推荐电影。

关于数据集:

主要电影元数据文件。包含有关 Full MovieLens 数据集中的 45,000 部电影的信息。功能包括海报、背景、预算、收入、发行日期、语言、制作国家和公司。

您可以在 此处访问数据集。 详细代码地址

创建 TF-ID 矩阵:

在项目开始时导入了必要的库,并读取了数据集。

这里要应用的第一个过程是使用 TF-IDF 方法。为此,调用了在项目开始时导入的 TfidfVectorizer 方法。输入stop_words='english'参数,删除语言中常用的不带测量值的词(and, the, at, on等)。这样做的原因是为了避免在要创建的 TF-IDF 矩阵中稀疏值会导致的问题。

image-1674008434743

tfidf_matrix 的形状为 (45466, 75827),其中 45466 表示概览数,75827 表示独特词数。为了能够在处理这种大小的数据时取得更好的进展,我会将 tfidf_matrix 交集处的值类型转换为 float32 并进行相应处理。

image-1674008444629

现在我们在 tfidf_matrix 的交集处有了分数,我们现在可以构建余弦相似度矩阵并观察电影之间的相似度。

创建余弦相似度矩阵:

使用项目开始时导入的cosine_similarity方法,求每部电影与其他电影的相似度值。

image-1674008453908

例如,我们可以找到第一个索引中的电影与所有其他电影的相似度得分如下:

image-1674008462657

根据相似性提出建议:

相似度是用余弦相似度计算的,但需要电影的名称来评估这些分数。为此,一个 pandas 系列包含哪部电影在哪个索引中被创建为 indices = pd.Series(df.index, index=df[‘title’]).

如下所示,在一些电影中观察到多路复用。

image-1674008471764

我们需要保留这些倍数中的一个并消除其余的,在最近的日期取这些倍数中最近的一个。这可以通过以下方式完成:

image-1674008479733

作为操作的结果,可以观察到每个标题都变成单数并且可以通过单个索引信息访问。

假设我们想要查找 10 部类似于夏洛克·福尔摩斯的电影。首先,通过在cosine_sim中输入福尔摩斯的索引信息来选择福尔摩斯电影,并访问表示这部电影与其他电影之间相似关系的分数。

image-1674008488090

名为 similarity_scores 的数据框被创建为更具可读性的格式。与 cosine_sim[movie_index] 的选定相似性保存为该数据框中的“分数”变量。

image-1674008497245

上面选择了与夏洛克电影最相似的 10 部电影的索引。这些索引对应的电影名称可以通过如下方式访问:

image-1674008505349

这10部电影在描述上与福尔摩斯最相似。这些电影可以推荐给看过福尔摩斯-夏洛克的用户。也可以尝试不同的电影,并观察推荐结果。

相关 [推荐系统 过滤] 推荐:

协同过滤推荐系统的那些不足点

- - 标点符
类目(种类)推荐杂很多情境下行不通,因为有太多的产品属性,而每个属性(比如价钱,颜色,风格,面料,等等)在不同的时候对于消费者的重要程度都是不一样的. 但是协同过滤推荐系统也不是那么完美无缺,他或多或少的会有那么一些问题~. 协同过滤的精度主要取决于用户数据的多少. 如果一个系统有很多用户的历史数据,他就能更好的对用户的喜欢做出预测.

推荐系统:基于内容的过滤

- - 掘金 架构
上一篇文章我们介绍了 推荐系统:ARL(关联规则学习),可以通过关联规则挖掘算法Apriori来实现关联规则推荐系统,今天我们来聊聊如何通过基于内容的过滤来实现推荐系统. 基于内容的过滤是用作推荐系统的另一种常用方法之一. 内容的相似性是根据产品元数据计算的,它提供了制定推荐的选择,推荐与用户过往购买过的产品相关性最相似的产品.

【推荐系统】协同过滤之基于用户的最近邻推荐

- - CSDN博客互联网推荐文章
协同过滤(collaborative filtering)的核心思想:利用其他用户的行为来预测当前用户. 协同过滤算法是推荐系统中最基本的,同时在业界广为使用. 根据使用的方法不同,可以分为基于用户(user-based)、基于物品(item-based)的最近邻推荐. 基于用户的最近邻推荐的主要思想与 kNN有点相似:对于一个给定的评分集,找出与当前用户u口味相近的k个用户;然后,对于用户u没有见过的物品p,利用k个近邻对p进行预测评分.

为豆瓣电影实现User-based协同过滤的推荐系统

- - 鸟窝
协同过滤(Collaborative Filtering),简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的信息,个人透过合作的机制给予信息相当程度的反馈(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,反馈不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要,比如浏览信息,收藏,分享,点击等.

为豆瓣电影实现Item-based协同过滤的推荐系统

- - 鸟窝
前面的两篇文章分别使用Spark mllib ALS实现了Model-based协同过滤推荐系统和使用Mahout实现了User-based的协同过滤推荐系统. 我们再来回顾一下item-base CF算法的特点:. 物品数明显小于用户数的场合,否则物品相似度矩阵计算代价很大. 适合长尾物品丰富,用户个性化需求强的领域.

基于Spark MLlib平台的协同过滤算法---电影推荐系统

- - zzm
又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用.     说到推荐系统,大家可能立马会想到协同过滤算法. 本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用. 基于模型的协同过滤应用---电影推荐.     一、协同过滤算法概述.

[原]Spark MLlib系列(二):基于协同过滤的电影推荐系统

- -
随着大数据时代的到来,数据当中挖取金子的工作越来越有吸引力. 利用Spark在内存迭代运算、机器学习领域强悍性能的优势,使用spark处理数据挖掘问题就显得很有实际价值. 这篇文章给大家分享一个spark MLlib 的推荐实战例子. 我将会分享怎样用spark MLlib做一个电影评分的推荐系统.

用Hadoop流实现mapreduce版推荐系统基于物品的协同过滤算法

- - CSDN博客推荐文章
       以个性化新闻推荐为例,整个过程分成两个mapreduce阶段,由于hadoop流不支持多个mapreduce过程的自动化,所以所有mapreduce过程命令必须人工一个一个的执行. 1、首先需要将原始数据处理成如下形式的两个文件. 文件一:Item_user_score.txt. 如下图中第一行,物品100655565被用户1634974浏览过,则将分数记为1.

Min-Hash和推荐系统

- - xlvector - Recommender System
前几年看Google News Recommendation的那篇Paper,对里面提到的MinHash的算法基本没有注意,因为之前的习惯都是只注意论文的模型那块,至于怎么优化模型一般都只是扫一眼. 不过最近看了大量的Google Paper,发现Google在实现一个算法方面确实有很多独到之处. 其实,Min-Hash是LSH(Locality Sensitive Hash)的一种,我之前对LSH的了解仅仅限于知道它能把两个相似的东西Hash成两个汉明距离接近的2进制数.

推荐系统实战

- - 博客园_首页
推荐算法:基于特征的推荐算法. 推荐算法准确度度量公式:. 其中,R(u)表示对用户推荐的N个物品,T(u)表示用户u在测试集上喜欢的物品集合. 集合相似度度量公式(N维向量的距离度量公式):. 其中,N(u)表示用户u有过正反馈的物品集合. 其中,S(u,k)表示和用户u兴趣最接近的K个用户集合;N(i)表示对物品i有过正反馈的用户集合;w(u,v)表示用户u和用户v的兴趣相似度;r(v,i)表示用户v对物品i的兴趣.