(12-4-02)动漫推荐系统:基于内容的推荐系统

本文介绍了基于内容的推荐系统,如何使用TF-IDF在动漫流派上进行操作,通过计算TF-IDF权重来推荐相似的动漫。文章详细描述了数据预处理、TF-IDF向量化和推荐算法的应用,以及与协同过滤的融合,以提供个性化推荐服务。
摘要由CSDN通过智能技术生成

12.5.2  基于内容的推荐系统

基于内容的推荐器是一种根据物品内容和用户个人资料之间的比较来推荐物品的方法,每个物品的内容表示为一组描述符或术语,通常是文档中出现的词语。基于内容的推荐器使用用户提供的数据,可以是显式的(评分)或隐式的(点击链接)。基于此数据,生成用户个人资料,然后用于向用户提供建议。随着用户提供更多输入或对推荐采取行动,推荐引擎变得越来越准确。

基于内容的推荐系统中,TF(词频)和IDF(逆文档频率)是用于衡量单词在文档中重要性的指标。TF是一个词在文档中出现的频率,而IDF是整个文档语料库中文档频率的倒数。TF-IDF主要有两个原因:假设我们在Google上搜索“the rise of analytics”。很明显,“the”将比“analytics”更频繁地出现,但从搜索查询的角度来看,“analytics”的相对重要性更高。在这种情况下,TF-IDF加权抵消了高频词在确定项(文档)重要性方面的影响。

在本项目中,将使用TF-IDF在动漫的流派上进行操作,以便根据流派向用户推荐内容。

(1)通过如下代码实现了基于内容的推荐系统的数据准备阶段,利用TF-IDF向量化动漫的流派信息,为后续计算相似性和推荐提供基础。

from sklearn.feature_extraction.text import TfidfVectorizer

tfv = TfidfVectorizer(min_df=3, max_features=None, strip_accents="unicode", analyzer="word",
                      token_pattern=r"\w{1,}", ngram_range=(1, 3), stop_words = "english")

rec_data = fulldata.copy()
rec_data.drop_duplicates(subset ="name", keep = "first", inplace = True)
rec_data.reset_index(drop = True, inplace = True)
genres = rec_data["genre"].str.split(", | , | ,").astype(str)
tfv_matrix = tfv.fit_transform(genres)

上述代码的实现流程如下:

  1. 首先,导入了TfidfVectorizer,这是用于将文本数据转换为TF-IDF特征矩阵的工具。接着,我们创建了一个TfidfVectorizer对象,设置了一些参数,例如最小文档频率(min_df)、最大特征数(max_features)、分词模式(token_pattern)、n-gram范围(ngram_range)等。这些参数用于控制生成的特征矩阵的属性。
  2. 然后,创建了一个数据副本rec_data,其中去除了重复的动漫条目,并对索引进行了重置。接下来,我们提取了动漫的流派信息,并将其转换为字符串形式,以便用于TF-IDF矩阵的构建。
  3. 最后,使用TfidfVectorizer的fit_transform方法,对提取的流派信息进行TF-IDF向量化,得到了TF-IDF矩阵(tfv_matrix)。这个矩阵将用于计算动漫之间的相似性,以便进行基于内容的推荐。

此外,scikit-learn提供了适用于向量集合的密集和稀疏表示的成对度量(在机器学习术语中称为核)。在本实例中需要为推荐的动漫分配1,对于不推荐的动漫分配0,本项目将使用 sigmoid 核。

(2)如下码段实现了基于内容的推荐系统,使用 TF-IDF 来表示动漫的类型(genres)。通过计算动漫之间的 sigmoid 核,确定它们之间的相似度。最后,通过推荐函数,为指定动漫(例如"Naruto")提供与之相似的前10个动漫的推荐列表。

# 计算 sigmoid kernel
sig = sigmoid_kernel(tfv_matrix, tfv_matrix)

# 建立索引,用于查找推荐
rec_indices = pd.Series(rec_data.index, index=rec_data["name"]).drop_duplicates()

# 推荐函数
def give_recommendation(title, sig=sig):
    idx = rec_indices[title]  # 获取与原始标题对应的索引
    sig_score = list(enumerate(sig[idx]))  # 获取成对相似性分数
    sig_score = sorted(sig_score, key=lambda x: x[1], reverse=True)
    sig_score = sig_score[1:11]
    anime_indices = [i[0] for i in sig_score]

    # 获取前10个最相似的动漫
    rec_dic = {"No": range(1, 11),
               "Anime Name": anime["name"].iloc[anime_indices].values,
               "Rating": anime["rating"].iloc[anime_indices].values}
    dataframe = pd.DataFrame(data=rec_dic)
    dataframe.set_index("No", inplace=True)

    print(f"Recommendations for {title} viewers :\n")

    return dataframe.style.set_properties(**{"background-color": "#2a9d8f", "color": "white", "border": "1.5px  solid black"})

# 获取 "Naruto" 的推荐
give_recommendation("Naruto")

上述代码执行后会生成一份推荐列表,列表包含了与查询动漫最相似的几部动漫,以及它们的评分。如图12-24所示。

图12-24  推荐列表

(3)为 "Death Note"提供相似的动漫推荐列表,推荐列表是基于输入的动漫("Death Note")的内容特征(在这里是动漫的类型/流派)和其他动漫之间的相似性计算而得出的。这并不是基于用户的评分数据,而是根据动漫的内容相似性。具体实现代码如下所示。

# 获取 "Death Note" 的推荐
give_recommendation("Death Note")

执行后的效果如图12-25所示。

图12-25   基于"Death Note"提供相似的动漫推荐列表

(4)为 "Mogura no Motoro" 提供相似的动漫推荐列表,推荐列表是基于输入的动漫("Mogura no Motoro")的内容特征(在这里是动漫的类型/流派)和其他动漫之间的相似性计算而得出的。它并不是基于用户的评分数据,而是根据动漫的内容相似性。

# 获取 "Mogura no Motoro" 的推荐

give_recommendation("Mogura no Motoro")

执行后的效果如图12-26所示。

图12-26   基于"Mogura no Motoro" 提供相似的动漫推荐列表

12.6  总结

该项目是一个基于用户个性化兴趣的动漫推荐系统,通过综合考虑协同过滤和基于内容的推荐算法,为用户提供了更为个性化的动漫推荐服务。以下是项目的主要亮点和总结:

  1. 多算法融合:项目采用协同过滤和基于内容的推荐算法,综合考虑用户的历史行为和动漫的内容特征,提高了推荐的准确性和用户满意度。
  2. 数据分析与可视化:通过对动漫数据库的分析,系统生成了丰富的图表和统计信息,包括动漫类型分布、用户评分分布等,帮助用户更好地了解动漫领域。
  3. 推荐结果解释:用户不仅能够接收系统的推荐结果,还能够查看推荐的解释,了解为何系统给出这样的推荐,增加用户对推荐算法的信任感。
  4. 流行趋势和社区互动:系统展示了动漫作品的流行趋势,使用户能够紧跟最新、最热门的动漫,同时用户还可以通过系统分享看法、提供反馈,参与动漫社区。

总体而言,该项目通过结合不同推荐算法、提供数据分析和可视化功能,以及构建用户友好的交互界面,为用户提供了一个全面的动漫推荐平台。未来,可以考虑引入更复杂的深度学习模型,增加用户社交功能,以不断优化和扩展系统的推荐能力。

本项目已完结:

(12-1)动漫推荐系统:背景介绍+系统分析-CSDN博客

(12-2)动漫推荐系统:准备数据集-CSDN博客

(12-3-01)动漫推荐系统:数据分析(1)-CSDN博客

(12-3-02)动漫推荐系统:数据分析(2)-CSDN博客

(12-3-03)动漫推荐系统:数据分析(3)-CSDN博客

(12-3-04)动漫推荐系统:数据分析(4)-CSDN博客

(12-3-05)动漫推荐系统:数据分析(5)-CSDN博客

(12-3-06)动漫推荐系统:数据分析(6)-CSDN博客

(12-4-01)动漫推荐系统:协同过滤推荐系统-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

感谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值