[推荐系统读书笔记]利用用户标签数据

推荐系统的目的是联系用户的兴趣和物品,这种联系需要以来不同的媒介。GroupLens在一篇文章中表示目前流行的推荐系统基本上通过3种方式联系童虎兴趣和物品。
用户兴趣和物品联系方式

第一种方式是利用用户喜欢过的物品,给用户推荐与他喜欢过的物品相似的物品,也就是基于物品的推荐算法。第二种方式是利用和用户兴趣相似的其他用户,给用户推荐那些和他们兴趣爱好相似的其他用户的喜欢的物品,也就是基于用户的推荐算法。第三种方式是通过一些特征联系用户和物品,给用户推荐那些具有用户喜欢的特征的物品。特征有不同的表现方式,比如可以表现为物品的属性集合(比如对于图书,属性集合包括作者、出版社、主题和关键词等),也可以表行为隐语义向量,可以通过隐语义模型学习得到。还有一种重要的特征表现方式---标签。

根据维基百科的定义,标签是一种无层次化结果的、用来描述信息的关键词,可以用来描述物品的语义。根据给物品打标签的人的不同,标签应用一般分为两种:一种是让作者或者专家给物品打标签;另一种是让普通用户给物品打标签,也就是UGC(User Generated Content,用户生成的内容)的标签应用UGC的标签系统是一种表示用户兴趣和物品语义的重要方式。当一个用户对一个物品打上一个标签,这个标签一方面描述了用户的兴趣,另一方面则表示了物品的语义,从而将用户和物品联系了起来。

UGC标签系统的代表应用

UGC标签系统是很多Web2.0网站的必要组成部分,使用UGC标签系统的代表网站---UGC标签系统的鼻祖Delicious、论文书签网站CiteULike、音乐网站Last.fm、视频网站Hulu、书和电影评论网站豆瓣等。

Delicious

Delicious允许用户给互联网上的每个网页打标签,从而通过标签重新组织整个互联网。

CiteULike

CiteULike是一个著名的论文书签网站,允许研究人员提交或者收藏自己感兴趣的论文并且给论文打标签,从而帮助用户更好地发现和自己研究领域相关的优秀论文。

标签系统在各种各样的(音乐、视频和社交等)网站中都得到了广泛应用。标签系统的最大优势在于可以发挥群体的智能,获得对物品内容信息比较准确的关键词描述,而准确的内容信息是提升个性化推荐系统性能的重要资源

标签系统中的推荐问题

打标签作为一种重要的用户行为,蕴含了很多用户兴趣信息,深入研究和利用用户打标签的行为可以很好地知道我们改进个性化推荐系统的推荐质量。同事标签的表示形式非常简单,便于很多算法处理。
标签系统中的推荐问题主要有以下两个:

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

为了研究上面的两个问题,首先需要回答3个问题:

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

用户为什么打标签

在设计基于标签的个性化推荐系统之前,需要深入了解用户的标注行为(即打标签的行为),知道用户为什么要标注,用户怎么标注,只有深入了解用户的行为,才能基于这个行为设计出令他们满意的个性化推荐系统。

Morgan Ames从两个维度探讨。首先是社会维度,有些用户标注是给内容上传者使用的(便于上传者组织自己的信息),而有些用户标注是给广大用户使用的(便于帮助其他用户找到信息)。利用一个维度是功能维度,有些标注用户更好地组织内容,方便用户将来的查找,而另一些标注用户传达某种信息,比如照片的拍摄时间和地点等。

用户如何打标签

在互联网中,尽管每个用户的行为看起来是随机的,但其实这些表面随机的行为背后蕴含着很多规律
用户活跃度和物品流行度的分布都遵循长尾分布,发现标签流行度的分布也呈现非常典型的长尾分布。

用户打什么的标签

在用户看到一个物品时,希望他打的标签是能够准确描述物品内容属性的关键词,但用户旺旺不是按照我们的想法操作,可能会给物品打上各种各样奇奇怪怪的标签。

常见的情况是提供许多各种各样的标签供用户选择,给物品打上他认为的标签。

基于标签的推荐系统

用户用标签来描述对物品的看法,因此标签是联系用户和物品的纽带,也是反应用户兴趣的重要数据源,如何利用用户的标签数据提高个性化推荐结果的质量?

一个用户标签行为的数据集一般由一个三元组的集合表示,其中记录(u,i,b)表示用户u给物品i打上了b标签。用户真实标签行为数据远远比三元组表示的复杂,比如用户打标签的时间、用户的属性数据、物品的属性数据等。

一个最简单的标签系统推荐算法

算法描述如下:

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

对于上面算法,用户u对物品i的兴趣公式如下:
\(p(u,i) = \sum_{b}n_{u,b}n_{b,i}\)

B(u)是用户u打过的标签集合,B(i)是物品i被打过的标签集合,\(n_{u,b}\)是用户u打过标签b的次数,\(n_{b,i}\)是物品i被打过标签b的次数。

算法改进

预测用户u对物品i的兴趣公式,可以发现很多缺点。

1.TF-IDF

原来的计算公式倾向于给热门标签对应的热门物品很大的比重,会造成推荐热门的物品给用户,从而降低推荐结果的新颖性。另外,利用用户的标签向量对用户兴趣建模,其中每个标签都是用户使用过的标签,而标签的权重是用户使用该标签的次数。这种建模方法的缺点是给热门标签过大的权重,从而不能反应用户个性化的兴趣。借鉴TF-IDF思想,对其进行改进:

\(p(u,i) = \sum_{b}\frac{n_{u,b}}{log(1 + n_b^{(u)})}n_{b,i}\)

\(n_b^{(u)}\)记录标签b被多少个不同的用户使用过。
也可以对热门物品进行惩罚,得到如下公式:

\(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),简单的方法有基于邻域的方法。

标签扩展的本质是对每个标签找到和它相似的标签,也就是计算标签之间的相似度。最简单的相似度可以是同义词,如果有一个同义词词典,可以根据词典进行标签扩展;如果没有词典,可以从数据中统计出标签的相似度。

如果认为同一个物品上的不同标签具有某种相似度,那么当两个标签同时出现在很多物品的标签集合中时,可以认为这两个标签具有较大的相似度

实验发现,进行标签扩展确实能够提高基于标签的物品推荐的准确率和召回率,但可能会稍微降低推荐结果的覆盖率和新颖度。

3.标签清理

不是所有标签都能反应用户的兴趣。标签清理的另一个重要意义在于将标签作为推荐解释。如果我们要把标签呈现给用户,将其作为给用户推荐某一个物品的解释,对标签的质量要求就很高。首先,这些标签不能包含没有意义的停止词或者表示情绪的词,其次这些推荐解释里不能包含很多意义相同的词语。

一般标签清理方法:

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

为了控制标签的质量,很多网站也采用了让用户进行反馈的思想,即让用户告诉系统某个标签是否合适

基于图的推荐算法

首先,我们需要将用户打标签的行为表示到一张图上。带权图是由顶点、边和边上的权重组成的。而在用户标签数据集上,有3种不同的元素,即用户、物品和标签。因此,需要定义3种不同的顶点,即用户顶点、物品顶点和标签顶点。然后,如果我们得到一个表示用户u给物品i打了标签b的用户标签行为 (u,i,b),那么在图中增加3条边,首先需要在用户u对应的顶点v(u)和物品i对应的顶点v(i)之间增加一条边(如果这两个顶点已经有边相连,那么就应该将边的权重加1),同理,在v(u) 和v(b)之间需要增加一条边, v(i)和v(b)之间也需要边相连接。

用户-物品-标签图

用图模型解释前面的简单算法。用户对物品的兴趣公式表示为:
\(P(i|u) = \sum_{b}P(i|b)P(b|u)\)

公式假定用户对物品的兴趣通过标签传递。因此,可以更简单的建模,省去用户和物品之前的连线。

基于标签的推荐解释

基于标签的推荐其最大好处是可以利用标签做推荐解释,这方面的代表性应用是豆瓣的个性化推荐系统。

要让用户直观上感觉推荐结果有道理是很困难的,而豆瓣将推荐结果的可解释性拆分成了两部分,首先让用户觉得标签云是有道理的,然后让用户觉得从某个标签推荐出某本书也是有道理的。

  • 用户对标签的兴趣对帮助用户理解为什么给他推荐某个物品更有帮助(因为你对这个标签感兴趣,所以给你推荐这个标签下的物品);
  • 用户对标签的兴趣和物品标签相关度对于帮助用户判定自己是否喜欢被推荐物品具有同样的作用;
  • 物品标签相关度对于帮助用户判定被推荐物品是否符合他当前的兴趣更有帮助;
  • 客观事实类标签相比主观感受类标签对用户更有作用

给用户推荐标签

当用户浏览某个物品时,标签系统非常希望用户能够给这个物品打上高质量的标签,这样才能促进标签系统的良性循环。因此,很多标签系统都设计了标签推荐模块给用户推荐标签。

为什么要给用户推荐标签

给用户推荐标签有以下好处:

  • 方便用户输入标签: 让用户从键盘输入标签会增加用户大标签的难度,这样很多用户不愿意给物品打标签,因此需要一个辅助工具来减小用户打标签的难度,从而提供用户打标签的参与度
  • 提高标签质量: 同一个语义不同的用户可能用不同的词语来表示。这些同义词会使标签的词表变得很庞大,而且会使计算相似度不太准确。而使用推荐标签时,可以对词表进行选择,首先保证词表不出现太多的同义词,同事保证出现的词都是一些比较热门的、有代表性的词。

如何给用户推荐标签

用户u给物品i打标签时,有很多方法可以给用户推荐和物品i相关的标签。比较简单的方法有4种。
第1种方法就是给用户u推荐整个系统里最热门的标签;令tags[b]表示标签b的热门程度,

def RecommendPopularTags(user, item, tags, N):
    return sorted(tags.items(),key=lambda a:a[1],reverse=True)[:N]

第2种方法是给用户u推荐物品i上最热门的标签;item_tags[i][b]为物品i被打上标签b的次数,

def RecommendItemPopularTags(user, item, item_tags, N):
    return sorted(item_tags[item].items(),key=lambda a:a[1],reverse=True)[:N]

第3种方法是给用户u推荐他自己经常使用的标签;users_tags[u][b]为用户u经常使用的标签b的次数:

def RecommendUserPopularTags(user,item,user_tags,N):
    return sorted(user_tags[user].items(),key=lambda a:a[1],reverse=True)[:N]

第4种方法是前面两种方法的融合,通过一个系数将上面的推荐结果线性加权,然后生成最终的推荐结果:

def RecommendHybridPopularTags(user,item,user_tags,item_tags,alpha,N):
    max_user_tag_weight = max(user_tags[user].values())
    for tag,weight in user_tags[user].items():
        ret[tag] = (1-alpha)*weight / max_user_tag_weight

    max_item_tag_weight = max(item_tags[item].values())
    for tag,weight in item_tags[item].items():
        if tag not in ret:
            ret[tag] = alpha * weight / max_item_tag_weight
        else:
            ret[tag] += alpha*weight/max_item_tag_weight
    return sorted(ret.items(),key=lambda a:a[1],reverse=True)[:N]

在将两个列表线性相加时将两个列表按最大值做了归一化,好处是便于控制两个列表对最终结果的影响,不至于因为物品非常热门而淹没用户对推荐结果的影响,或因为用户非常活跃淹没物品对推荐结果的影响。

但是,上面基于统计用户常用标签和物品常用标签算法有一个缺点,对新用户或者不热门的物品很难有推荐结果。解决这一问题有两个思路:

  • 从物品的内容数据中抽取关键词作为标签。这方面的研究很多,特别是在上下文广告领域。
  • 针对有结果,但结果不太多的情况。对标签进行标签扩展。标签扩展的关键在于计算标签之间的相似度。

基于图的标签推荐算法

图模型可以用于标签推荐。

posted @ 2018-11-06 09:03  April15  阅读(785)  评论(0编辑  收藏  举报