原创:石晓文
本篇的思维导图如下:
![](http://upload-images.jianshu.io/upload_images/4155986-05842d10c21e0bf5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
1、UGC标签简介
标签应用一般分为两种:一种是让作者或者专家给物品打标签;另一种是让普通用户给物品打标签,也就是UGC(User Generated Content,用 户生成的内容)的标签应用。我们本篇主要讨论UGC的标签应用。
标签系统中的推荐问题主要有以下两个:
1)如何利用用户打标签的行为为其推荐物品(基于标签的推荐)?
2)如何在用户给物品打标签时为其推荐适合该物品的标签(标签推荐)?
本节,我们主要介绍基于标签的推荐问题
2、基于标签的推荐
2.1 一个最简单的算法
拿到了用户标签行为数据,相信大家都可以想到一个最简单的个性化推荐算法。这个算法的描述如下所示。
1) 统计每个用户最常用的标签。
2) 对于每个标签,统计被打过这个标签次数最多的物品。
3) 对于一个用户,首先找到他常用的标签,然后找到具有这些标签的最热门物品推荐给这个用户。
对于上面的算法,用户u对物品i的兴趣公式如下:
![](http://upload-images.jianshu.io/upload_images/4155986-8868cfa0c5afc37d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/560)
这里,B(u)是用户u打过的标签集合,B(i)是物品i被打过的标签集合,nu,b是用户u打过标签b 的次数,nb,i是物品i被打过标签b的次数。
2.2 基于TFIDF的算法改进
前面这个公式倾向于给热门标签对应的热门物品很大的权重,因此会造成推荐热门的物品给 用户,从而降低推荐结果的新颖性。另外,这个公式利用用户的标签向量对用户兴趣建模,其中 每个标签都是用户使用过的标签,而标签的权重是用户使用该标签的次数。这种建模方法的缺点 是给热门标签过大的权重,从而不能反应用户个性化的兴趣。
因此我们可以从两个方面对上式进行修正:
1)首先,我们对热门标签进行一定的惩罚,得到下式:
![](http://upload-images.jianshu.io/upload_images/4155986-0ad762089d34a580.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
这里,分母记录了标签b被多少个不同的用户使用过。
2)然后,我们还可以对热门物品进行惩罚:
![](http://upload-images.jianshu.io/upload_images/4155986-cdb84d196728022b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
这里,后面的分母记录了物品i被多少个不同的用户打过标签。
2.3 标签扩充
在前面的算法中,用户兴趣和物品的联系是通过 B(u) ∩ B(i) 中的标签建立的。但是,对于新用户或者新物品,这个集合( B(u) ∩ B(i) )中的标签数量会很少。为了提高推荐的准确率,我们 可能要对标签集合做扩展,比如若用户曾经用过“推荐系统”这个标签,我们可以将这个标签的 相似标签也加入到用户标签集合中,比如“个性化”、“协同过滤”等标签。
标签扩展的本质是对每个标签找到和它相似的标签,也就是计算标签之间的相似度。最简单的相似度可以是同义词。如果认为同一个物品上的不同标签具有某种相似度,那么当两个标签同时出现在很多物品的 标签集合中时,我们就可以认为这两个标签具有较大的相似度。对于标签b,令N(b)为有标签b的 物品的集合,n_{b,i}为给物品i打上标签b的用户数,我们可以通过如下余弦相似度公式计算标签 b和标签b'的相似度:
![](http://upload-images.jianshu.io/upload_images/4155986-920d5aa7ed45e3de.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)
2.4 标签清理
标签需要清理主要有两个原因:
1)不是所有标签都能反应用户的兴趣
2)标签清理的另一个重要意义在于将标签作为推荐解释
标签清理的主要方法有:
1)去除词频很高的停止词
2)去除因词根不同造成的同义词
3)去除因分隔符造成的同义词
2.5 基于图的推荐算法
首先,我们需要将用户打标签的行为表示到一张图上。我们知道,图是由顶点、边和边上的 权重组成的。而在用户标签数据集上,有3种不同的元素,即用户、物品和标签。因此,我们需 要定义3种不同的顶点,即用户顶点、物品顶点和标签顶点。然后,如果我们得到一个表示用户u 给物品i打了标签b的用户标签行为(u,i,b),那么最自然的想法就是在图中增加3条边,首先需要在用户u对应的顶点v(u)和物品i对应的顶点v(i)之间增加一条边(如果这两个顶点已经有边相连,那 么就应该将边的权重加1),同理,在v(u)和v(b)之间需要增加一条边,v(i)和v(b)之间也需要边相连接。
下图是一个简单的用户—物品—标签图的例子。该图包含3个用户(A、B、C)、3个物品(a、 b、c)和3个标签(1、2、3)。在定义出用户—物品—标签图后,我们可以用基于随机游走的PersonalRank算法计算所有物品节点相对于当前用户节点在图上的相关性,然后按照相关性从大到小的排序,给用户推荐排名最高的N个物品。
![](http://upload-images.jianshu.io/upload_images/4155986-86e34f0b609e5acd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/700)