基于内容的推荐(Content-based Recommendations)

本文介绍了基于内容的推荐(CB)方法,它根据用户过去喜欢的物品来推荐相似的物品。CB包括三个步骤:物品表示、用户画像学习和推荐生成。物品表示通过提取物品特征来构建向量表示,用户画像学习使用用户喜好物品的特征来生成用户偏好模型,推荐生成则通过计算物品与用户模型的相关性来推荐最相关的物品。CB具有用户独立性、良好的可解释性和新物品快速推荐的优势,但也存在特征抽取困难、过度专业化和新用户推荐问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[本文链接:http://www.cnblogs.com/breezedeus/archive/2012/04/10/2440488.html,转载请注明出处]

      Collaborative Filtering Recommendations (协同过滤,简称CF) 是目前最流行的推荐方法,在研究界和工业界得到大量使用。但是,工业界真正使用的系统一般都不会只有CF推荐算法,Content-based Recommendations (CB) 基本也会是其中的一部分。

      CB应该算是最早被使用的推荐方法吧,它根据用户过去喜欢的产品(本文统称为 item),为用户推荐和他过去喜欢的产品相似的产品。例如,一个推荐饭店的系统可以依据某个用户之前喜欢很多的烤肉店而为他推荐烤肉店。 CB最早主要是应用在信息检索系统当中,所以很多信息检索及信息过滤里的方法都能用于CB中。

      CB的过程一般包括以下三步:

1. Item Representation:为每个item抽取出一些特征(也就是item的content了)来表示此item;

2. Profile Learning:利用一个用户过去喜欢(及不喜欢)的item的特征数据,来学习出此用户的喜好特征(profile);

3. Recommendation Generation:通过比较上一步得到的用户profile与候选item的特征,为此用户推荐一组相关性最大的item。

[3]中对于上面的三个步骤给出一张很细致的流程图(第一步对应着Content Analyzer,第二步对应着Profile Learner,第三步对应着Filtering Component):

Image

       举个例子说明前面的三个步骤。对于个性化阅读来说,一个item就是一篇文章。根据上面的第一步,我们首先要从文章内容中抽取出代表它们的属性。常用的方法就是利用出现在一篇文章中词来代表这篇文章,而每个词对应的权重往往使用信息检索中的tf-idf来计算。比如对于本文来说,词“CB”、“推荐”和“喜好”的权重会比较大,而“烤肉”这个词的权重会比较低。利用这种方法,一篇抽象的文章就可以使用具体的一个向量来表示了。第二步就是根据用户过去喜欢什么文章来产生刻画此用户喜好的 profile了,最简单的方法可以把用户所有喜欢的文章对应的向量的平均值作为此用户的profile。比如某个用户经常关注与推荐系统有关的文章,那么他的profile中“CB”、“CF”和“推荐”对应的权重值就会较高。在获得了一个用户的profile后,CB就可以利用所有item与此用户profile的相关度对他进行推荐文章了。一个常用的相关度计算方法是cosine。最终把候选item里与此用户最相关(cosine值最大)的N个item作为推荐返回给此用户。

 

       接下来我们详细介绍下上面的三个步骤。

一. Item Representation

      真实应用中的item往往都会有一些可以描述它的属性。这些属性通常可以分为两种:结构化的(structured)属性与非结构化的(unstructured)属性。所谓结构化的属性就是这个属性的意义比较明确,其取值限定在某个范围;而非结构化的属性往往其意义不太明确,取值也没什么限制,不好直接使用。比如在交友网站上,item就是人,一个item会有结构化属性如身高、学历、籍贯等,也会有非结构化属性(如item自己写的交友宣言,博客内容等等)。对于结构化数据,我们自然可以拿来就用;但对于非结构化数据(如文章),我们往往要先把它转化为结构化数据后才能在模型里加以使用。真实场景中碰到最多的非结构化数据可能就是文章了(如个性化阅读中)。下面我们就详细介绍下如何把非结构化的一篇文章结构化。

       如何代表一篇文章在信息检索中已经被研究了很多年了,下面介绍的表示技术其来源也是信息检索,其名称为向量空间模型(Vector Space Model,简称VSM)。

      记我们要表示的所有文章集合为 Image(1),而所有文章中出现的词(对于中文文章,首先得对所有文章进行分词)的集合(也称为词典)为Image(2)。也就是说,我们有N篇要处理的文章,而这些文章里包含了n个不同的词。我们最终要使用一个向量来表示一篇文章,比如第j篇文章被表示为Image(3),其中Image(4)表示第1个词Image(5)在文章j中的权重,值越大表

### 基于内容推荐算法的实现难度 基于内容推荐系统主要关注用户过去的行为记录以及项目本身的特征,以此为基础为用户提供个性化推荐。这类系统的构建涉及多个方面的工作,包括但不限于数据预处理、特征提取、相似度计算等环节。 对于实现难度而言,该类算法相对较为直观易懂,适合初学者入门学习。然而,在实际应用场景下,为了达到理想的性能指标,则可能面临一些挑战: - 数据稀疏性问题:当物品数量庞大而用户的交互行为较少时,很难获取足够的信息用于描述每一个项目的特性; - 特征工程复杂度高:需要设计有效的机制来表示文档或其他类型的对象,这往往涉及到自然语言处理等领域专业知识的应用; - 随着时间推移更新模型的成本较大:因为要不断重新评估新加入的内容已有资源之间的关系[^1]。 ### 示例代码 下面给出一段简单的 Python 代码片段作为示例,展示如何利用余弦相似度来进行基于内容的文章推荐。此例子假设已经获得了每篇文章的主题词分布情况(可以由TF-IDF等方式获得),并将这些向量存储在一个矩阵中。 ```python from sklearn.metrics.pairwise import cosine_similarity import numpy as np def content_based_recommendation(item_profile_matrix, target_item_index): """ :param item_profile_matrix: 文章主题词分布构成的二维数组 (n_items * n_features) 行代表不同文章;列对应各个维度上的权重值。 :param target_item_index: 被选作参照物的目标文章索引位置 返回按相似程度降序排列后的其他所有文章列表及其对应的分数。 """ # 计算目标项其他各项间的相似度得分 similarities = cosine_similarity([item_profile_matrix[target_item_index]], item_profile_matrix)[0] # 排除掉自身比较的结果 mask = np.ones(similarities.shape, dtype=bool) mask[target_item_index] = False filtered_similarities = similarities[mask] # 获取排序后的索引顺序 ranked_indices = (-filtered_similarities).argsort() recommended_list = [(idx, filtered_similarities[idx]) for idx in ranked_indices] return recommended_list if __name__ == "__main__": # 构造模拟的数据集 article_profiles = np.array([ [0.8, 0.2], # 文章A 的主题词分布 [0.75, 0.25], # 文章B ... [0.6, 0.4], [0.9, 0.1] ]) recommendations = content_based_recommendation(article_profiles, 0) print("针对第0篇文档做出如下推荐:") for i, score in recommendations[:3]: print(f"- 第{i}篇; 相似度={score:.4f}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值