读书笔记--项亮《推荐系统实践》第六章

                                                                               第六章 利用社交网络数据

基于社交网络的推荐可以很好地模拟现实社会。在现实社会中,很多时候我们都是通过朋友获得推荐。调查显示好友的推荐对于增加用户对推荐结果的信任度非常重要。
本章将详细讨论如何利用社交网络数据给用户进行个性化推荐。本章不仅讨论如何利用社交网络给用户推荐物品,而且将讨论如何利用社交网络给用户推荐好友。

6.1 获取社交网络数据的途径

可以通过以下方式获得社交网络数据。

6.1.1 电子邮件

我们可以通过分析用户的联系人列表了解用户的好友信息,而且可以进一步通过研究两个用户之间的邮件往来频繁程度度量两个用户的熟悉程度。
不过,电子邮件是一个封闭的系统,一般的研究人员很难得到用户的联系人列表和用户之间的来往信件。所以对电子邮件中社交关系的研究集中在一些有大型电子邮件系统的公司中。
其实,如果我们获得了用户的邮箱,也可以通过邮箱后缀得到一定的社交关系信息。一般来说,邮箱名是name@xxx.xxx的格式。如果用户用的是公司邮箱,那么我们可以根据后缀知道哪些用户是同一家公司的。同一家公司的用户可能互相认识,因而我们也可以获得一种隐性的社交关系

6.1.2 用户注册信息

有些网站需要用户在注册时填写一些诸如公司、学校等信息(如图6-2所示)。有了这些信息后,我们就可以知道哪些用户曾经在同一家公司工作过,哪些用户曾经在同一个学校学习过。这也是一种隐性的社交网络数据

6.1.3 用户的位置数据

在网页上最容易拿到的用户位置信息就是IP地址。对于手机等移动设备,我们可以拿到更详细的GPS数据。位置信息也是一种反映用户社交关系的数据。一般来说,在给定位置信息后,可以通过查表知道用户访问时的地址。这种地址在某些时候不太精确,只能精确到城市级别,但在有些时候可以精确到学校里的某栋宿舍楼或者某家公司。

6.1.4 论坛和讨论组

6.1.5 即时聊天工具

通过联系人列表和分组信息,我们就可以知道用户的社交网络关系,而通过统计用户之间聊天的频繁程度,可以度量出用户之间的熟悉程度。
但是,即时聊天工具和电子邮件一样,也是一个封闭的系统,获取用户的即时聊天信息是非常困难的,这里面存在着很多隐私问题。

6.1.6 社交网站

上述各种获取用户社交关系的途径,要么就是因为隐私问题很难获取,要么就是虽然容易获取,但却都是隐性社交关系数据,很难推断出用户之间的显性社交关系。
但以Facebook和Twitter为代表的新一代社交网络突破了这个瓶颈。
以Facebook为代表的社交网络称为社交图谱(social graph),而以Twitter为代表的社交网络称为兴趣图谱(interest graph)。

6.2 社交网络数据简介

社交网络定义了用户之间的联系,因此可以用图定义社交网络。
我们用图G(V,E,w)定义一个社交网络,其中V是顶点集合,每个顶点代表一个用户,E是边集合,如果用户v a 和v b 有社交网络关系,那么就有一条边 e ( v a , v b ) 连接这两个用户,而 w ( v a , v b ) 定义了边的权重。
业界有两种著名的社交网络。一种以 Facebook 为代表,它的朋友关系是需要双向确认的,因此在这种社交网络上可以用无向边连接有社交网络关系的用户。另一种以 Twitter 为代表,它的朋友关系是单向的,因此可以用有向边代表这种社交网络上的用户关系。
对图 G 中的用户顶点 u ,定义 out(u) 为顶点 u 指向的顶点集合(如果套用微博中的术语,out(u) 就是用户 u 关注的用户集合),定义 in(u) 为指向顶点 u 的顶点集合(也就是关注用户 u 的用户集合)。

一般来说,有 3 种不同的社交网络数据。

  • 双向确认的社交网络数据:在以 Facebook 和人人网为代表的社交网络中,用户 A 和 B
    之间形成好友关系需要通过双方的确认。因此,这种社交网络一般可以通过无向图表示。
  • 单向关注的社交网络数据:在以 Twitter 和新浪微博为代表的社交网络中,用户 A 可以关注用户 B 而不需要得到用户 B
    的允许,因此这种社交网络中的用户关系是单向的,可以通过有向图表示。
  • 基于社区的社交网络数据:还有一种社交网络数据,用户之间并没有明确的关系,但是
    这种数据包含了用户属于不同社区的数据。比如豆瓣小组,属于同一个小组可能代表了
    用户兴趣的相似性。或者在论文数据集中,同一篇文章的不同作者也存在着一定的社交 关系。或者是在同一家公司工作的人,或是同一个学校毕业的人等。

社交网络数据中的长尾分布
和前面第 2 章提到的用户活跃度分布和物品流行度分布类似,社交网络中用户的入度( indegree )和出度( out degree )的分布也是满足长尾分布的。
用户的入度反映了用户的社会影响力(即所谓的粉丝数量)。用户的入度近似长尾分布,这说明在一个社交网络中影响力大的用户总是占少数。
而出度代表了一个用户关注的用户数,该图说明在一个社交网络中,关注很多人的用户占少数,而绝大多数用户只关注很少的人。

6.3 基于社交网络的推荐

很多网站都利用 Facebook 的社交网络数据给用户提供社会化推荐。利用社交网络中的好友信息进行推荐可以使推荐具有很好的可解释性。
社会化推荐之所以受到很多网站的重视,是缘于如下优点。

  • 好友推荐可以增加推荐的信任度:好友往往是用户最信任的。用户往往不一定信任计算机的智能,但会信任好朋友的推荐。
  • 社交网络可以解决冷启动问题:当一个新用户通过微博或者 Facebook
    账号登录网站时,我们可以从社交网站中获取用户的好友列表,然后给用户推荐好友在网站上喜欢的物品。从而我们可以在没有用户行为记录时就给用户提供较高质量的推荐结果,部分解决了推荐系统的冷启动问题。

社会化推荐存在的一些缺点:
很多时候并不一定能提高推荐算法的离线精度(准确率和召回率)。特别是在基于社交图谱数据的推荐系统中,因为用户的好友关系不是基于共同兴趣产生的,所以用户好友的兴趣往往和用户的兴趣并不一致。比如,我们和自己父母的兴趣往往就差别很大。

6.3.1 基于邻域的社会化推荐算法

给定一个社交网络和一份用户行为数据集。其中社交网络定义了用户之间的好友关系,而用户行为数据集定义了不同用户的历史行为和兴趣数据。
在推荐算法中考虑好友和用户的熟悉程度以及兴趣相似度,我们可以的得到用户 u 对物品 i 的兴趣 p ui:
在这里插入图片描述
其中 out(u) 是用户 u 的好友集合,如果用户 v 喜欢物品 i ,则 r vi =1 ,否则 r vi =0 。w uv 由两部分相似度构成,一部分是用户 u 和用户 v 的熟悉程度,另一部分是用户 u 和用户 v 的兴趣相似度。
用户 u 和用户 v 的熟悉程度( familiarity )描述了用户 u 和用户 v 在现实社会中的熟悉度。熟悉度可以用用户之间的共同好友比例来度量。也就是说如果用户 u 和用户 v 很熟悉,那么一般来说他们应该有很多共同的好友。
在这里插入图片描述
在度量用户相似度时还需要考虑兴趣相似度( similarity ),而兴趣相似度可以通过和 UserCF 类似的方法度量,即如果两个用户喜欢的物品集合重合度很高,两个用户的兴趣相似度很高。
在这里插入图片描述
其中 N(u) 是用户 u 喜欢的物品集合。
下面的代码实现社会化推荐的逻辑。在代码中, familiarity 存储了每个用户最熟悉的 K 个
好友和他们的熟悉程度, similarity 存储了和每个用户兴趣最相关的 K 好友和他们的兴趣相似度。 train 记录了每个用户的行为记录,其中 train[u] 记录了用户 u 喜欢的物品列表。

def Recommend(uid, familiarity, similarity, train):
		rank = dict()
		interacted_items = train[uid]
		for fid,fw in familiarity[uid]:
				for item,pw in train[fid]:
				# if user has already know the item
				# do not recommend it
				if item in interacted_items:
						continue
				addToDict(rank, item, fw * pw)
		for vid,sw in similarity[uid]:
				for item,pw in train[vid]:
						if item in interacted_items:
								continue
						addToDict(rank, item, sw * pw)
		return rank

6.3.2 基于图的社会化推荐算法

图模型的优点是可以将各种数据和关系都表示到图上去。
在社交网站中存在两种关系,一种是用户对物品的兴趣关系,一种是用户之间的社交网络关系。本节主要讨论如何将这两种关系建立到图模型中,从而实现对用户的个性化推荐。
用户的社交网络可以表示为社交网络图,用户对物品的行为可以表示为用户物品二分图,而这两种图可以结合成一个图。
下图是一个结合了社交网络图和用户物品二分图的例子。
在这里插入图片描述
在定义完图中的顶点和边后,需要定义边的权重。其中用户和用户之间边的权重可以定义为用户之间相似度的α倍(包括熟悉程度和兴趣相似度),而用户和物品之间的权重可以定义为用户对物品喜欢程度的β倍。α和β需要根据应用的需求确定。如果我们希望用户好友的行为对推荐结果产生比较大的影响,那么就可以选择比较大的α。相反,如果我们希望用户的历史行为对推荐结果产生比较大的影响,就可以选择比较大的β。
在定义完图中的顶点、边和边的权重后,我们就可以利用前面几章提到的 PersonalRank 图排序算法给每个用户生成推荐结果。

社群membership的社交关系:
如果要在前面提到的基于邻域的社会化推荐算法中考虑 membership 的社交关系,可以利用两个用户加入的社区重合度计算用户相似度,然后给用户推荐和他相似的用户喜欢的物品。
如下图所示,可以**加入一种节点表示社群(**最左边一列的节点),而如果用户属于某一社群,图中就有一条边联系用户对应的节点和社群对应的节点。在建立完图模型后,我们就可以通过前面提到的基于图的推荐算法(比如 PersonalRank )给用户推荐物品。
在这里插入图片描述

6.3.3 实际系统中的社会化推荐算法

6.3.1 节提出的基于邻域的社会化推荐算法看起来非常简单,但在实际系统中却是很难操作的,这主要是因为该算法需要拿到用户所有好友的历史行为数据,而这一操作在实际系统中是比较重的操作。

可替代方案1:使用ItemCF算法
ItemCF 算法只需要当前用户的历史行为数据和物品的相关表就可以生成推荐结果。对于物品数不是特别多的网站,可以很容易地将物品相关表缓存在内存中,因此查询相关物品的代价很低,所以 ItemCF 算法很容易在实际环境下实现。

可替代方案2:对基于邻域的方法进行改进
改进的方向有两种。
第一种方法治标不治本,简单地说,就是可以做两处截断。
第一处截断就是在拿用户好友集合时并不拿出用户所有的好友,而是只拿出和用户相似度最高的 N 个好友。这里 N 可以取一个比较小的数。从而给该用户做推荐时可以只查询 N 次用户历史行为接口。第二处截断,在查询每个用户的历史行为时,可以只返回用户最近 1 个月的行为,这样就可以在用户行为缓存中缓存更多用户的历史行为数据,从而加快查询用户历史行为接口的速度。

第二种方法需要重新设计数据库。
通过前面的分析可以发现,社会化推荐中关键的操作就是拿到用户所有好友的行为数据,然后通过一定的聚合展示给用户。如果对照一下微博,我们就可以发现微博中每个用户都有一个信息墙,这个墙上实时展示着用户关注的所有好友的动态。因此,如果能够实现这个信息墙,就能够实现社会化推荐算法。 Twitter 的解决方案是给每个用户维护一个消息队列( message queue ),当一个用户发表一条微博时,所有关注他的用户的消息队列中都会加入这条微博。这个实现的优点是用户获取信息墙时可以直接读消息队列,所以终端用户的读操作很快。不过这个实现也有缺点,当一个用户发表了一条微博,就会触发很多写操作,因为要更新所有关注他的用户的消息队列,特别是当一个人被很多人关注时,就会有大量的写操作。 Twitter 通过大量的缓存解决了这一问题。具体的细节可以参考 InfoQ 对 Twitter 架构的介绍。
如果将 Twitter 的架构搬到社会化推荐系统中,我们就可以按照如下方式设计系统:

  • 首先,为每个用户维护一个消息队列,用于存储他的推荐列表;
  • 当一个用户喜欢一个物品时,就将(物品 ID 、用户 ID 和时间)这条记录写入关注该用户的推荐列表消息队列中;
  • 当用户访问推荐系统时,读出他的推荐列表消息队列,对于这个消息队列中的每个物品,重新计算该物品的权重。计算权重时需要考虑物品在队列中出现的次数,物品对应的用户和当前用户的熟悉程度、物品的时间戳。同时,计算出每个物品被哪些好友喜欢过,用这些好友作为物品的推荐解释。

6.3.4 社会化推荐系统和协同过滤推荐系统

社会化推荐系统的效果往往很难通过离线实验评测,因为社会化推荐的优势不在于增加预测准确度,而是在于通过用户的好友增加用户对推荐结果的信任度,从而让用户单击那些很冷门的推荐结果。

6.3.5 信息流推荐

信息流的个性化推荐要解决的问题就是如何进一步帮助用户从信息墙上挑选有用的信息,尽最大可能过滤掉垃圾信息。
目前最流行的信息流推荐算法是 Facebook 的 EdgeRank ,该算法综合考虑了信息流中每个会话的时间、长度与用户兴趣的相似度。Facebook 将其他用户对当前用户信息流中的会话产生过行为的行为称为 edge ,而一条会话的权重定义为:
在这里插入图片描述
其中:

  • u e 指产生行为的用户和当前用户的相似度,这里的相似度主要是在社交网络图中的熟悉度;
  • w e 指行为的权重,这里的行为包括创建、评论、 like (喜欢)、打标签等,不同的行为有不同的权重。
  • d e 指时间衰减参数,越早的行为对权重的影响越低。

从上面的描述中可以得出如下结论:如果一个会话被你熟悉的好友最近产生过重要的行为,它就会有比较高的权重。

6.4 给用户推荐好友

好友推荐是社会化网站的重要应用之一。
好友推荐系统的目的是根据用户现有的好友、用户的行为记录给用户推荐新的好友,从而增加整个社交网络的稠密程度和社交网站用户的活跃度。
好友推荐算法在社交网络上被称为链接预测( link prediction )。本章我们将介绍其中一些比较直观和简单的算法。

6.4.1 基于内容的匹配

我们可以给用户推荐和他们有相似内容属性的用户作为好友。下面给出了常用的内容属性。

  • 用户人口统计学属性,包括年龄、性别、职业、毕业学校和工作单位等。
  • 用户的兴趣,包括用户喜欢的物品和发布过的言论等。
  • 用户的位置信息,包括用户的住址、 IP 地址和邮编等。

利用内容信息计算用户的相似度和我们前面讨论的利用内容信息计算物品的相似度类似。

6.4.2 基于共同兴趣的好友推荐

在 Twitter 和微博为代表的以兴趣图谱为主的社交网络中需要给用户推荐和他有共同兴趣的其他用户作为好友。
此外,也可以根据用户在社交网络中的发言提取用户的兴趣标签,来计算用户的兴趣相似度。

6.4.3 基于社交网络图的好友推荐

在社交网站中,我们会获得用户之间现有的社交网络图,然后可以基于现有的社交网络给用户推荐新的好友,比如可以给用户推荐好友的好友。
最简单的好友推荐算法是给用户推荐好友的好友。
基于好友的好友推荐算法可以用来给用户推荐他们在现实社会中互相熟悉,而在当前社交网络中没有联系的其他用户。下面将介绍 3 种基于社交网络的好友推荐算法。

第一种,对于用户 u 和用户 v ,我们可以用共同好友比例计算他们的相似度:
在这里插入图片描述
w out ( u , v ) 公式中 out(u) 是在社交网络图中用户 u 指向的其他好友的集合。我们也可以定义 in(u)是在社交网络图中指向用户 u 的用户的集合。

第二种,在无向社交网络图中, out(u) 和 in(u) 是相同的集合。但在微博这种有向社交网络中,这两个集合就不同了,因此也可以通过 in(u) 定义另一种相似度:
在这里插入图片描述
上面两种相似度的定义有着不同的含义。

前面两种相似度都是对称的,也就是 w in ( u , v )  w in ( v , u ) , w out ( u , v )  w out ( v , u ) 。
第三种,有向的相似度:
在这里插入图片描述
这个相似度的含义是用户 u 关注的用户中,有多大比例也关注了用户 v 。
缺点:
这个相似度在分母的部分没有考虑 |in(v)| 的大小。
改进:
我们可以用如下公式改进上面的相似度:
在这里插入图片描述
这些相似度的计算无论时间复杂度还是空间复杂度都不是很高,非常适合在线应用使用。

6.4.4 基于用户调查的好友推荐算法对比

6.5 扩展阅读

  1. 六度原理:社会中任意两个人都可以通过不超过 6 个人的路径相互认识,如果转 化为图的术语,就是社交网络图的直径为 6 。
  2. 社交网络研究中有两个最著名的问题。第一个是如何度量人的重要性,也就是社交网络顶点的中心度( centrality),第二个问题是如何度量社交网络中人和人之间的关系,也就是链接预测。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值