推荐系统实践读书笔记-04利用用户标签数据

推荐系统的目的是联系用户的兴趣和物品,这种联系需要依赖不同的媒介。GroupLens在一篇文章中表示目前流行的推荐系统基本上通过3种方式联系用户兴趣和物品。如图4-1所示,第一种方式是利用用户喜欢过的物品,给用户推荐与他喜欢过的物品相似的物品,这就是前面提到的基于物品的算法。第二种方式是利用和用户兴趣相似的其他用户,给用户推荐那些和他们兴趣爱好相似的其他用户喜欢的物品,这是前面提到的基于用户的算法。除了这两种方法,第三种重要的方式是通过一些特征(feature)联系用户和物品,给用户推荐那些具有用户喜欢的特征的物品。这里的特征有不同的表现方式,比如可以表现为物品的属性集合(比如对于图书,属性集合包括作者、出版社、主题和关键词等),也可以表现为隐语义向量(latent factor vector),这可以通过前面提出的隐语义模型习得到。本章将讨论一种重要的特征表现方式——标签。


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

文章目录

  • 推荐系统实践读书笔记-04利用用户标签数据
    • 4.1 UGC 标签系统的代表应用
      • 4.1.1 Delicious
      • 4.1.2 CiteULike
      • 4.1.3 Last.fm
      • 4.1.4 豆瓣
      • 4.1.5 Hulu
    • 4.2 标签系统中的推荐问题
      • 4.2.1 用户为什么进行标注
      • 4.2.2 用户如何打标签
      • 4.2.3 用户打什么样的标签
    • 4.3 基于标签的推荐系统
      • 4.3.1 实验设置
      • 4.3.2 一个最简单的算法
      • 4.3.3 算法的改进
      • 4.3.4 基于图的推荐算法
      • 4.3.5 基于标签的推荐解释
    • 4.4 给用户推荐标签
      • 4.4.1 为什么要给用户推荐标签
      • 4.4.2 如何给用户推荐标签
      • 4.4.3 实验设置
      • 4.4.4 基于图的标签推荐算法
    • 4.5 扩展阅读

4.1 UGC 标签系统的代表应用

UGC标签系统是很多Web 2.0网站的必要组成部分,本节将讨论使用UGC标签系统的代表网站——UGC标签系统的鼻祖Delicious、论文书签网站CiteULike、音乐网站Last.fm、视频网站Hulu、书和电影评论网站豆瓣等。下面将分别介绍这些应用。

4.1.1 Delicious

Delicous可算是标签系统里的开山鼻祖,它允许用户给互联网上的每个网页打标签,从而通过标签重新组织整个互联网。图4-2是Delicious中被用户打上recommender、system标签最多的网页,这些网页反应了用户心目中和推荐系统最相关的网页。图4-3是Delicious中“豆瓣电台”这个网页被用户打的最多的标签,可以看到这些标签确实从各个角度准确地描述了“豆瓣电台”这个物品。

4.1.2 CiteULike

CiteULike是一个著名的论文书签网站,它允许研究人员提交或者收藏自己感兴趣的论文并且给论文打标签,从而帮助用户更好地发现和自己研究领域相关的优秀论文。我们知道,研究人员搜索自己研究领域内值得参考的论文是很费时费力的工作,而CiteULike通过群体智能,让每个研究人员对自己了解的论文进行标记,借此帮助其他研究人员更好更快地发现自己感兴趣的论文。图4-4展示了CiteULike中一篇有关推荐系统评测的文章以及用户给这篇文章打过最多的标签,可以发现,最多的两个标签是collaborative-filtering(协同过滤)和evaluate(评测),确实比较准确地反应了这篇论文的主要内容。

4.1.3 Last.fm

Last.fm是一家著名的音乐网站,它通过分析用户的听歌行为预测用户对音乐的兴趣,从而给用户推荐个性化的音乐。作为多媒体,音乐不像文本那样可以很容易地分析内容信息。为了在不进行复杂音频分析的情况下获得音乐的内容信息,Last.fm引入了UGC标签系统,让用户用标签标记音乐和歌手。图4-5展示了披头士乐队在Last.fm中的标签云(tag cloud)。从这个标签云可以看到,披头士应该是一个英国(british)的传统摇滚乐队(classic rock),流行于20世纪60年代(60s)。

4.1.4 豆瓣

豆瓣是中国著名的评论和社交网站,同时也是中国个性化推荐领域的领军企业之一。豆瓣在个性化推荐领域进行了广泛尝试,标签系统也是其尝试的领域之一。它允许用户对图书和电影打标签,借此获得图书和电影的内容信息和语义,并用这种信息改善推荐效果。图4-6展示了《数据挖掘导论》在豆瓣被用户打标签的情况。如图所示,最多的几个标签分别是数据挖掘、计算机、计算机科学、数据分析、IT数据分析等。这些标签准确地概括了这本书的内容信息。

4.1.5 Hulu

Hulu是美国著名的视频网站。视频作为一种最为复杂的多媒体,获取它的内容信息是最困难的,因此Hulu也引入了用户标签系统来让用户对电视剧和电影进行标记。图4-7展示了美剧《豪斯医生》的常用标签,可以看到,Hulu对标签做了分类并展示了每一类最热门的标签。从类型(Genre)看,《豪斯医生》是一部医学片(medical);从时间看,这部剧开始于2004年;从人物看,这部美剧的主演是hugh laurie,他在剧中饰演的人物是greg house。

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

关于标签系统的作用, GroupLen的Shilads Wieland Sen在MoveLens电影推荐系统上做了更为深入的、基于问卷调查的研究。在博士论文中,他探讨了标签系统的不同作用,以及每种作用能够影响多大的人群,如下所示。

 表达 标签系统帮助我表达对物品的看法。(30%的用户同意。)
 组织 打标签帮助我组织我喜欢的电影。(23%的用户同意。)
 学习 打标签帮助我增加对电影的了解。(27%的用户同意。)
 发现 标签系统使我更容易发现喜欢的电影。(19%的用户同意。)
 决策 标签系统帮助我判定是否看某一部电影。(14%的用户同意。)
上面的研究证明,标签系统确实能够帮助用户发现可能喜欢的电影,而这正是个性化推荐系统的使命之一。因此,本章将对如何发挥标签在个性化推荐中的作用进行深入探讨。

4.2 标签系统中的推荐问题

打标签作为一种重要的用户行为,蕴含了很多用户兴趣信息,因此深入研究和利用用户打标签的行为可以很好地指导我们改进个性化推荐系统的推荐质量。同时,标签的表示形式非常简单,便于很多算法处理。
标签系统中的推荐问题主要有以下两个。
 如何利用用户打标签的行为为其推荐物品(基于标签的推荐)?
 如何在用户给物品打标签时为其推荐适合该物品的标签(标签推荐)?为了研究上面的两个问题,我们首先需要解答下面3个问题。
 用户为什么要打标签?
 用户怎么打标签?
 用户打什么样的标签?

4.2.1 用户为什么进行标注

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

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

4.2.2 用户如何打标签

在互联网中,尽管每个用户的行为看起来是随机的,但其实这些表面随机的行为背后蕴含着很多规律。这一节将通过研究Delicious数据集总结用户标注行为中的一些统计规律。

德国研究人员公布过一个很庞大的Delicious数据集,该数据集包含2003年9月到2007年12月Delicious用户4.2亿条标签行为记录。本节选用该数据集2007年一个月的数据进行分析,对该数据集的统计特性进行研究。

前面几章都提到,用户行为数据集中用户活跃度和物品流行度的分布都遵循长尾分布(Power Law分布)。因此,我们首先看一下标签流行度的分布。我们定义的一个标签被一个用户使用在一个物品上,它的流行度就加一。如下代码计算了每个标签的流行度。

def TagPopularity(records): tagfreq = dict() for user,item,tag in records: if tag not in tagfreq: tagfreq[tag] = 1 else: tagfreq[tag] += 1 return tagfreq

如图4-8所示,横坐标是流行度k,纵坐标是数据集中流行度为k的标签总数 n k( ) 。标签的流行度分布也呈现非常典型的长尾分布,它的双对数曲线几乎是一条直线。

4.2.3 用户打什么样的标签

在用户看到一个物品时,我们希望他打的标签是能够准确描述物品内容属性的关键词,但用户往往不是按照我们的想法操作,而是可能会给物品打上各种各样奇奇怪怪的标签。
Scott A. Golder 总结了Delicious上的标签,将它们分为如下几类。
 表明物品是什么 比如是一只鸟,就会有“鸟”这个词的标签;是豆瓣的首页,就有一个标签叫“豆瓣”;是乔布斯的首页,就会有个标签叫“乔布斯”。
 表明物品的种类 比如在Delicious的书签中,表示一个网页类别的标签包括 article(文章)、blog(博客)、 book(图书)等。
 表明谁拥有物品 比如很多博客的标签中会包括博客的作者等信息。
 表达用户的观点 比如用户认为网页很有趣,就会打上标签funny(有趣),认为很无聊,就会打上标签boring(无聊)。
 用户相关的标签 比如 my favorite(我最喜欢的)、my comment(我的评论)等。
 用户的任务 比如 to read(即将阅读)、job search(找工作)等。

很多不同的网站也设计了自己的标签分类系统,比如Hulu对视频的标签就做了分类。图4-9是著名的美剧《豪斯医生》的标签。可以看到,Hulu将电视剧的标签分成了如下几类。

 类型(Genre) 主要表示这个电视剧的类别,比如《豪斯医生》属于医学剧情片(medical drama)。
 时间(Time) 主要包括电视剧发布的时间,有时也包括电视剧中事件发生的时间,比如20世纪90年代。
 人物(People) 主要包括电视剧的导演、演员和剧中重要人物等。
 地点(Place) 剧情发生的地点,或者视频拍摄的地点等。
 语言(Language) 这部电视剧使用的语言。
 奖项(Awards) 这部电视剧获得的相关奖项。
 其他(Details) 包含不能归类到上面各类中的其他所有标签。

4.3 基于标签的推荐系统

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

豆瓣很好地利用了标签数据,它将标签系统融入到了整个产品线中。首先,在每本书的页面上,豆瓣都提供了一个叫做“豆瓣成员常用标签”的应用,它给出了这本书上用户最常打的标签。同时,在用户给书做评价时,豆瓣也会让用户给图书打标签。最后,在最终的个性化推荐结果里,豆瓣利用标签将用户的推荐结果做了聚类,显示了对不同标签下用户的推荐结果,从而增加了推荐的多样性和可解释性。

一个用户标签行为的数据集一般由一个三元组的集合表示,其中记录(u, i, b) 表示用户u给物品i打上了标签b。当然,用户的真实标签行为数据远远比三元组表示的要复杂,比如用户打标签的时间、用户的属性数据、物品的属性数据等。但是本章为了集中讨论标签数据,只考虑上面定义的三元组形式的数据,即用户的每一次打标签行为都用一个三元组(用户、物品、标签)表示。

本章将采用两个不同的数据集评测基于标签的物品推荐算法。一个是Delicious数据集,另一个是CiteULike数据集。Delicious数据集中包含用户对网页的标签记录。它每一行由4部分组成,即时间、用户ID、网页URL、标签。本章只抽取了其中用户对一些著名博客网站网页(Wordpress、BlogSpot、TechCrunch)的标签记录。CiteULike数据集包含用户对论文的标签记录,它每行也由4部分组成,即物品ID、用户ID、时间、标签,本章选取了其中稠密的部分。最终两个数据集的统计信息如表4-1所示,其最热门的20个标签见表4-2。

4.3.1 实验设置

本节将数据集随机分成10份。这里分割的键值是用户和物品,不包括标签。也就是说,用户对物品的多个标签记录要么都被分进训练集,要么都被分进测试集,不会一部分在训练集,另一部分在测试集中。然后,我们挑选1份作为测试集,剩下的9份作为训练集,通过学习训练集中的用户标签数据预测测试集上用户会给什么物品打标签。对于用户u,令R(u)为给用户u的长度为N的推荐列表,里面包含我们认为用户会打标签的物品。令T(u)是测试集中用户u实际上打过标签的物品集合。然后,我们利用准确率(precision)和召回率(recall)评测个性化推荐算法的精度。

将上面的实验进行10次,每次选择不同的测试集,然后将每次实验的准确率和召回率的平均值作为最终的评测结果。
为了全面评测个性化推荐的性能,我们同时评测了推荐结果的覆盖率(coverage)、多样性(diversity)和新颖度。
覆盖率的计算公式如下

关于多样性,我们在第1章中讨论过,多样性的定义取决于相似度的定义。在本章中,我们用物品标签向量的余弦相似度度量物品之间的相似度。对于每个物品i,item_tags[i]存储了物品i的标签向量,其中item_tags[i][b]是对物品i打标签b的次数,那么物品i和j的余弦相似度可以通过如下程序计算。

def CosineSim(item_tags, i, j): ret = 0 for b,wib in item_tags[i].items(): if b in item_tags[j]: ret += wib * item_tags[j][b] ni = 0 nj = 0 for b, w in item_tags[i].items(): ni += w * w for b, w in item_tags[j].items(): nj += w * w if ret == 0: return 0 return ret / math.sqrt(ni * nj)

在得到物品之间的相似度度量后,我们通过如下公式计算一个推荐列表的多样性。

如果用程序实现,代码如下:

def Diversity(item_tags, recommend_items): ret = 0 n = 0 for i in recommend_items.keys(): for j in recommend_items.keys(): if i == j: continue ret += CosineSim(item_tags, i, j) n += 1 return ret / (n * 1.0)

推荐系统的多样性为所有用户推荐列表多样性的平均值。

至于推荐结果的新颖性,我们简单地用推荐结果的平均热门程度(AveragePopularity)度量。对于物品i,定义它的流行度item_pop(i)为给这个物品打过标签的用户数。而对推荐系统,我们定义它的平均热门度如下:

4.3.2 一个最简单的算法

拿到了用户标签行为数据,相信大家都可以想到一个最简单的个性化推荐算法。这个算法的描述如下所示。
 统计每个用户最常用的标签。
 对于每个标签,统计被打过这个标签次数最多的物品。
 对于一个用户,首先找到他常用的标签,然后找到具有这些标签的最热门物品推荐给这个用户。
对于上面的算法,用户u对物品i的兴趣公式如下:

这里,B(u)是用户u打过的标签集合,B(i)是物品i被打过的标签集合,nu,b是用户u打过标签b的次数,nb,i是物品i被打过标签b的次数。本章用SimpleTagBased标记这个算法。
在Python中,我们遵循如下约定:
 用 records 存储标签数据的三元组,其中records[i] = [user, item, tag];
 用 user_tags 存储nu,b,其中user_tags[u][b] = nu,b;
 用 tag_items存储nb,i,其中tag_items[b][i] = nb,i。
如下程序可以从records中统计出user_tags和tag_items:

def InitStat(records): user_tags = dict() tag_items = dict() user_items = dict() for user, item, tag in records.items(): addValueToMat(user_tags, user, tag, 1) addValueToMat(tag_items, tag, item, 1) addValueToMat(user_items, user, item, 1)

统计出user_tags和tag_items之后,我们可以通过如下程序对用户进行个性化推荐:

def Recommend(user): recommend_items = dict() tagged_items = user_items[user] for tag, wut in user_tags[user].items(): for item, wti in tag_items[tag].items(): #if items have been tagged, do not recommend them if item in tagged_items: continue if item not in recommend_items: recommend_items[item] = wut * wti else: recommend_items[item] += wut * wti return recommend_items

我们在Delicious数据集上对上面的算法进行评测,结果如表4-3所示。

4.3.3 算法的改进

再来回顾一下上面提出的简单算法,该算法通过如下公式预测用户u对物品i的兴趣:

仔细研究上面的公式可以发现很多缺点,下面我们逐条分析该算法的缺点并提出改进意见。
1. TF-IDF
前面这个公式倾向于给热门标签对应的热门物品很大的权重,因此会造成推荐热门的物品给用户,从而降低推荐结果的新颖性。另外,这个公式利用用户的标签向量对用户兴趣建模,其中每个标签都是用户使用过的标签,而标签的权重是用户使用该标签的次数。这种建模方法的缺点是给热门标签过大的权重,从而不能反应用户个性化的兴趣。这里我们可以借鉴TF-IDF的思想,对这一公式进行改进:

这里, nb(u) 记录了标签b被多少个不同的用户使用过。这个算法记为TagBasedTFIDF。
表4-4给出了TagBasedTFIDF在Delicious和CiteULike两个数据集上的离线实验性能。和表4-3的实验结果相对比,可以看到该算法在所有指标上相比SimpleTagBased算法都有提高。

同理,我们也可以借鉴TF-IDF的思想对热门物品进行惩罚,从而得到如下公式:

其中, ni(u) 记录了物品i被多少个不同的用户打过标签。这个算法记为TagBasedTFIDF++。 表4-5展示了TagBasedTFIDF++算法的离线实验性能。和TagBasedTFIDF算法相比,除了多样性有所下降,其他指标都有明显提高。这一结果表明,适当惩罚热门标签和热门物品,在增进推荐结果个性化的同时并不会降低推荐结果的离线精度。

2. 数据稀疏性
在前面的算法中,用户兴趣和物品的联系是通过B(u) ∩B(i) 中的标签建立的。但是,对于新用户或者新物品,这个集合(B(u)∩B(i))中的标签数量会很少。为了提高推荐的准确率,我们可能要对标签集合做扩展,比如若用户曾经用过“推荐系统”这个标签,我们可以将这个标签的相似标签也加入到用户标签集合中,比如“个性化”、“协同过滤”等标签。

进行标签扩展有很多方法,其中常用的有话题模型(topic model),不过这里遵循简单的原则介绍一种基于邻域的方法.
标签扩展的本质是对每个标签找到和它相似的标签,也就是计算标签之间的相似度。最简单的相似度可以是同义词。如果有一个同义词词典,就可以根据这个词典进行标签扩展。如果没有这个词典,我们可以从数据中统计出标签的相似度。

如果认为同一个物品上的不同标签具有某种相似度,那么当两个标签同时出现在很多物品的标签集合中时,我们就可以认为这两个标签具有较大的相似度。对于标签b,令N(b)为有标签b的物品的集合,n_{b,i}为给物品i打上标签b的用户数,我们可以通过如下余弦相似度公式计算标签b和标签b’的相似度:

表4-6展示了利用上述公式计算出的、CiteULike数据集中recommender_system标签的相关标签。可以看到,相关标签列表中第一个词是该标签的复数形式,下面的标签包含该词的缩写recsys、collaborative_filter(协同过滤),都是和recommender_system非常相关的一些标签。同样,表4-7展示了利用Delicious数据集计算的和标签google相关的标签。如表所示,这些相关标签包含诸如search、indexing这些和谷歌的业务非常相关的标签。


为了验证进行标签扩展是否能够提高推荐系统的性能,本节同样进行了实验。对于曾经打过的标签数少于20的用户,我们找到其所打标签的相关标签,然后将这些标签聚合排序,将排序结果中前20个标签作为用户相关的标签。表4-8展示了考虑标签扩展后的推荐算法性能。和表4-3相比,进行标签扩展确实能够提高基于标签的物品推荐的准确率和召回率,但可能会稍微降低推荐结果的覆盖率和新颖度。


3. 标签清理
不是所有标签都能反应用户的兴趣。比如,在一个视频网站中,用户可能对一个视频打了一个表示情绪的标签,比如“不好笑”,但我们不能因此认为用户对“不好笑”有兴趣,并且给用户推荐其他具有“不好笑”这个标签的视频。相反,如果用户对视频打过“成龙”这个标签,我们可以据此认为用户对成龙的电影感兴趣,从而给用户推荐成龙其他的电影。同时,标签系统里经常出现词形不同、词义相同的标签,比如recommender system和recommendation engine就是两个同义词。

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

一般来说有如下标签清理方法:
 去除词频很高的停止词;
 去除因词根不同造成的同义词,比如 recommender system和recommendation system;
 去除因分隔符造成的同义词,比如 collaborative_filtering和collaborative-filtering。

为了控制标签的质量,很多网站也采用了让用户进行反馈的思想,即让用户告诉系统某个标签是否合适。MovieLens在实验系统中就采用了这种方法。关于这方面的研究可以参考GroupLens的Shilad Wieland Sen同学的博士论文。此外,电影推荐网站Jinni也采用了这种方式(如图4-10所示)。当然,Jinni不属于UGC的标签系统,它给电影的标签是专家赋予的,因此它让用户对标签进行反馈其实是想融合专家和广大用户的知识。

4.3.4 基于图的推荐算法

前面讨论的简单算法很容易懂,也容易实现,但缺点是不够系统化和理论化。因此,在这一节中我们主要讨论如何利用图模型做基于标签数据的个性化推荐。

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

图4-11是一个简单的用户—物品—标签图的例子。该图包含3个用户(A、B、C)、3个物品(a、 b、c)和3个标签(1、2、3)。
在定义出用户—物品—标签图后,我们可以用第2章提到的PersonalRank算法计算所有物品节点相对于当前用户节点在图上的相关性,然后按照相关性从大到小的排序,给用户推荐排名最高的N个物品。

用图模型解释前面的简单算法
在介绍了图模型后,我们可以基于图模型重新思考前面提到的简单算法。在那个算法中,用户对物品的兴趣公式如下:

这个公式假定用户对物品的兴趣通过标签传递,因此这个公式可以通过一个比本节前面介绍的图更简单的图建模(记为SimpleTagGraph)。给定用户标签行为记录(u,i,b),SimpleTagGraph会增加两条有向边,一条由用户节点v(u)指向标签节点v(b),另一条由标签节点v(b)指向物品节点v(i)。从这个定义可以看到,SimpleTagGraph相对于前面提到用户—物品—标签图少了用户节点和物品节点之间的边。

图4-12就是一个简单的SimpleTagGraph例子。在构建了SimpleTagGraph后,利用前面的PersonalRank算法,令K = 1,并给出不同边权重的定义,就等价于前面提出的简单推荐算法。

4.3.5 基于标签的推荐解释

基于标签的推荐其最大好处是可以利用标签做推荐解释,这方面的代表性应用是豆瓣的个性化推荐系统。图4-13展示了豆瓣读书的个性化推荐界面。

如图4-13所示,豆瓣读书推荐结果包括两部分。上面是一个标签云,表示用户的兴趣分布,标签的尺寸越大,表示用户对这个标签相关的图书越感兴趣。从图中上方的标签云可以看到,豆瓣认为我对“编程”、“机器学习”、“软件开发”感兴趣,这是因为我看了很多IT技术方面的图书,豆瓣认为我对“东野圭吾”感兴趣,是因为我看了好几本他的侦探小说,同时因为我对人文学科比较感兴趣,所以豆瓣认为我对“传记”、“文化”比较感兴趣。单击标签云中的每一个标签,都可以在标签云下方得到和这个标签相关的图书推荐,比如图 4-13界面标签云下面就展示了机器学习相关的图书推荐。

豆瓣这样组织推荐结果页面有很多好处,首先是提高了推荐结果的多样性。我们知道,一个用户的兴趣在长时间内是很广泛的,但在某一天却比较具体。因此,我们如果想在某一天击中用户当天的兴趣,是非常困难的。而豆瓣通过标签云,展示了用户的所有兴趣,然后让用户自己根据他今天的兴趣选择相关的标签,得到推荐结果,从而极大地提高了推荐结果的多样性,使得推荐结果更容易满足用户多样的兴趣。

同时,标签云也提供了推荐解释功能。用户通过这个界面可以知道豆瓣给自己推荐的每一本书都是基于它认为自己对某个标签感兴趣。而对于每个标签,用户总能通过回忆自己之前的行为知道自己是否真的对这个标签感兴趣。

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

GroupLens的研究人员Jesse Vig对基于标签的解释进行了深入研究。和4.3.2节提出的算法类似,Jesse Vig将用户和物品之间的关系变成了用户对标签的兴趣(tag preference)和标签与物品的相关度(tag relevance),然后作者用同一种推荐算法给用户推荐物品,但设计了4种标签解释的展示界面。

 RelSort 对推荐物品做解释时使用的是用户以前使用过且物品上有的标签,给出了用户对标签的兴趣和标签与物品的相关度,但标签按照和物品的相关度排序。
 PrefSort 对推荐物品做解释时使用的是用户以前使用过且物品上有的标签,给出了用户对标签的兴趣和标签与物品的相关度,但标签按照用户的兴趣程度排序。
 RelOnly 对推荐物品做解释时使用的是用户以前使用过且物品上有的标签,给出了标签与物品的相关度,且标签按照和物品的相关度排序。
 PrefOnly 对推荐物品做解释时使用的是用户以前使用过且物品上有的标签,给出了用户对标签的兴趣程度,且标签按照用户的兴趣程度排序

然后,作者对用户设计了3种调查问卷。首先是关于推荐解释的调查问卷,作者问了如下3个问题:

 推荐解释帮助我理解这部电影为什么会被推荐给我:对于这个问题用户认为RelSort> PrefOnly>=PrefSort>RelOnly。
 推荐解释帮助我判定是否喜欢推荐的电影:对于这个问题用户认为RelSort>PrefSort> PrefOnly>RelOnly。
 推荐解释帮助我判定观看这部电影是否符合我现在的兴趣:对于这个问题用户认为RelSort>PrefSort>RelOnly >PrefOnly。

然后,作者调查了用户对不同类型标签的看法。作者将标签分为主观类(比如对电影的看法,如表4-9所示)和客观类(比如对电影内容的描述,如表4-10所示)。作者对每种类型的标签同样问了上面3个问题。

 这个标签帮助我理解这部电影为什么会被推荐给我:用户认为客观类标签优于主观类标签。
 这个标签帮助我判定是否喜欢推荐的电影:用户认为客观类标签优于主观类标签。
 这个标签帮助我判定观看这部电影是否符合我现在的兴趣:用户认为客观类标签优于主观类标签。

从上面的结果可以发现,客观事实类的标签优于主观感受类标签。
最后,作者询问了用户对4种不同推荐解释界面的总体满意度,结果显示PrefOnly > RelSort > PrefSort > RelOnly。


总结问卷调查的结果,作者得出了以下结论:
 用户对标签的兴趣对帮助用户理解为什么给他推荐某个物品更有帮助;
 用户对标签的兴趣和物品标签相关度对于帮助用户判定自己是否喜欢被推荐物品具有同样的作用;
 物品标签相关度对于帮助用户判定被推荐物品是否符合他当前的兴趣更有帮助;
 客观事实类标签相比主观感受类标签对用户更有作用

4.4 给用户推荐标签

当用户浏览某个物品时,标签系统非常希望用户能够给这个物品打上高质量的标签,这样才能促进标签系统的良性循环。因此,很多标签系统都设计了标签推荐模块给用户推荐标签。图4-14展示了音乐网站Last.fm和豆瓣的标签推荐系统。

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

在讨论如何给用户推荐标签之前,首先需要了解为什么要给用户推荐标签。一般认为,给用户推荐标签有以下好处。

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

4.4.2 如何给用户推荐标签

用户u给物品i打标签时,我们有很多方法可以给用户推荐和物品i相关的标签。比较简单的方法有4种。
第0种方法就是给用户u推荐整个系统里最热门的标签(这里将这个算法称为PopularTags)之所以称为第0种,是因为这个算法太简单了,以至于不能称为一种标签推荐算法。令tags[b]为标签b的热门程度,那么这个算法的实现如下:

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

第1种方法就是给用户u推荐物品i上最热门的标签(这里将这个算法称为ItemPopularTags)。令item_tags[i][b]为物品i被打上标签b的次数,那么这个算法的实现很简单,具体如下所示:

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

第2种方法是给用户u推荐他自己经常使用的标签(这里将这个算法称为UserPopularTags)。令user_tags[u][b]为用户u使用标签b的次数,那么这个算法的实现如下所示:

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

第3种算法是前面两种的融合(这里记为HybridPopularTags),该方法通过一个系数将上面的推荐结果线性加权,然后生成最终的推荐结果。这个算法的实现代码如下:

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[user].items(), key=itemgetter(1), reverse=True)[0:N]

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

4.4.3 实验设置

和前面的实验一样,我们用同样的方法将数据集按照9∶1分成训练集和测试集,然后通过训练集学习用户标注的模型。需要注意的是,这里切分数据集不再是以user、item为主键,而是以user、item、tag为主键。为了更好的理解如何切分数据集,请参考下面的Python代码:

def SplitData(records, train, test): for user,item, tag in records: if random.randint(1,10) == 1: test.append([user,item,tag]) else: train.append([user,item,tag]) return [train, test]

对于测试集中的每一个用户物品对(u,i),我们都会推荐N个标签给用户u作参考。令R(u,i)为我们给用户u推荐的应该在物品i上打的标签集合,令T(u,i)为用户u实际给物品i打的标签的集合,我们可以利用准确率和召回率评测标签推荐的精度:

实验结果
表4-11列出了PopularTags、UserPopularTags、ItemPopularTags 3种算法在N = 10 时的准确率和召回率。

如表中结果所示,ItemPopularTags具有最好的准确率和召回率,这一点和直观想法是符合的。因为用户的兴趣是广泛的,假设用户对编程和武侠小说有兴趣,那么用户在给一本武侠小说打标签时,肯定不会参考自己对编程书打的标签,而会更多地参考关于武侠小说的常用标签。因此ItemPopularTags肯定比UserPopularTags的精度要高。

下面来看一下HybridPopularTags算法,表4-12给出了HybridPopularTags算法在不同线性融合系数α下的准确率和召回率。


如表4-12所示,在α=0.8的时候,HybridPopularTags取得了最好的准确度(准确率=25.15%,召回率=68.30%)。而且这个精度超过了单独的ItemPopularTags和UserPopularTags算法的精度。考虑到近70%的精度已经很高了,因此很多应用在给用户推荐标签时会直接给出用户最常用的标签,以及物品最经常被打的标签。比如豆瓣(如图4-15所示),在我浏览《MongoDB权威指南》一书时,它给我推荐的标签分为两类。一类是我的标签,即我之前常用的标签,可以看到这一类中包含诸如历史、传记等和MongoDB毫无关系的标签。另一类是常用标签,即别的用户给MongoDB打的最多的标签,可以看到这里面所有的标签都是和MongoDB相关的。

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

第一个思路是从物品的内容数据中抽取关键词作为标签。这方面的研究很多,特别是在上下文广告领域。本书3.4节也介绍了生成关键词向量的一些方法。

第二个思路是针对有结果,但结果不太多的情况。比如《MongoDB权威指南》一书只有一个用户曾经给它打过一个标签nosql,这个时刻可以做一些关键词扩展,加入一些和nosql相关的标签,比如数据库、编程等。实现标签扩展的关键就是计算标签之间的相似度。关于这一点,4.3.3节已经进行了深入探讨。

4.4.4 基于图的标签推荐算法

图模型同样可以用于标签推荐。在根据用户打标签的行为生成图之后(如图4-11所示),我们可以利用PersonalRank算法进行排名。但这次遇到的问题和之前不同。这次的问题是,当用户u遇到物品i时,会给物品i打什么样的标签。因此,我们可以重新定义顶点的启动概率,如下所示:

也就是说,只有用户u和物品i对应的顶点有非0的启动概率,而其他顶点的启动概率都为0。在上面的定义中,v(u)和v(i)的启动概率并不相同,v(u)的启动概率是a,而v(i)的启动概率是1-a。参数α可以通过离线实验选择

4.5 扩展阅读

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

关于标签的问题,最近几年在学术界获得了广泛关注。ECML/PKDD在2008年曾经推出过基于标签的推荐系统比赛① 。在这些研究中涌现了很多新的方法,比如张量分解② (tensor factorization)、基于LDA的算法③、基于图的算法④等。不过这些算法很多具有较高的复杂度,在实际系统中应用起来还有很多实际的困难需要解决。

GroupLens的研究人员给MovieLens系统做了很多标签方面的工作。Shilad Sen在论文中研究了如何利用标签联系用户和物品并给用户进行个性化电影推荐。Jesse Vig在论文①中研究了如何利用标签进行推荐解释,他将用户和物品之间的关系转化为用户对标签的兴趣(tag preference)以及标签和物品的相关度(tag relevance)两种因素。同时他们研究了如何对标签进行清理,以及如何选择合适的标签进行解释。

推荐系统实践读书笔记-04利用用户标签数据相关推荐

  1. 推荐系统实践读书笔记-02利用用户行为数据

    推荐系统实践读书笔记-02利用用户行为数据 为了让推荐结果符合用户口味,我们需要深入了解用户.如何才能了解一个人呢?<论语·公冶长>中说"听其言,观其行",也就是说可以 ...

  2. 【读书笔记】推荐系统实践·第四章·利用用户标签数据

    代码方面,主要实现了4.3和4.2.2的一个验证统计,4.4的代码本来准备写一下的,后来因为杂碎的统计工作太多就放弃了.代码和笔记的word版放在https://github.com/littleli ...

  3. 推荐系统实践读书笔记-05利用上下文信息

    推荐系统实践读书笔记-05利用上下文信息 本章之前提到的推荐系统算法主要集中研究了如何联系用户兴趣和物品,将最符合用户兴趣的物品推荐给用户,但这些算法都忽略了一点,就是用户所处的上下文(context ...

  4. 推荐系统实践读书笔记-06利用社交网络数据

    推荐系统实践读书笔记-06利用社交网络数据 自从搜索引擎谷歌诞生后,大家都在讨论互联网的下一个金矿是什么.现在,几乎所有的人都认为那就是社交网络.根据尼尔森2010年的报告,用户在互联网上22%的时间 ...

  5. 推荐系统读书笔记(二)利用用户行为数据

    2.1 用户行为数据简介 显性反馈行为:用户明确表示对物品喜好的行为.评分.喜欢.不喜欢. 隐性反馈行为:不能明确反应用户喜好的行为.比如页面浏览.   显性反馈数据 隐性反馈数据 用户兴趣 明确 不 ...

  6. 《推荐系统实践》第二章 利用用户行为数据

    2.1 用户行为数据简介 在电子商务网站中行为主要包括网页浏览.购买.点击.评分和评论等. 用户行为在个性化推荐系统中一般分两种--显性反馈行为(explicit feedback)和隐性反馈行为(i ...

  7. 推荐系统实践读书笔记

    最近大概复习了一下这本书,了解了较早的推荐系统的一些方法,记录如下,以便大家对本书内容有个快速地了解.略去了第一张,详细的代码和细节可以参考其他博客.需要关注的地方直接标出了页码. 书里面的代码不是很 ...

  8. 《推荐系统实践》样章:如何利用用户标签数据

    <推荐系统实践>样章:如何利用用户标签数据 推荐系统的目的是联系用户的兴趣和物品,这种联系需要依赖于不同的媒介.GroupLens在文章1中认为目前流行的推荐系统基本上通过三种方式来联系用 ...

  9. 推荐系统实践读书笔记-01好的推荐系统

    推荐系统实践读书笔记-01好的推荐系统 在研究如何设计推荐系统前,了解什么是好的推荐系统至关重要.只有了解了优秀推荐系统的特征,我们才能在设计推荐系统时根据实际情况进行取舍.本章分3个步骤来回答这个问 ...

最新文章

  1. Ubuntu 14.04 64bit上curl-7.37源码包中的sample 源码示例研究
  2. MD5加密字符串并转化为base64(C#和PHP代码相同实现)
  3. Effective Java之返回零长度的数组或者集合,而不是null(四十三)
  4. 初探System.Threading.Channels
  5. C++设计模式之四 模板模式
  6. c++ udp多线程 例子_计算机网络知识梳理(4)——TCP/UDP、TCP三次握手与四次挥手...
  7. sql in里面可以放多少参数_如何从文本文件读入 SQL 参数
  8. 30秒,2种方法解决SQL Server的内存管理问题
  9. 如何用Html+css3写一个简单的网页
  10. 计算机绘图员 机械 实训二,计算机绘图员[机械]实训形考.doc
  11. java版b2b2c社交电商spring cloud分布式微服务(八)springboot整合mongodb
  12. 如何监控 Nginx?
  13. 软件著作权统计源程序量,统计php代码行数
  14. java 右对齐_字符串对齐器(左对齐、居中、右对齐)
  15. new InputStream().available()方法的讲解
  16. 液压齿轮泵的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  17. ios 裁剪圆形头像_iOS如何将图片裁剪成圆形
  18. Python基于WordCloud词云图的数据可视化分析 词云图的基本使用 政府工作报告分析
  19. 文章管理系统的系统分析与设
  20. python破解qq密码_央·python编程之QQ数据清洗

热门文章

  1. JavaMail:使用163,QQ和本地服务器邮件发送
  2. 强化学习:不用给AI一个支点,他也能想办法撬起地球
  3. 「docker实战篇」python的docker爬虫技术-安卓模拟器(二)
  4. CTF之旅WEB篇(3)--ezunser PHP反序列化
  5. 教室计算机广播控制,小学智能广播系统(模拟广播)系统解决方案
  6. 品牌出海是机遇也是挑战
  7. 原文 葛底斯堡宣言_如何有感情地背下葛底斯堡演说的全文?
  8. Vue实现京东登陆页面(仅实现部分功能)
  9. android中文首字母排序,Android 实现中文按拼音排序方法
  10. python if语句单行_单行的'if'/'for'语句是否使用Python样式好? - python