基于广义内容的推荐算法系统

写在前面 - 什么是基于内容推荐算法

广义内容,是指包括文本、图片、音频、视频等在内的多媒体信息。
基于内容的推荐算法(Content-Based Recommendations)是基于标的物相关信息、用户相关信息及用户对标的物的操作行为来构建推荐算法模型,为用户提供推荐服务。这里的标的物相关信息可以是对标的物文字描述的metadata信息、标签、用户评论、人工标注的信息等。用户相关信息是指人口统计学信息(如年龄、性别、偏好、地域、收入等等)。用户对标的物的操作行为可以是评论、收藏、点赞、观看、浏览、点击、加购物车、购买等。基于内容的推荐算法一般只依赖于用户自身的行为为用户提供推荐,不涉及到其他用户的行为。

广义的标的物相关信息不限于文本信息,图片、语音、视频等都可以作为内容推荐的信息来源,只不过这类信息处理成本较大,不光是算法难度大、处理的时间及存储成本也相对更高。

基于内容的推荐算法算是最早应用于工程实践的推荐算法,有大量的应用案例,如今日头条的推荐有很大比例是基于内容的推荐算法。

基于内容的推荐算法实现原理

基于内容的推荐算法的基本原理是根据用户的历史行为,获得用户的兴趣偏好,为用户推荐跟他的兴趣偏好相似的标的物,下图展示了基于内容的推荐算法逻辑过程。
算法逻辑

从上图也可以看出,要做基于内容的个性化推荐,一般需要三个步骤,它们分别是:基于用户信息及用户操作行为构建用户特征表示、基于标的物信息构建标的物特征表示、基于用户及标的物特征表示为用户推荐标的物。
核心步骤

本节我们先介绍如何基于核心步骤的1和2喂用户做推荐(即达到步骤3),然后分别对这三个步骤加以说明,介绍每个步骤都有哪些方法和策略可供选择。

基于用户和标的物特征为用户推荐的核心思想

有了用户特征和标的物特征,推荐思路总结有三个:

1.基于用户历史行为记录了做推荐
我们需要事先计算标的物之间的相似性,然后将用户历史记录中的标的物的相似标的物推荐给用户。
不管标的物包含哪类信息,一般的思路是将标的物特征转化为向量化表示,有了向量化表示,就可以通过cosin余弦计算两个标的物向量之间的相似度,余弦是相邻边比值,当比值近似1的情况,相似度最好。

2.用户和标的物特征都用显式的标签表示,利用该表示做推荐
标的物用标签来表示,反过来,每个标签就可以关联一组标的物,那么根据用户的标签表示,用户的兴趣标签就可以关联到一组标的物,这组通过标签关联到的标的物,就可以作为给用户推荐的候选集合。这类方法就是所谓的倒排索引,是搜索业务通用的解决方案。

3.用户和标的物嵌入到同一个向量空间,基于向量相似(即计算向量余弦值)做推荐
当用户和标的物嵌入到同一个向量空间后,就可以通过计算用户和标的物之间的相似度,然后按照标的物跟用户的相似度,为用户推荐相似度高的标的物。还可以基于用户向量表示计算用户相似度,将相似用户喜欢的标的物推荐给该用户,这时标的物的嵌入是不必要的。

上面就是基于内容推荐的核心思想,那么如何构建用户表示特征向量和标的物表示特征向量就是推荐系统的关键。

构建用户特征向量

用户的特征总结来讲有如下方法构建

  • 基于用户对标的物的操作行为,如点击/购买/收藏/播放/评论等构建用户对标的物的偏好画像;
  • 基于用户自身的人口统计学特征表示。

具体来说:
1.用户行为记录作为显示特征
比如用户浏览过A、B、C三个视频,同时根据每个视频用户观看时长占分别视频总时长的比例给用户行为打分,这是用户的兴趣偏好就可以记录为{$(A, S1), (B, S2), (C, S3)$},其中S1, S2, S3分别是用户对视频A、B、C的评分。

该方案直接将用户历史操作过的标的物作为用户特征表示,在推荐时可以将与用户操作过的标的物相似的标的物推荐给用高糊。

2.显示的标签特征
如果标的物是有标签来描述,那么这些标签可以用来表征标的物。用户的兴趣画像也可以基于用户对标的物的行为来打上对应的标签。拿视频推荐来举例,如果用户过去看了科幻和恐怖类电影,那么恐怖和科幻就是用户的偏好标签了。
每个标的物的标签可以是包含权重的,而用户对标的物的操作行为也是有权重的,而用户对标的物的操作行为也是有权重的,从而用户的兴趣标签是有权重的。
在具体推荐时,可以将用户的兴趣标签关联到的标的物(具备该标签的标的物)推荐给用户。

3.向量方法的兴趣特征
可以基于标的物的信息将标的物嵌入到向量空间中,利用向量来表示标的物,稍后讲解嵌入的算法实现方案。有了标的物的向量化表示,用户的兴趣向量就可以用他操作过的标的物的向量的平均向量来表示了。
这里表示用户兴趣向量有多种策略,可以基于用户对操作过的标的物的评分以及时间加权来获取用户的加权偏好向量,而不是直接取平均。另外,我们也可以根据用户操作过的标的物之间的相似度,喂用户构建多个兴趣向量(比如对标的物聚类,用户在某一类上操作过的标的物的向量均值作为用户在这个类别上的兴趣向量),从而更好的表达用户多方位的兴趣偏好。
有了用户的兴趣向量及标的物的兴趣向量,可以基于向量相似性计算用户对标的物的偏好度,再基于偏好度大小来为用户推荐标的物。

4.通过交互方式获取用户兴趣标签
在用户首次注册让用户选择自己的兴趣偏好标签,一旦用户勾选了自己的兴趣标签,那么这些兴趣标签就是系统为用户推荐标的物的逻辑基础,具体推荐策略逻辑就可以按照上述方法进行。

5.用户的人口统计学特征
用户在登陆、注册时提供的关于自身相关的信息、通过运营活动用户填写的信息、通过用户行为利用算法逻辑得出的结论,如年龄、性别、地域、收入、爱好、居住地、工作地点等是非常主要的信息。基于这些关于用户维度的信息,我们可以将用户特征用向量化表示出来,向量的维度就是可获取的用户特征数。
有了用户特征向量就可以计算用户相似度,将相思用户喜欢的标的物推荐给用户。

构建标的物特征表示

标的物的特征,一般可以利用显示的标签来表示,也可以利用隐式的向量(当然one-hot编码也是向量表示,但是不是隐式的)来刻画,向量的每个维度就是一个隐式的特征项。前面提到某些推荐算法需要计算标的物之间的相似度,下面我们在讲标的物的各种特征表示时,也简单介绍一下标的物之间的相似度计算方法。顺便说一下,标的物关联标的物的推荐方式也需要知道标的物之间的相似度。下面从四个方面来详细讲解怎么构建标的物的特征表示。

1.标的物包含标签信息
最简单的方式是将标签按照某种顺序排列,每个标签看成一个纬度,那么每个标的物就可以表示成一个N维向量,如 {item, [tag1, tag2, tag3, …, tagN]},如果标的物包含某个标签,向量在相应标签上的分量值为1,否则为0,即所谓的one-hot编码。通常N可能非常大,比如视频领域,N可能是几万或者几十万上百万,这时向量是稀疏矩阵,因为一般标的物只有几个或者几十个标签,采用稀疏向量的表示来优化向量存储和计算,提升效率。有个标的物基于标签的向量化表示,很容易基于cosin余弦计算相似度了。

实际上标签不是这么简单的,有很多业务标签是分级的,比如电商(像淘宝),有多级标签,标签的层级关系形成一颗树状结构,这时向量化有个简单的表示方案,即只考虑最低层级标签(叶节点),基于叶节点标签构建向量表示。更复杂的方法,可以基于层级结构构建标签表示及计算标的物相似度。
标签树

标签是可以通过算法获取的,比如通过NLP从文本信息中提取关键词作为标签。对于图片/视频,通过他们的描述信息提取标签,另外可以通过目标检测的方法从图片/视频中提取相关对象构建标签。

标签可以是用户打的,很多产品在用户与标的物交互时互相可以为标的物打标签,这些标签就是标的物的一种刻画。标签也可以是人工标注,Netflix在做推荐时,就请了上万专家对视频从上千个纬度来打标签,质量很高。很多行业的标的物来源于第三方供应商,他们在入驻平台时会被要求按照某些规范填写相关标签信息。

2.标的物具备结构化的信息
有些行业标的物是具备结构化信息的,如视频行业,一般会有媒体资料库,库中对每个节目都会有标题、演职员、导演、标签、评分、地域等维度数据,这类数据一般存在传统数据库中。这类数据,可以将一个字段(也是一个特征)作为向量的一个纬度,这时向量化表示每个维度的值不一定是数值,但是形式还是向量化的形式,即所谓的向量空间模型(Vector Space Model,简称VSM)。这时可以通过如下的方式计算两个标的物之间的相似度。
假设两个标的物的向量表示分别为
$V1=(p_1, p_2, p_3, ……, p_k)$
$V2=(q_1, q_2, q_3, ……, q_k)$

这时两个标的物的相似性计算公式为 $$sim(V_1, V_2)=\sum_{t=1}^k ksim(p_t, q_t)$$

其中代表的是向量的两个分量之间的相似度。可以采用Jacard相似度等各种方法计算两个分量之间的相似度。上面公式中还可以针对不同的分量采用不同的权重策略,见下面公式,其中第t个分量(特征)的权重,具体权重的数值可以根据对业务的理解来人工设置,或者利用机器学习算法来训练学习得到。
$$sim(V_1, V_2)=\sum_{t=1}^k w_t*sim(p_t, q_t)$$

3.包含文本信息的标的物的特征表示
像头条等新闻资讯或搜索类app,标的物就是一篇篇文章(其中会包含图片或视频),文本信息是最重要的信息形式,构建标的物之间的相似性有很多种方法。下面对常用的方法做一些讲解说明。

a. 利用TF-IDF将文本信息转化为特征向量
TF-IDF通过将所有文档(即标的物)粉刺,获得所有不同词的集合(假设有M个词),那么就可以为每个文档构建一个M维(每个词就是一个维度向量)的向量,而该向量中某个词所在维度的值可以通过统计每个词在文档中的重要性来衡量,这个重要性的度量就是TF-IDF。
TF是某个词在某篇文章中出现的频次,用于衡量这个词在文档中的重要性,出现次数越多的词重要性越高,副词(的,地)和语气助词等会去掉度量,这些词对构建向量是没有任何实际价值的。TF具体计算公式如下
$$
TF(t_k, d_j)=\frac{||t_k\in d_j||}{||d_j||}
$$
其中分子tk是第k个词在文档中出现的次数,分母是dj中词的总个数。

IDF代表的是某个词在所有文档中的“区分度”,如果某个词只在少量几个文档中出现,那么它包含的价值就是巨大的,如果某个词在很多文档中出现,那么它就不能很好的度量这个文档。下面是IDF的计算公式,其中N是所有文档的个数,是包含次的文档个数,这个公式与前面描述一致,稀有词的区分度大。
$$
IDF(t_k)=\log \frac{N}{n_k}
$$
有了上面对TF和IDF的定义,实际的TF-IDF就是上面两个量的乘积:
$$
TF-IDF(t_k, d_j) = TF(t_k, d_j) * IDF(t_k)
$$
有了基于TF-IDF计算的标的物(即文档表示为TF-IDF向量)的向量表示,就很容易计算两个标的物(文档)的相似度了(cosin余弦相似度)

b. 利用LDA算法构建文档(标的物)的主题
LDA算法是一类文档主题生成模型,包含词、主题、文档三层结构,是一个三层的贝叶斯概率模型。对于语料库中的每篇文档,LDA定义了如下生成过程:

  1. 对于每篇文档,从主题分布中抽取一个主题;
  2. 从上述被抽取到的主题所对应的单词分布中抽取一个单词;
  3. 重复上述过程直至遍历文档中的每一个单词。

我们通过对所有文档进行LDA训练,就可以构建每篇文档的主题分布,从而构建一个 基于主题的向量(每个主题就是向量的一个分量,而值就是该主题的概率值) ,这样我们就可以利用该向量来计算两篇文档的相似度了。主题模型可以理解为一个降维过程,将文档的词向量表示将维成主题的向量表示(主题的个数是远远小于词的个数的,所以是降维)。

c. 利用doc2vec算法构建文本相似度
doc2vec或者叫做paragraph2vec, sentence embeddings,是一种非监督式算法,可以获得句子、段落、文章的稠密向量表达,它是word2vec的拓展,2014年被Google的两位大牛提出,并广泛应用于文本分类和情感分析中。通过doc2vec学习出句子、段落、文章的向量表示,可以通过计算向量之间距离来表达句子、段落、文章之间的相似性。

这里我们简单描述一下doc2vec的核心思想。doc2vec受word2vec启发,由它推广而来,word2vec的设计思路是通过学习一个唯一的向量表示每个词,每个词向量作为矩阵W中的一列(W是所有词向量构成的矩阵),矩阵列可以通过词汇表为每个词做索引,排在索引第一位的放到矩阵W的第一列,如此类推。将学习问题转化为通过上下文词序列中前几个词来预测下一个词。具体的模型框架如下图:
word2vec算法框架

简单来说,给定一个待训练的词序列,词向量模型通过极大化平均对数概率
$$
\frac{1}{T}\sum_{t=k}^{T-k} \log p(w_t|w_{t-k}, …, w_{t+k})
$$

将预测任务通过softmax变换看成一个多分类问题

$$
p(w_t|w_{t-k}, …, w_{t+k}) = \frac{e^{y_{w_t}}}{\sum _ie^{y_i}}
$$

上面公式中词i的归一化对数概率,可以用下面公式计算,其中U、b是参数,h是通过词向量的拼接或者平均来构建的。

$$
y = b + Uh(w_{t-k}, …, w_{t+k};W)
$$

word2vec算法随机初始化词向量,通过随机梯度下降法来训练神经网络模型,最终得到每个词的向量表示。

doc2vec类似,每个段落/文档表示为向量,作为矩阵D的一列,每个词也表示为一个向量,作为矩阵W的一列。将学习问题转化为通过上下文词序列中前几个词和段落/文档来预测下一个词。将段落/文档和词向量通过拼接或者平均来预测句子的下一个词(下图是通过“the”、“cat”、“sat”及段落id来预测下一个词“on“)。在训练的时候我们固定上下文的长度,用滑动窗口的方法产生训练集。段落向量/句向量在上下文中共享。
doc2vec模型结构

工程上有很多开源框架有word2vec和doc2vec的实现,比如gensim中就有很好的实现。参考链接

4.图片、音频、或者视频信息
如果标的物包含的是图片、音频或者视频信息,处理会更加复杂。一种方法是利用它们的文本信息(标题、评论、描述信息、利用图像技术提取的字幕文本信息、利用语音识别获取的文本信息等)采用(3)的技术方案获得向量化表示。对于图像或者视频,也可以利用opencv中的PSNR和SSIM算法来表示视频特征,也可以计算视频之间的相似度。总之,图片、图像、音频都可以转化为NLP问题或者图像处理问题,通过图像处理和NLP获得对应的特征表示,从而最终计算出相似度,如下图表示。
视频/图片问题转化为NLP或图像处理问题

为用户做个性化推荐

有了上面用户和标的物的特征表示,剩下就是基于此为用户做个性化推荐了,总结了下面5种方法和策略。这里总结的推荐是完全个性化范式的推荐,为每个用户生成不一样的推荐结果。

1.采用跟基于物品的协同过滤类似的方式推荐
该方法采用基于用户行为记录的显示特征表示用户特征,通过将用户操作过的标的物最相似的标的物推荐给用户,算法原理跟基于物品的协同过滤类似,计算公式甚至是一样的,但是这里计算标的物相似度是基于标的物的自身信息来计算的,而基于物品的协同过滤是基于用户对标的物的行为矩阵来计算的。

用户u对标的物s的喜好度 sim(u, s) 可以采用如下公式计算,其中U是所有用户操作过的标的物列表,是用户u对标的物的喜好度,是标的物与s的相似度。

$$
sim(u, s) = \sum_{s_i \in U} score(s_i) * sim(s_i, s)
$$

有了用户对每个标的物的相似度,基于相似度降序排列,就可以取topN推荐给用户了。
除了采用上面的公式外,我们在推荐时也可以稍作变化,采用最近邻方法(K-NearestNeighbor, KNN)。对于用户操作/喜欢过的每个标的物,通过KNN找到最相似的k个标的物

$$
Rec(u) = \sum_{s_i \in U} {s_j|s_j \in kNN(s_i)}
$$

其中Rec(u)是给用户u的推荐,是标的物最近邻(最相似)的k个标的物。

2.采用跟基于用户协同过滤类似的方法计算推荐
如果我们获得了用户的人口统计学向量表示或者基于用户历史操作行为获得了用户的向量化表示,那么我们可以采用跟基于用户的协同过滤方法相似的方法来为用户提供个性化推荐,具体思路如下:
我们可以将与该用户最相似的用户喜欢的标的物推荐给该用户,算法原理跟基于用户的协同过滤类似,计算公式甚至是一样的。但是这里计算用户相似度是基于用户的人口统计学特征向量表示来计算的(计算用户向量cosine余弦相似度)或者是基于用户历史行为嵌入获得的特征向量来计算的,而基于用户的协同过滤是基于用户对标的物的行为矩阵来计算用户之间的相似度。

用户u对标的物s的喜好度 sim(u, s) 采用如下公式计算,其中U是与该用户最相似的用户集合,是用户对标的物s的喜好度,是用户与该用户u的相似度。

$$
sim(u, s) = \sum_{u_i \in U} sim(u, u_i) * score(u_i, s)
$$

有了用户对每个标的物的相似度,基于相似度降序排列,就可以取topN推荐给用户了。

与前面一样我们也可以采用最近邻方法(K-NearesNeighbor, KNN)。通过KNN找到最相似的k个用户,将这些用户操作/喜欢过的每个标的物推荐给用户。

$$
Rec(u) = \sum_{u_i \in KNN(u)} {s_j \in A(u_i)}
$$

其中Rec(u)是给用户u的推荐, kNN(u)是用户相似的k个用户。是用户操作/喜欢过的标的物的集合。

3.基于标的物聚类的推荐
有了标的物的向量表示,我们可以用kmeans等聚类算法将标的物聚类,有了标的物的聚类,推荐就好办了。从用户历史行为中的标的物所在的类别挑选用户没有操作行为的标的物推荐给用户,这种推荐方式是非常直观的。电视猫的个性化推荐就采用了类似的思路。具体计算公式如下,其中是给用户u的推荐,H是用户的历史操作行为集合,Cluster(s)是标的物s所在的聚类。

$$
Rec(u) = \sum_{s\in H}{t\in Cluster(s) \& t\neq s}
$$

4.基于向量相似的推荐
不管是前面提到的用户的显示兴趣特征(利用标签来衡量用户兴趣)或者是向量式的兴趣特征(将用户的兴趣投影到向量空间),我们都可以获得用户兴趣的向量表示。

如果我们获得了用户的向量表示和标的物向量表示,那么我们就可以通过向量的cosine余弦相似度计算用户与标的物之间的相似度。一样的,有了用户对每个标的物的相似度,基于相似度降序排列,就可以去topN推荐给用户了。

基于向量的相似的推荐,需要计算用户向量与每个标的物向量的相似性。如果标的物数量较多,整个计算过程相当耗时。同样,计算标的物最相似的K个标的物,也会涉及到与每个其他标的物计算相似度,也非常耗时。真个计算过程的时间复杂度是O(N),其中N是标的物的总个数。

上述复杂的计算过程可以利用Spark等分布式计算平台来加速。对于T+1级(每天更新一次推荐结果)的推荐服务,利用Spark提前计算好,将推荐结果存储起来供前端业务调用。

另外一种可行的策略是利用高效的向量检索库,在极短时间(毫秒级)内为用户所引出topN最相似的标的物。目前facebook开源的FAISS库就是一个高效的向量搜索与聚类库,可以在毫秒级响应查询及聚类需求,因此可以用于个性化的实时推荐。目前FAISS已经在推荐业务上得到广泛应用。

FAISS库适合稠密向量的检索和聚类,所以对于利用LDA、doc2vec算法构建向量表示的方案是实用的,因为这些方法构建的是稠密向量。而对于TF-IDF及基于标签构建的向量化,就不适用了,这两类方法构建的都是稀疏高位矩阵。

5.基于标签的反向倒排索引做推荐
基于标的物的标签和用户的历史兴趣,可以构建出用户基于标签兴趣的画像及推荐与标的物的倒排索引查询表。基于该反向索引表及用户的兴趣画像,我们就可以为用户做个性化推荐了。该类算法其实就是基于标签的召回算法。

具体推荐过程见下图(基于倒排索引的电影推荐):从用户画像中获取用户兴趣标签,基于用户的兴趣标签从倒排索引中获取该标签对应的标的物,这样就可以从用户关联到标的物了。其中用户的每个兴趣标签及标签关联到的标的物都是有权重的。

基于倒排索引的电影推荐

假设用户的兴趣标签及对应的标签权重形如 $\{(T_1, S_1), (T_2, S_2), (T_3, S_3), ……, (T_k, S_k)\}$ ,其中T是标签, S是用户对标签的偏好权重。
假设标签关联的标的物分别为

$$
T_1 \longleftrightarrow \{(O_{11}, W_{11}), (O_{12}, W_{12}), (O_{13}, W_{13}), ……, (O_{1p_1}, W_{1p_1})\}
$$

$$
T_2 \longleftrightarrow \{(O_{21}, W_{21}), (O_{22}, W_{22}), (O_{23}, W_{23}), ……, (O_{2p_2}, W_{2p_2})\}
$$

$$
\cdots
$$

$$
T_k \longleftrightarrow \{(O_{k1}, W_{k1}), (O_{k2}, W_{k2}), (O_{k3}, W_{k3}), ……, (O_{kp_k}, W_{kp_k})\}
$$

其中O、K分别是标的物及对应的权重,那么

$$
U=\sum_{i=1}^k S_i*T_i \
$$

$$
=\sum_{i=1}^k S_i*\{(O_{i1}, W_{i1}), (O_{i2}, W_{i2}), (O_{i3}, W_{i3}), …, (O_{ip_i}, W_{ip_i})\}
$$

$$
=\sum_{i=1}^k\sum_{j=1}^{p_i} S_i * W_{ij} * O_{ij}
$$

上式中U是用户对标的物的偏好集合,这里将标的物看成向量空间的基,所以有上面公式。不同的标签可以关联到相同的标的物(因为不同的标的物可以有相同的标签),上式中最后一个等号右边需要合并同类项,将相同基前面的系数相加。合并同类项后,标的物(基)前面的数值就是用户对该标的物的偏好程度了,我们对这些偏好程度降序排列,就可以为用户做topN推荐了。

以上就是基于内容的推荐算法的核心原理。

基于内容的推荐算法应用场景

完全个性化推荐

为每个用户生成不同的推荐结果。

标的物关联标的物推荐

即根据当前用户浏览标的物,做相关标的物列表topN推荐。

配合其他推荐算法

由于基于内容的推荐算法在精准度上不如协同过滤肃反啊,但是可以更好的适应冷启动,所以在实际业务中基于内容的推荐算法会配合其他算法一起服务于用户,常用方法是采用级联方式,先给用户协同过滤的推荐结果,如果该用户行为较少导致没有协同过滤推荐结果,就为该用户推荐基于内容的推荐算法产生推荐结果。

主题推荐

如果我们有标的物的推荐信息,并且基于推荐系统构建了一套推荐算法,那么我们就可以将用户喜欢的标签采用主题的方式推荐给用户,每个主题就是用户的一个兴趣标签。通过一系列主题罗列展示,让用户从中筛选自己感兴趣的内容。下图呈现了Netflix首页的示例。
Netflix首页推荐

Netflix的首页大量采用基于主题的推荐模式。主题推荐的好处是可以将用户所有的兴趣点按照兴趣偏好大小先后展示出来,可解释性强,并且让用户有更多维度的自由选择空间。

在真实产品中可以采用比netflix这个示例首页更好的方式。具体来说,可以为每个标签通过人工编辑生成一句更有表达空间的话(如武侠标签,可以采用“江湖风云再起,各大门派齐聚论剑”这样更有深度的表述),具体前端展示映射到人工填充的话而不是直接展示原来的标签。

给用户推荐标签

另外一种可行的推荐策略是不直接给用户推荐标的物,而是给用户推荐标签,用户通过关注推荐的标签,自动获取具备该标签的标的物。除了可以通过推荐的标签关联到标的物获得直接推荐标的物类似的效果外,间接的通过用户对推荐的标签选择、关注等行为进一步获得了用户的兴趣偏好,这是一种更简简单可行的推荐产品实现方案。

基于内容的推荐算法的优缺点

优点

  1. 可以很好的识别用户偏好
    基于内容的推荐算法完全基于用户的历史兴趣来做推荐,推荐的标的物也跟用户的历史兴趣相似,所以推荐内容更加符合用户偏好。

  2. 直观易懂,解释性强
    算法基于用户的兴趣为其推荐相似标的物,原理简单、容易理解。同时,由于是基于用户历史兴趣推荐跟兴趣相似的标的物,用户也非常容易接受和认可。

  3. 更加容易的解决冷启动
    只要用户有一个系统操作系统,就可以基于内容为用户做推荐,随着行为加深,逐渐优化。同时对于新入库的标的物,只要它具备metadata信息等标的物相关信息,就可以利用基于内容的推荐算法将它分发出去。因此,对于强依赖于UGC内容的产品(抖音等),基于内容的推荐可以更好的对标的物提供方进行流量扶持。

  4. 算法实现相对简单
    基于内容的推荐可以基于标签维度做推荐,也可以将标的物嵌入向量空间中,利用相似度做推荐,不管哪种方式,算法实现简单,有现成的开源算法库,容易落地。

  5. 对于小众领域也能有较好的推荐效果
    对于冷门小众标的物,用户行为少,协同过滤等方法很难将这类内容分发出去,而基于内容的推荐算法受影响较小。

  6. 适合标的物快速增长的有时效性要求的产品
    对于标的物增长很快的产品,如今日头条等新闻类,每天都有海量标的物入库,实效性也很强。新的标的物一般用户行为少,协同过滤算法很难将这些大量实时产生的新的标的物推荐出去,这时就可以采用基于内容的推荐算法更好的分发这些内容

缺点

  1. 推荐范围狭窄,新颖性不强
    由于该类算法只依赖于单个用户的行为为用户做推荐,推荐的结果会聚集在用户过去感兴趣的标的物类别上,如果用户不主动关注其他类型的标的物,很难为用户推荐多样性的结果,也无法挖掘用户深层次的潜在兴趣。特别对于新用户,只有少量行为,为用户推荐的标的物会比较单一。

  2. 需要知道相关的内容信息且处理起来较难
    内容信息主要是文本、视频、音频,处理起来费力,相对难度较大,依赖领域知识。同时这些信息大概率含有噪音,增加处理难度。另外,对内容理解的全面性、完整性及准确性会影响推荐的效果。

  3. 较难将长尾标的物分发出去
    基于内容的推荐需要用户对标的物有操作行为,长尾标的物一般操作行为少。由于基于内容的推荐只利用单个用户行为做推荐,所以更难将它分发给更多的用户。

  4. 推荐精准度不太高
    相比协同过滤算法,基于内容的推荐算法精准度要差一些。

基于内容的推荐算法落地需要关注的重要问题

基于内容的推荐算法虽然容易理解、实现相对简单,但落地过程中,总结出来如下关键问题需要提前思考。

内容来源的获取

  1. 标的物“自身携带”的信息
    标的物在上架时,第三方会准备相关的内容信息,如天猫上的商品在上架时会补充很多必要的信息。对于音视频,各类metadata信息也是入库上架时需要填充的信息。我们要做的是增加对新标的物入库的监控和审核,及时发现信息不全的情况并做适当处理。

  2. 通过爬虫获取标的物相关信息
    通过爬虫爬取的信息可以作为标的物信息的补充,增加标的物特征完整表示能力的数据来源。

  3. 通过人工标注数据
    往往人工标注的数据价值密度高,通过人工精准的标注可以大大提升算法推荐的精准度。问题是成本高。

  4. 通过运营活动或者产品交互让用户填的内容
    通过抽奖活动让用户填写家庭组成、兴趣偏好等,在用户开始注册时让用户填写兴趣偏好特征,这些都是获取内容的手段。

  5. 通过收集用户行为直接获得或者预测推断出的内容
    通过请求用户GPS位置知道用户的活动轨迹,用户购买时填写收货地址,用户绑定的身份证和银行卡等,通过用户操作行为预测出用户的兴趣偏好,这些方法都可以获得部分用户数据。

  6. 通过与第三方合作或者产品矩阵之间补充信息
    目前中国有大数据交易市场,通过正规的数据交易或者跟其他公司合作,在不侵犯用户隐私的情况下,通过交换数据可以有效填补自己产品上缺失的数据。
    如果公司有多个产品,新产品可以借助老产品的巨大用户基数,将新产品的用户与老产品用户关联起来(id-maping或者账号打通),这样老产品上丰富的用户行为信息可以赋能给新产品。

利用负面反馈

用户对标的物的操作行为不一定代表正向反馈,有可能是负向的。比如点开一个视频,看了不到几秒就退出来了,明显表明用户不喜欢。有很多产品会在用户交互中直接提供负向反馈能力,这样可以收集到更多负向反馈。下面是今日头条和百度APP推荐的文章,右下角有一个小叉叉(见下面图9中红色圈圈),点击后展示上面的白色交互区域,读者可以勾选几类不同的负向反馈机制。
负面反馈形式

负面反馈一般代表用户强烈的不满,因此利用好负反馈信息可以大大提升推荐系统的精准度和满意度。基于内容的推荐算法整合负反馈方式一般有以下几种:

  1. 将负向反馈整合到算法模型中
    在构建算法模型中整合负向反馈,跟正向反馈一起学习,从而更自然的整合负向反馈信息。

  2. 采用事后过滤方式
    先生成推荐列表,再从该列表中过滤掉负向反馈关联或者相似的标的物。

兴趣随时间变化

用户的兴趣不是一成不变的,算法如何整合用户的兴趣变化?可行的策略是对用户的兴趣根据时间衰减,将用户操作行为投射到时间线上,并根据时间线的先后顺序给予不同权重,同时给用户建立短期兴趣特征和长期(一般)兴趣特征,在推荐时既考虑短期有考虑长期兴趣,最终推荐列表中整合两部分结果呈现。

数据清洗

基于内容的推荐算法依赖于标的物相关的描述信息,这些信息更多的是以文本的形式存在,这就涉及到自然语言处理,文本中可能会存在很多歧义、符号、脏数据,我们需要实现对数据进行很好的处理,才能让后续的推荐算法产生好的效果。

加速计算与节省资源

在实际推荐算法落地时,我们会事先为每个标的物计算N(=50)个最相似的标的物,事先将计算好的标的物存起来,减少时间和空间成本,方便后续更好地做推荐。同时也可以利用各种分布式计算平台和快速查询平台(如Spark、FAISS库等)加速计算过程。另外,算法开发过程中尽量做到模块化,对业务做抽象封装,这可以大大提升开发效率,并且可能会节省很多资源。

解决基于内容的推荐越推越窄的问题

前面提到基于内容的推荐存在越推越窄的缺点,那怎么避免或者减弱这种影响呢?当然用协同过滤等其他算法是一个有效的方法。另外,我们可以给用户做兴趣探索,为用户推荐兴趣之外的特征关联的标的物,通过用户的反馈来拓展用户兴趣空间,这类方法就是强化学习中的EE方法。如果我们构造了标的物的知识图谱系统,我们就可以通过图谱拓展标的物更远的联系,通过长线的相关性来做推荐,同样可以有效解决越推越窄的问题。

工程落地技术选型

本篇文章主要讲的是基于内容的推荐系统的算法实现原理,具体工程实践时,需要考虑到数据处理、模型训练、分布式计算等技术,当前很多开源方案可以使用,常用的如Spark mllib,scikit-learn,Tensorflow,pytorch,gensim等,这些工具都封装了很多数据处理、特征提取、机器学习算法,我们可以基于第二节的算法思路来落地实现。

业务的安全性

除了技术外,在推荐产品落地中还需要考虑推荐的标的物的安全性,避免推荐反动、色情、标题党、低俗内容,这些就需要基于NLP或者CV技术对文本或者视频进行分析过滤。如果是UGC平台型的产品,还需要考虑怎么激励优质内容创作者,让好的内容得到更多的分发机会,同时对产生劣质内容的创作者采取一定的惩罚措施,比如限制发文频率、禁止一段时间的发文权限等。

转载自 基于内容的推荐算法


   转载规则


《基于广义内容的推荐算法系统》 catiga 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
广义文本的向量表示方法 广义文本的向量表示方法
NLP的基础工作就是文本处理,向量化文本表示的核心目的是将文本表示为一系列的能够表达文本语义的向量,有word2vec、str2vec和doc2vec技术,区别是目标处理单元不同。word2vec即词向量,str2vec为句向量,doc2v
2021-11-12
下一篇 
理解“无穷小” 理解“无穷小”
九城爱数学 什么是无穷小?无穷小数学符号记为 $\epsilon$ , 它的数学性质应该满足:对于任意给定实数 $\gamma$>0,都满足 0<|$\epsilon$|<$\gamma$。很明显,无穷小是数学概念,并
2021-10-25
  目录