3.2.4 为用户做个性化推荐
有了用户和标的物的特征表示,剩下就是基于此为用户做个性化推荐了,一般有5种方法和策略,下面一一讲解。本节介绍的是完全个性化范式的推荐,为每个用户生成不一样的推荐结果。有了标的物向量表示就很容易计算标的物关联标的物推荐了,其他范式的推荐可以根据上一章的思路及3.2.2节、3.2.3节的特征表示方案来实现,本节不再介绍。
1.采用与基于物品的协同过滤类似的方式推荐
该方法采用基于用户行为记录的显式特征来表示用户特征,可将用户操作过的标的物最相似的标的物推荐给用户,其算法原理与基于物品的协同过滤类似(上一章已经简单介绍过协同过滤了,在下一章会详细讲解),甚至计算公式也是一样的,但是这里计算标的物相似度是基于标的物自身的信息来计算的,而基于物品的协同过滤是基于用户对标的物的行为矩阵来计算的。
用户u对标的物s的喜好度sim(u,s)可以采用如下公式计算,其中S是所有用户操作过的标的物的列表,score(u,si)是用户u对标的物si的喜好度,sim(si,s)是标的物si与s的相似度。
有了用户对每个标的物的喜好度,基于喜好度降序排列,就可以取topN推荐给用户了。
除了采用上面的公式外,我们在推荐时也可以稍做变化,采用K最近邻(K-Nearest Neighbor,KNN)方法。对于用户操作/喜欢过的每个标的物,通过KNN找到最相似的k个标的物。
其中Rec(u)是给用户u的推荐,KNN(si)是标的物si最近邻(最相似)的k个标的物。
2.采用与基于用户协同过滤类似的方法推荐
如果我们获得了用户的人口统计学向量表示或者基于用户历史操作行为获得了用户的向量化表示,那么可以采用与基于用户的协同过滤方法相似的方法来为用户提供个性化推荐,具体思路如下。
我们可以将与该用户最相似的用户喜欢的标的物推荐给该用户,算法原理跟基于用户的协同过滤类似,计算公式甚至也是一样的。但是这里计算用户的相似度是基于用户的人口统计学特征向量表示来计算的(计算用户向量余弦相似度),或者是基于用户历史行为嵌入获得的特征向量来计算的,而基于用户的协同过滤是基于用户对标的物的行为矩阵来计算用户之间的相似度的。
用户u对标的物s的喜好度sim(u,s)可以采用如下公式计算:
其中U是与该用户最相似的用户集合,score(ui,s)是用户ui对标的物s的喜好度,sim(u,ui)是用户ui与用户u的相似度。
有了每个标的物的喜好度,基于喜好度降序排列,就可以取topN推荐给用户了。
与前面一样,也可以采用KNN找到最相似的k个用户,并将这些用户操作/喜欢过的每个标的物推荐给用户。
其中Rec(u)是给用户u的推荐,KNN(u)是与用户相似的k个用户。A(ui)是用户ui操作/喜欢过的标的物的集合。
3.基于标的物聚类的推荐
有了标的物的向量表示,我们可以用K-Means等聚类算法将标的物聚类,有了标的物的聚类,推荐就好实现了。从用户历史行为中的标的物所在的类别挑选用户没有操作行为的标的物推荐给用户,这种推荐方式是非常直观自然的。电视猫的个性化推荐就采用了类似的思路。具体计算公式如下:
其中,Rec(u)是给用户u的推荐,H是用户u的历史操作行为集合,Cluster(s)是标的物s所在的聚类。
4.基于向量相似的推荐
不管是通过前面提到的用户的显式兴趣特征(利用标签来衡量用户兴趣),还是向量式的兴趣特征(将用户的兴趣投影到向量空间),我们都可以获得用户兴趣的向量表示。
如果我们获得了用户的向量表示和标的物的向量表示,那么就可以通过向量的余弦相似度计算用户与标的物之间的相似度。同样,有了用户对每个标的物的相似度,基于相似度降序排列,就可以取topN推荐给用户了。
基于向量的相似推荐,需要计算用户向量与每个标的物向量的相似性。如果标的物数量较多,整个计算过程还是相当耗时的。同样,计算标的物最相似的K个标的物,也会涉及与每个其他标的物相似度的计算,也是非常耗时的。整个计算过程的时间复杂度是O(N×N),其中N是标的物的总个数。
上述复杂的计算过程可以利用Spark等分布式计算平台来加速。对于T+1级(每天更新一次推荐结果)的推荐服务,利用Spark事先计算好,将推荐结果存储起来供前端业务调用也是可以的。
另外一种可行的策略是利用高效的向量检索库,在极短时间(一般几毫秒或者几十毫秒)内为用户索引出topN最相似的标的物。目前Facebook开源的FAISS库(见本章参考文献[9])就是一个高效的向量搜索与聚类库,可以在毫秒级响应查询及聚类需求,因此可以用于个性化的实时推荐。国内已有很多公司将该库用到了推荐业务上,电视猫在频道页列表重排序推荐中也用到了该库。
FAISS库适合稠密向量的检索和聚类,所以对于利用LDA、Doc2vec算法构建向量表示的方案是实用的,因为这些方法构建的是稠密向量。而对于TF-IDF及基于标签构建的向量化表示就不适用了,这两类方法构建的都是稀疏的高维向量。
5.基于标签的反向倒排索引做推荐
该方法在上一章中也简单做了介绍,这里再简单说一下,并且给出具体的计算公式。基于标的物的标签和用户的历史兴趣,我们可以构建出用户基于标签兴趣的画像,以及标签与标的物的倒排索引查询表(如果你熟悉搜索,应该不难理解)。基于该倒排索引表及用户的兴趣画像,我们就可以为用户做个性化推荐了。该类算法其实就是基于标签的召回算法。
具体推荐过程是这样的(见图3-7):从用户画像中获取用户的兴趣标签,基于用户的兴趣标签从倒排索引表中获取该标签对应的标的物,这样就可以从用户关联到标的物了。其中用户的每个兴趣标签及标签关联到的标的物都是有权重的。
图3-7 基于倒排索引的电影推荐
假设以下是用户的兴趣标签及对应的标签权重:
{(T1,S1),(T2,S2),(T3,S3),…,(Tk,Sk)}
其中,Ti是标签,Si是用户对标签的偏好权重。
假设标签T1,T2,T3,…,Tk关联的标的物分别为
其中Oij、wij分别是标的物及对应的权重,那么
上式中U是用户对标的物的偏好集合,这里将标的物Oij看成向量空间的基,所以有上面的公式。不同的标签可以关联到相同的标的物(因为不同的标的物可以有相同的标签),上式中最后一个等号右边需要合并同类项,将相同基前面的系数相加。合并同类项后,标的物(基)前面的数值就是用户对该标的物的偏好程度了,我们对这些偏好程度降序排列,就可以为用户做topN推荐了。
到此已介绍完基于内容的推荐算法的核心原理和具体实现方案,那么这些算法是怎么应用到真实的产品中的呢?有哪些可行的推荐产品形态?这就是下一节的主要内容。