基于内容召回

  • 1. 概述
  • 2. 基于内容推荐详细介绍
  • 3. CB的优缺点

图1. 推荐系统整体架构

推荐系统学习笔记系列链接:

推荐系统学习笔记——特征工程
推荐系统学习笔记召回策略之基于内容召回
推荐系统学习笔记召回策略之基于协同过滤召回
推荐系统召回策略之多路召回与Embedding召回


1. 概述

基于内容的推荐又被称为Content Based,使用item之间的相似性来推荐与用户喜欢的item相似的item。例如:老张在腾讯视频看了一部爱情动作片,之后他就会发现腾讯视频给他推送其他的爱情动作片。

在一款推荐系统的早期,基于内容推荐的地位举重若轻,它可以很快的搭建,也可以很快的见效,其中标签挖掘是内容推荐中最重要的一个环节。在产品的冷启动阶段没有用户行为,另外新的物品也需要被推荐出去,首选内容推荐。然而想做好基于内容的推荐也并非想象中的那么简单,具体做法分为以下几步:

  1. Item Representation:为每个item抽取出一些特征(也就是item的content了)来表示此item;
  2. Profile Learning:利用一个用户过去喜欢(及不喜欢)的item的特征数据,来学习出此用户的喜好特征(profile);
  3. Recommendation Generation:通过比较上一步得到的用户profile与候选item的特征,为此用户推荐一组相关性最大的item。

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

图2. 一个典型的基于内容推荐的框架

介绍一下图2的流程和基本元素。在内容这一端,内容源经过内容分析,得到结构化的内容库和内容模型。在用户这一端,用户看过推荐列表后,会产生用户行为数据,结合内容库并经过用户分析可以得到用户画像。对于那些没有给用户推荐过的新内容,经过相同的内容分析过程就可以通过推荐算法加以匹配,再将计算得到的新的推荐列表推给用户。如此周而复始,永不停息。

其实,基于内容的推荐,最重要的不是推荐算法,而是内容挖掘和分析。只要内容挖掘的足够深入,哪怕早期推荐算法采用非常硬的规则,也能去的不俗的效果。

2. 基于内容推荐详细介绍

  • Item Representation

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

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

记我们要表示的所有文章集合为 D={d1,d2,...dN}D =\lbrace d_1,d_2,...d_N\rbraceD={d1,d2,...dN},而所有文章中出现的词(对于中文文章,首先得对所有文章进行分词)的集合(也称为词典)为T={t1,t2,...tn}T =\lbrace t_1,t_2,...t_n\rbraceT={t1,t2,...tn}。也就是说,我们有N篇要处理的文章,而这些文章里包含了n个不同的词。我们最终要使用一个向量来表示一篇文章,比如第j篇文章被表示为dj=(w1j,w2j,...wnj)d_j = (w_{1j},w_{2j},...w_{nj})dj=(w1j,w2j,...wnj),其中 w1jw_{1j}w1j 表示第1个词 t1t_1t1 在文章j中的权重,值越大表示越重要;djd_jdj 中其他向量的解释类似。所以,为了表示第 j 篇文章,现在关键的就是如何计算 djd_jdj 各分量的值了。例如,我们可以选取 w1jw_{1j}w1j 为1,如果词 t1t_1t1 出现在第 j 篇文章中;选取为0,如果 t1t_1t1 未出现在第j篇文章中。我们也可以选取 w1jw_{1j}w1j 为词 t1t_1t1 出现在第 j 篇文章中的次数(frequency)。但是用的最多的计算方法还是信息检索中常用的词频-逆文档频率(term frequency–inverse document frequency,简称tf-idf)。第j篇文章中与词典里第k个词对应的tf-idf为:

TF−IDF(tk,dj)=TF(tk,dj)⏟TF∗logNnk⏟IDFTF-IDF(t_k,d_j) =\underbrace{TF(t_k,d_j)}_{TF} *\underbrace{log{N\over n_k} }_{IDF}TFIDF(tk,dj)=TF

TF(tk,dj)IDF

lognkN

其中 TF(tk,dj)TF(t_k,d_j)TF(tk,dj) 是第k个词在文章j中出现的次数,而 nkn_knk 是所有文章中包括第k个词的文章数量。
最终第k个词在文章j中的权重由下面的公式获得:

wk,i=TF−IDF(tk,dj)∑s=1∣T∣TF−IDF(tk,dj)2w_{k,i} = \frac{TF-IDF(t_k,d_j)}{\sqrt{\sum_{s=1}^{\mid T\mid} TF-IDF(t_k,d_j)^2 } \quad} \quadwk,i=s=1TTFIDF(tk,dj)2

TFIDF(tk,dj)
做归一化的好处是不同文章之间的表示向量被归一到一个量级上,便于下面步骤的操作。

  • Profile Learning

假设用户u已经对一些item给出了他的喜好判断,喜欢其中的一部分item,不喜欢其中的另一部分。那么,这一步要做的就是通过用户u过去的这些喜好判断,为他产生一个模型。有了这个模型,我们就可以根据此模型来判断用户u是否会喜欢一个新的item。所以,我们要解决的是一个典型的有监督分类问题,理论上机器学习里的分类算法都可以照搬进这里。

下面我们简单介绍下CB里常用的一些学习算法:

  1. 最近邻方法(k-Nearest Neighbor,简称kNN)

对于一个新的item,最近邻方法首先找用户u已经评判过并与此新item最相似的k个item,然后依据用户u对这k个item的喜好程度来判断其对此新item的喜好程度。这种做法和CF中的item-based kNN很相似,差别在于这里的item相似度是根据item的属性向量计算得到,而CF中是根据所有用户对item的评分计算得到。

对于这个方法,比较关键的可能就是如何通过item的属性向量计算item之间的两两相似度。建议对于结构化数据,相似度计算使用欧几里得距离;而如果使用向量空间模型(VSM)来表示item的话,则相似度计算可以使用cosine。

  1. Rocchio算法

Rocchio算法是信息检索中处理相关反馈(Relevance Feedback)的一个著名算法。比如你在搜索引擎里搜“苹果”,当你最开始搜这个词时,搜索引擎不知道你到底是要能吃的水果,还是要不能吃的苹果,所以它往往会尽量呈现给你各种结果。当你看到这些结果后,你会点一些你觉得相关的结果(这就是所谓的相关反馈了)。然后如果你翻页查看第二页的结果时,搜索引擎可以通过你刚才给的相关反馈,修改你的查询向量取值,重新计算网页得分,把跟你刚才点击的结果相似的结果排前面。比如你最开始搜索“苹果”时,对应的查询向量是{“苹果” : 1}。而当你点击了一些与Mac、iPhone相关的结果后,搜索引擎会把你的查询向量修改为{“苹果” : 1, “Mac” : 0.8, “iPhone” : 0.7},通过这个新的查询向量,搜索引擎就能比较明确地知道你要找的是不能吃的苹果了。Rocchio算法的作用就是用来修改你的查询向量的:{“苹果” : 1} --> {“苹果” : 1, “Mac” : 0.8, “iPhone” : 0.7}。

在CB里,我们可以类似地使用Rocchio算法来获得用户u的 wu⃗\vec{w_u}wu

wu⃗=β∗1Ir∑wj⃗∈Irwj⃗−γ∗1ln⁡r∑wj⃗∈ln⁡rwk⃗\vec{w_u} = \beta * \frac{1}{I_r} \sum_{\vec{w_j} \in I_r} {\vec{w_j}} - \gamma* \frac{1}{\ln r} \sum_{\vec{w_j}\in \ln r} \vec{w_k} \quad wu

=βIr1wj

Ir
wj

γlnr1wj

lnr
wk

其中 wj⃗\vec{w_j}wj

表示item j的属性,IrI_rIrInrI_{nr}Inr 分别表示已知的用户u喜欢与不喜欢的item集合;而 β\betaβγ\gammaγ 为正负反馈的权重,它们的值由系统给定。

在获得 wu⃗\vec{w_u}wu

后,对于某个给定的item j,我们可以使用 wu⃗\vec{w_u}wu

wj⃗\vec{w_j}wj

的相似度来代表用户u对j的喜好度。

Rocchio算法的一个好处是 wu⃗\vec{w_u}wu

可以根据用户的反馈实时更新,其更新代价很小。

正如在本节开头所说,本节要解决的是一个典型的有监督分类问题。所以各种有效的分类机器学习算法都可以用到这里,下面列举几个常用的分类算法:

  1. 决策树算法(Decision Tree,简称DT)

当item的属性较少而且是结构化属性时,决策树一般会是个好的选择。这种情况下决策树可以产生简单直观、容易让人理解的结果。而且我们可以把决策树的决策过程展示给用户u,告诉他为什么这些item会被推荐。但是如果item的属性较多,且都来源于非结构化数据(如item是文章),那么决策树的效果可能并不会很好。

  1. 线性分类算法(Linear Classifer,简称LC)

对于我们这里的二类问题,线性分类器(LC)尝试在高维空间找一个平面,使得这个平面尽量分开两类点。也就是说,一类点尽可能在平面的某一边,而另一类点尽可能在平面的另一边。

仍以学习用户u的分类模型为例。wj⃗\vec{w_j}wj

表示item j的属性向量,那么LC尝试在wj⃗\vec{w_j}wj

空间中找平面 cu⃗\vec{c_u}cu

*wj⃗\vec{w_j}wj

,使得此平面尽量分开用户u喜欢与不喜欢的item。其中的 cu⃗\vec{c_u}cu

就是我们要学习的参数了。最常用的学习 cu⃗\vec{c_u}cu

的方法就是梯度下降法了,其更新过程如下:

cu⃗(t+1):=cu⃗(t)−η(cu⃗(t)∗wj⃗−yuj)∗wj⃗\vec{c_u}^{(t+1)} := \vec{c_u}^{(t)} - \eta(\vec{c_u}^{(t)} *\vec{w_j}-y_{uj})*\vec{w_j}cu

(t+1):=cu

(t)
η(cu

(t)
wj

yuj)wj


其中的上角标t表示第t次迭代,yujy_{uj}yuj表示用户u对item j的打分(例如喜欢则值为1,不喜欢则值为-1)。η\etaη为学习率,它控制每步迭代变化多大,由系统给定。

和Rocchio算法一样,上面更新公式的好处就是它可以以很小的代价进行实时更新,实时调整用户u对应的 cu⃗\vec{c_u}cu

说到这里,很多童鞋可能会想起一些著名的线性分类器:Logistic Regression和Linear SVM等等,它们当然能胜任我们这里的分类任务。提到Linear SVM用在文本分类上能获得相当不错的效果:)。

如果item属性 wj⃗\vec{w_j}wj

的每个分量都是0/1取值的话(如item为文章, wj⃗\vec{w_j}wj

的第k个分量为1表示词典中第k个词在item j中,为0表示第k个词不在item j中),那么还有一种很有意思的启发式更新 cu⃗\vec{c_u}cu

的算法:Winnow算法。[4]中就是使用Winnow算法来获得user profile的。

  1. 朴素贝叶斯算法(Naive Bayes,简称NB)

NB算法就像它的简称一样,牛逼!NB经常被用来做文本分类,它假设在给定一篇文章的类别后,其中各个词出现的概率相互独立。它的假设虽然很不靠谱,但是它的结果往往惊人地好。再加上NB的代码实现比较简单,所以它往往是很多分类问题里最先被尝试的算法。我们现在的profile learning问题中包括两个类别:用户u喜欢的item,以及他不喜欢的item。在给定一个item的类别后,其各个属性的取值概率互相独立。我们可以利用用户u的历史喜好数据训练NB,之后再用训练好的NB对给定的item做分类。NB的介绍很多,这里就不再啰嗦了,有不清楚的童鞋可以参考NB Wiki,或者[1-3]。

  • Recommendation Generation

如果上一步Profile Learning中使用的是分类模型(如DT、LC和NB),那么我们只要把模型预测的用户最可能感兴趣的n个item作为推荐返回给用户即可。而如果Profile Learning中使用的直接学习用户属性的方法(如Rocchio算法),那么我们只要把与用户属性最相关的n个item作为推荐返回给用户即可。其中的用户属性与item属性的相关性可以使用如cosine等相似度度量获得。

3. CB的优缺点

  • 优点
  1. 用户之间的独立性(User Independence):既然每个用户的profile都是依据他本身对item的喜好获得的,自然就与他人的行为无关。而CF刚好相反,CF需要利用很多其他人的数据。CB的这种用户独立性带来的一个显著好处是别人不管对item如何作弊(比如利用多个账号把某个产品的排名刷上去)都不会影响到自己。

  2. 好的可解释性(Transparency):如果需要向用户解释为什么推荐了这些产品给他,你只要告诉他这些产品有某某属性,这些属性跟你的品味很匹配等等。

  3. 新的item可以立刻得到推荐(New Item Problem):只要一个新item加进item库,它就马上可以被推荐,被推荐的机会和老的item是一致的。而CF对于新item就很无奈,只有当此新item被某些用户喜欢过(或打过分),它才可能被推荐给其他用户。所以,如果一个纯CF的推荐系统,新加进来的item就永远不会被推荐

  • 缺点
  1. item的特征抽取一般很难(Limited Content Analysis):如果系统中的item是文档(如个性化阅读中),那么我们现在可以比较容易地使用信息检索里的方法来“比较精确地”抽取出item的特征。但很多情况下我们很难从item中抽取出准确刻画item的特征,比如电影推荐中item是电影,社会化网络推荐中item是人,这些item属性都不好抽。其实,几乎在所有实际情况中我们抽取的item特征都仅能代表item的一些方面,不可能代表item的所有方面。这样带来的一个问题就是可能从两个item抽取出来的特征完全相同,这种情况下CB就完全无法区分这两个item了。比如如果只能从电影里抽取出演员、导演,那么两部有相同演员和导演的电影对于CB来说就完全不可区分了。

  2. 无法挖掘出用户的潜在兴趣(Over-specialization):既然CB的推荐只依赖于用户过去对某些item的喜好,它产生的推荐也都会和用户过去喜欢的item相似。如果一个人以前只看与推荐有关的文章,那CB只会给他推荐更多与推荐相关的文章,它不会知道用户可能还喜欢数码。

  3. 无法为新用户产生推荐(New User Problem):新用户没有喜好历史,自然无法获得他的profile,所以也就无法为他产生推荐了。当然,这个问题CF也有。

推荐系统学习笔记召回策略之基于内容召回相关推荐

  1. Python推荐系统学习笔记(3)基于协同过滤的个性化推荐算法实战---ItemCF算法(下)

    本文在 Python推荐系统学习笔记(2)基于协同过滤的个性化推荐算法实战---ItemCF算法 一文的基础上,对其基本的ItemCF算法做出改进. 一.相关概念 1.ItemCF中,基于行为(喜好) ...

  2. Python推荐系统学习笔记(5)基于协同过滤的个性化推荐算法实战---UserCF算法(下)

    本文在 Python推荐系统学习笔记(4)基于协同过滤的个性化推荐算法实战---UserCF算法(上) 一文的基础上,对其基本的UserCF算法做出改进. 一.相关概念 1.UserCF中,基于行为( ...

  3. Python推荐系统学习笔记(1)基于协同过滤的个性化推荐算法实战---隐语义模型

    一.相关概念: 1.隐语义模型(LFM) 通过矩阵分解建立用户和隐类之间的关系,物品和隐类之间的关系,最终得到用户对物品的偏好关系. 假设我们想要发现 F 个隐类, 我们的任务就是找到两个矩阵 U 和 ...

  4. 推荐系统学习笔记召回策略之基于协同过滤召回

    基于协同过滤的召回 1. 概述 2. 基于近邻的协同过滤算法 3. 相似度计算方法 4. 协同过滤算法的进化-矩阵分解 图1. 推荐系统整体架构 推荐系统学习笔记系列链接: 推荐系统学习笔记--特征工 ...

  5. 推荐系统学习笔记——特征工程

    特征工程 一. 概述 二. 特征工程构建原则 三. 常用的特征有哪些 四. 常用的特征的处理方法 五. 特征选择 六. 总结 推荐系统学习笔记系列链接: 推荐系统学习笔记--特征工程 推荐系统学习笔记 ...

  6. 强化学习笔记:策略评估--贝尔曼方程求解示例

    目录 1. 前言 2. MDP模型 3. 求解贝尔曼方程 1. 前言 策略评估(Policy Evaluation),简单来说,就是针对某个既定的策略求其状态值函数和动作值函数.求得了状态值函数和动作 ...

  7. 【转】医疗业务学习笔记--DICOM协议的基础内容!!!!!!!!!!

    转自:医疗业务学习笔记--DICOM协议的基础内容 - 知乎 本文首发于"雨夜随笔"公众号,欢迎关注. DICOM协议是医疗领域对如何处理.存储.打印和传输医疗图片的一系列标准.D ...

  8. C++设计模式学习笔记:策略模式

    C++设计模式学习笔记:策略模式 策略模式设计商场促销 1.策略模式介绍 2.商场收银系统策略模式实现 3.策略模式与工厂模式结合 3.策略模式与工厂模式对比 策略模式设计商场促销 1.策略模式介绍 ...

  9. ITK学习笔记(四)基于C++和ITK获取3D医学图像的最大连通区域

    ITK学习笔记(四)基于C++和ITK获取3D医学图像的最大连通区域 1.代码 2.效果 3.主要函数介绍 1.代码 #include "itkConnectedComponentImage ...

  10. AI比赛-推荐系统(一)-新闻推荐03:多路召回【用不同策略分别召回部分候选集,然后把候选集混在一起供后续排序模型使用】【①、YoutubeDNN双塔召回;②、基于物品召回;③、基于用户召回】【天池】

    所谓的"多路召回"策略,就是指采用不同的策略.特征或简单模型,分别召回一部分候选集,然后把候选集混合在一起供后续排序模型使用,可以明显的看出,"多路召回策略"是 ...

最新文章

  1. 微软推出Windows XP/Server 2003紧急安全补丁:修复远程桌面CVE-2019-0708漏洞
  2. 大厂架构都开始做机房多活了
  3. ionic之点击放大图片
  4. 数据库复习之规范化理论应用(第八次上机内容)
  5. YBTOJ洛谷P2223:软件开发(费用流)
  6. 网上订餐python_来自美国网上订餐网站的创新
  7. js 对url进行编码和解码的三种方式
  8. swift 全局常量 全局变量的写法
  9. Android Studio 3.3发布:官方支持导航编辑器
  10. Java实现生成二维码(含logo)
  11. 37.大数据之旅——网站流量统计项目
  12. 咸蛋超人的CxImage学习之路(一)
  13. asyncio 系列五、同步原语—Synchronization Primitives
  14. Unity利用双相机巧做水印功能
  15. v-for与v-if可以一起使用吗?如果同时使用v-for和v-if会存在什么样的问题?
  16. 什么是MES系统软件,如何用大白话理解MES,公司有了ERP还有必要上MES吗?
  17. 【51单片机】延时函数计算问题以及如何准确延时
  18. 旋转不变性、尺度不变性
  19. 乔布斯鲁宾_鲁宾·哈里斯(Ruben Harris)如何利用故事的力量闯入初创企业
  20. python function at 0x00000_python 问题求解,为什么会返回function variance at 0x7f3c022c8d70...

热门文章

  1. 力扣刷题 DAY_89 贪心
  2. 自带RGB灯效,配备显卡专属风道,风行者DF700 Flux上手
  3. Google天马(PEGASUS)模型
  4. elasticsearch搜索推荐系列(二)之 java实现中文转化为拼音与简称
  5. snaker工作流核心表学习
  6. MTK平台设备和驱动的配置及使用--pmic驱动 pinctrl驱动
  7. 2020手机cpu天梯图
  8. 【一文带你读懂机器学习】线性回归原理
  9. 计算机学院表白情书,大学各专业的表白情书!啊,我的少女心要炸了…
  10. java日期 国际化_java中国际化的时间处理