推荐系统实践(项亮)第四章

第四章 利用用户标签数据

推荐系统的目的是联系用户的兴趣和物品,这种联系需要不同的媒介。除了之前的$ItemCF$和$UserCF$,还有一种重要的方式是通过一些特征联系用户和物品,给用户推荐那些具有用户喜欢的特征的物品.这里的特征有不同的表现方式,比如可以表现为物品的属性集合(e.g., 对于图书,属性集合包括作者、出版社、主题和关键词等),也可以表现为隐语义向量(latent factor vector),这可以通过前面提出的隐语义模型学习得到。本章将讨论一种重要的特征表现方式——标签。

标签是一种无层次化结构的、用来描述信息的关键词,它可以用来描述物品的语义。根据给物品打标签的人不同,标签应用一般分为两种:一种是让作者或者专家给物品打标签;另一种是让普通用户给物品打标签,也就是UGC(User Generated Content,用户生成的内容)的标签应用。UGC的标签系统是一种表示用户兴趣和物品语义的重要方式。当一个用户对一个物品打上一个标签,这个标签一方面描述了用户的兴趣,另一方面则表示了物品的语义,从而将用户和物品联系了起来。因此本章主要讨论UGC的标签应用,研究用户给物品打标签的行为,探讨如何通过分析这种行为给用户进行个性化推荐。

4.1 UGC标签系统的代表应用

UGC标签系统的鼻祖Delicious、论文书签网站CiteULike、音乐网站Last.fm、视频网站Hulu、书和电影评论网站豆瓣等等,不做过多阐述

4.2 标签系统中的推荐问题

标签系统中的推荐问题主要有以下两个。

  • 如何利用用户打标签的行为为其推荐物品(基于标签的推荐)?
  • 如何在用户给物品打标签时为其推荐适合该物品的标签(标签推荐)?

为了研究上面的两个问题,我们首先需要解答下面3个问题。

  • 用户为什么要打标签?
  • 用户怎么打标签?
  • 用户打什么样的标签?

4.2.1 用户为什么进行标注

社会维度

  • 有些用户标注是给内容上传者使用的(便于上传者组织自己的信息)
  • 有些用户标注是给广大用户使用的(便于帮助其他用户找到信息)

功能维度

  • 有些标注用于更好地组织内容,方便用户将来的查找
  • 而另一些标注用于传达某种信息,比如照片的拍摄时间和地点等。

4.2.2 用户如何打标签

使用的另一个数据集发现效果不好,就用这个数据集:delicious-2k

首先通过研究数据集总结用户标注行为的一些统计规律。我们定义:一个标签被一个用户使用在一个物品上,它的流行度就加一。可以看出标签流行度符合长尾分布,

image-20220410205647970

实验代码

4.2.3 用户打什么样的标签

在用户看到一个物品时,打的标签可能是很多样的,并不会按我们的想法操作。很多网站也设计了自己的标签分类系统。有人将Delicious数据集的标签分为如下几类:

  • 表明物品是什么
  • 表明物品的种类——article;blog;book
  • 表明谁拥有物品——作者
  • 表达用户的观点——funny;boring
  • 用户相关的标签——my favorite;my comment
  • 用户的任务——to read;job search

4.3 基于标签的推荐系统

参考代码

一个用户标签行为的数据集一般由一个三元组的集合表示,其中$(u,i,b)$代表用户$u$ 给商品$i$打上标签$b$。(真实标签行为数据还包括用户打标签的时间、用户的属性数据、物品的属性数据等等),为了集中讨论标签数据,之后的实验只考虑上面定义的三元组形式的数据,即用户的每一次打标签行为都用一个三元组(用户、物品、标签)表示。

4.3.1 实验设置

首先把数据集分割(分割的键值是用户和物品,防止出现用户对一个物品打的多个标签被分到训练集和测试集中)。令$R(u)$为给用户$u$的长度为$N$的推荐列表,里面包含我们认为用户会打标签的物品。$T(u)$是测试集中用户$u$实际上打过标签的物品集合。
$$
Precision=\frac{|R(u)\cap T(u)|}{|R(u)|}\
Recall=\frac{|R(u)\cap T(u)|}{|T(u)|}
$$
同时评测覆盖率:
$$
Coverage=\frac{\cup _{u\in U}R(u)}{|I|}
$$
第一章提到,多样性的定义取决于相似度的定义。这里使用物品标签的余弦相似度度量物品间的相似度。对于物品$i$,item_tags[i]存储了物品i的标签向量,其中item_tags[i][b]是对物品$i$打标签$b$的次数。

得到物品相似度后,通过下式计算一个推荐列表的多样性:
$$
Diversity=1-\frac{\sum_{i\in R(u)}\sum_{j\in R(u,)j\neq i}Sim(item_tags[i],item_tags[j])}{\dbinom {|R(u)|}2}
$$
计算所有用户推荐列表多样性的平均值即为推荐系统的多样性。

推荐结果的新颖性用推荐结果的平均热门程度(AveragePopularity)度量,对于物品$i$,定义它的流行度item_pop(i)为给这个物品打过标签的用户数,定义推荐系统的平均热门度如下:
$$
AveragePopularity=\frac{\sum_{u}\sum_{i\in R(u)}log(1+item_pop(i))}{\sum_{u}\sum_{i\in R(u)}1}
$$

4.3.2 一个简单的算法

  • 统计每个用户最常用的标签
  • 对每个标签,统计被打过这个标签次数最多的物品
  • 对一个用户,首先找到他常用的标签,然后找到具有这些标签的最热门物品推荐给这个用户

则用户$u$对物品$i$的兴趣可表示为:
$$
p(u,i)=\sum_bn_{u,b}n_{b,i}
$$
$B(u)$是用户$u$打过的标签集合,$B(i)$是物品$i$被打过的标签集合,$n_{u,b}$是用户$u$打过标签$b$的次数,$n_{b,i}$是物品$i$被打过标签$b$的次数。在代码中,user_tags[u][b] = $n_{u,b}$ ;tag_items[b][i] = $n_{b,i}$

之后,便可根据兴趣排名进行推荐

4.3.3 算法改进

1 TFIDF

TagBasedTFIDF

老生常谈的问题:上面的算法利用用户的标签向量对用户兴趣建模,其中每个标签都是用户使用过的标签,而标签的权重是用户使用该标签的次数,这会造成给热门标签对应的热门物品很大的权重。例如一名用户使用了10次标签$b_1$:Robdingnagian(巨大的)和1次标签$b_2$:Interesting,即$10=n_{u,b_1}>n_{u,b_2}=1$。显然前者是一个冷门标签,后者是热门标签,而且该用户更喜欢巨大的而非有趣的。但对大多数商品来说,其标签是$b_1$的概率远远小于$b_2$,即$n_{b_1,i}<<n_{b_2,i}$,因此按照上面公式最终得到的推荐商品可能都是有趣的而非巨大的,不符合该用户的口味。

借鉴TF-IDF的思想进行改进,对热门标签进行惩罚:
$$
p(u,i)=\sum_b\frac{n_{u,b}}{log(1+n_b^{(u)})}n_{b,i}
$$
$n_b^{(u)}$记录了标签$b$被多少个不同的用户使用过

TagBasedTFIDF++

同样也可以对热门物品进行惩罚:
$$
p(u,i)=\sum_b\frac{n_{u,b}}{log(1+n_b^{(u)})}\frac{n_{b,i}}{log(1+n_i^{(u)})}
$$
$n_i^{(u)}$记录了物品$i$被多少个不同的用户打过标签

2 数据稀疏性

在前面的算法中,用户兴趣和物品的联系是通过$B(u)\cap B(i)$中的标签建立的,但对于新物品或新用户,这个值就会很小,因此需要对标签集合做扩展。例如某用户使用一个标签,就可以把这个标签的相似标签也加入进来。标签扩展有很多方法,如话题模型(topic model),下面介绍一种简单的基于邻域的方法:

标签扩展可理解为计算标签间的相似度。最简单的情况是,如果有同义词词典,就可以根据这个词典进行扩展;也可以从数据中统计出标签的相似度。即当两个标签同时出现在很多物品的标签集合中时,就可以认为这两个标签具有较大的相似度。
$$
sim(b,b’)=\frac{\sum_{i\in N(b)\cap N(b’)}n_{b,i}n_{b’,i}}{\sqrt {\sum_{i\in N(b)}n_{b,i}^2}\sqrt{ \sum_{i\in N(b’)} n_{b’,i}^2}}
$$
$N(b)$为具有标签$b$的物品集合,$n_{b,i}$是物品$i$被打过标签$b$的次数。

3 标签清理

标签清理的原因:

  • 不是所有标签都能反应用户的兴趣,例如用户给某视频打了“not funny”标签,不能认为他对该标签感兴趣,并且给其他用户推荐具有该标签的其他视频;但如果对视频打了“成龙”标签,就可以认为他对成龙主演的视频有兴趣,从而推荐。
  • 另外,标签系统经常出现词形不同、词义相同的标签
  • 将标签作为推荐解释(如果要把标签呈现给用户,就需要高质量的标签,不能包含无意义的停止词,意义相同的词等)

一般有以下标签清理方法:

  • 去除词频很高的词
  • 去除因词根不同造成的同义词,比如recommender system和recommendation system
  • 去除因分隔符造成的同义词,比如collaborative_filtering和collaborative-filtering

当然,为了控制标签的质量,也可以让用户进行反馈

4.3.4 基于图的推荐算法

前面的算法不够系统化和理论化(但可能很work),下面为利用图模型做基于标签数据的个性化推荐。

首先定义三种不同的顶点:用户顶点$v(u)$;物品顶点$v(i)$; 标签顶点$v(b)$。对于每一个行为$(u,i,b)$,就在图中增加三条边(如果两个顶点已经相连,就将边的权重增加1)。图4-11是一个简单的用户-物品-标签图。

image-20220411113036680

定义出用户-物品-标签图后,就可以利用第二章的PersonalRank算法计算所有物品节点相对于当前用户节点在图上的相关性,然后按照相关性排序、推荐。

用图模型解释前面的简单算法(SimpleTagGraph)

简单算法中的$p(u,i)=\sum_bn_{u,b}n_{b,i}$可以看作$p(i|u)=\sum_bp{(b|u)}p{(i|b)}$,它假设用户对物品的兴趣通过标签传递,因此该公式可用更简单的图来建模(SimpleTagGraph),对一个用户行为只增加两条边(少了用户和物品节点之间的边)。

如下例,构建SimpleTagGraph后,利用PersonalRank算法,就等价于前面提出的简单推荐算法。

image-20220411114252732

4.3.5 基于标签的推荐解释

要让用户直观上感觉推荐结果有道理是很困难的,豆瓣将推荐结果的可解释性拆分成了两部分,首先让用户觉得标签云是有道理的,然后让用户觉得从某个标签推荐出某本书也是有道理的。因为生成让用户觉得有道理的标签云比生成让用户觉得有道理的推荐图书更加简单,标签和书的关系就更容易让用户觉得有道理,从而让用户最终觉得推荐出来的书也是很有道理的。

豆瓣这样组织推荐结果页面有很多好处,首先是提高了推荐结果的多样性:一个用户的兴趣在长时间内是很广泛的,但在某一天却比较具体。因此,我们如果想在某一天击中用户当天的兴趣,是非常困难的。通过标签云,展示了用户的所有兴趣,然后让用户自己根据他今天的兴趣选择相关的标签,得到推荐结果,从而极大地提高了推荐结果的多样性,使得推荐结果更容易满足用户多样的兴趣。
同时,标签云也提供了推荐解释功能:用户通过这个界面可以知道豆瓣给自己推荐的每一本书都是基于它认为自己对某个标签感兴趣。而对于每个标签,用户总能通过回忆自己之前的行为知道自己是否真的对这个标签感兴趣。

4.4 给用户推荐标签

4.4.1 为什么要给用户推荐标签

  • 方便用户输入标签 (提高参与度)
  • 提高标签质量(保证词表不出现太多的同义词,出现的都是一些比较热门的、有代表性的词)

4.4.2 如何给用户推荐标签

参考代码

第0种:给用户$u$推荐整个系统里最热门的标签(PopularTags)

第1种:给用户$u$推荐物品$i$上最热门的标签 (ItemPopularTags)

第2种:给用户$u$推荐他自己经常使用的标签 (UserPopularTags)

第3种:前两种方法的融合,通过一个系数将上面的推荐结果加权(HybridPopularTags)

这类基于用户常用标签和物品常用标签的算法对新用户或不热门的物品很难有推荐结果,一般有两个解决思路:

  • 从物品的内容数据中抽取关键词作为标签,在上下文广告领域这类研究很多
  • 针对有结果但不多的情况,可使用关键词扩展

4.4.4 基于图的标签推荐算法

image-20220411113036680

同样是这个图,此时的问题是用户遇到物品时,会给物品打什么样的标签。因此重新定义顶点的启动概率,如下所示:

image-20220411202345996

即只有用户$u$和物品$i$对应的顶点有非0的启动概率。

4.5 总结

主要讨论了UGC标签在推荐系统中的应用。标签作为描述语义的重要媒介,无论是对于描述用户兴趣还是表示物品的内容都有很重要的意义。标签在推荐系统中的应用主要集中在两个问题上,一个是如何利用用户打标签的行为给用户推荐物品,另一个是如何给用户推荐标签。本章在深入分析用户标签行为的基础上对这两个问题进行了深入探讨。

关于标签的研究有很多新的方法,比如张量分解(tensor factorization)、基于LDA的算法、基于图的算法等。不过这些算法很多具有较高的复杂度,在实际系统中应用起来还有很多实际的困难需要解决。