目录
《推荐系统实践》读书笔记
1. 推荐系统
1.1. 什么是推荐系统
1.2. 推荐系统评测
1.2.1. 实验方法
1.2.2. 评判指标
1.2.3. 评判维度
2. 数据来源
2.1. 用户行为数据
2.2. 用户标签数据
2.3. 上下文信息
2.3.1. 时间上下文信息
2.3.2. 地点上下文信息
2.4. 社交网络数据
3. 通用推荐模型
3.1. 协同过滤推荐
3.1.1. 基于邻域的模型 UserCF & ItemCF
3.1.2. 隐语义模型 MF
3.1.3. 基于图的模型
3.2. 基于内容的推荐
3.3. 基于关联规则的推荐
3.4. 基于知识的推荐
3.5. 基于标签的推荐
3.5.1. 基于标签推荐物品
3.5.2. 给用户推荐标签
3.6. 基于社交网络的推荐
3.6.1. 给用户推荐内容
3.6.2. 给用户推荐好友
4. 冷启动问题
4.1. 利用用户注册信息
4.2. 提供非个性化推荐启动用户需求
4.3. 利用物品内容信息
4.4. 发挥专家的作用
5. 推荐系统实例
5.1. 外围架构
5.2. 推荐系统架构
5.3. 推荐引擎架构
6. 全书代码实现
正文
1. 推荐系统
1.1. 什么是推荐系统
(1)推荐系统的定义
推荐系统(Recommendation System, RS)是一种自动联系用户和物品的工具,它能够帮助用户在信息过载的环境中发现令他们感兴趣的信息。它通常由前台的展示页面、后台的日志系统、推荐算法系统三个部分组成。
(2)为什么需要推荐系统
随着互联网上的数据越来越多,各大应用及平台坐拥海量信息,但用户却难以找到真正对自己有用的信息,用户面对庞大的数据变得毫无头绪。
目前有三大方法可以解决信息超载的问题:分类目录、搜索引擎和推荐系统:
分类目录
分类目录是将信息分门别类,从而方便用户根据类别进行查找。例如:优设导航 、百度更多 等门户网站。但分类目录只适合用在内容少而精的网站上,大多数分类目录网站只能涵盖少数热门信息,应用场景有限。
搜索引擎
用户通过在搜索引擎上输入关键字,查找自己需要的信息。例如:搜狗、Bing 等搜索引擎。但是,用户必须主动提供准确的关键词,才可能找到需要的信息。
推荐系统
推荐系统通过分析用户的历史行为,对用户的兴趣进行建模,从而主动给用户推荐可能满足他们需求的信息,该方法能够很好的发掘长尾信息。
我们可以看到,推荐系统相对于分类目录和搜索引擎,在某些方面有着不可替代的优势。通常认为,当一个系统满足以下两个条件时,就可以考虑应用推荐系统:
存在信息过载(用户难以找到想要的内容);
用户大多数时候没有明确的需求。
1.2. 推荐系统评测
一个完整的推荐系统包括三个参与方:
用户
网站(平台,负责搭载推荐系统)
内容提供方
在评测一个推荐系统时,需要考虑上述三方的利益,一个好的推荐系统是能够令三方共赢的系统。
1.2.1. 实验方法
一般来说,一个新的推荐算法最终上线,需要通过3个实验。
首先,通过离线实验证明它在很多离线指标上优于现有的算法;
其次,通过用户调查确定用户满意度不低于现有的算法;
最后,通过在线AB测试确定它在特定的指标上优于现有的算法;
(1)离线实验 Offline Experiment
离线实验的方法的步骤如下:
通过日志系统获得用户行为数据,并生成一个标准数据集;
将数据集分成训练集和测试集;
在训练集上训练用户兴趣模型,在测试集上进行预测;
通过事先定义的离线指标,评测算法在测试集上的预测结果。
从以上步骤看出,离线实验的都是在标准数据集上完成的。这意味着,它不需要一个实际的系统作为支撑,只需要有一个模拟环境即可。
离线实验的优缺点:
优点 | 缺点 |
不需要有对实际系统的控制权 | 无法计算商业上关心的指标 |
不需要用户参与实验 | 离线实验的指标和商业指标存在差距 |
速度快,可以测试大量算法 |
(2)用户调查 User Study
用户调查由真实的用户在需要测试的推荐系统上完成某些任务。在他们完成这些任务时,观察和记录他们的行为,并让他们回答一些问题。最后通过分析他们的行为和答案,了解推荐系统的性能。
用户调查的优缺点:
优点 | 缺点 |
可以获得用户主观感受的指标 | 招募测试用户代价较大 |
风险低,出错后容易弥补 | 无法组织大规模的测试用户,统计意义不足 |
双盲实验设计困难,导致收集的测试指标无法在真实环境下重现 |
(3)在线实验 Online Experiment
在线实验是指将系统上线做AB测试,把它和旧算法进行比较。AB测试通过一定的规则将用户随机分成几组,对不同组的用户采用不同的算法,然后通过统计不同组的评测指标,比较不同算法的好坏。
AB测试的优缺点:
优点 | 缺点 |
可以准确地获得不同算法的实际性能指标和商业上关注的指标 | 周期较长,必须进行长期的实验才能得到可靠的结果 |
大型网站做AB测试,可能会因为不同团队同时进行各种测试对结果造成干扰,所以切分流量是AB测试中的关键。不同的测试层以及控制这些层的团队,需要从一个统一的流量入口获得自己AB测试的流量,而不同层之间的流量应该是正交的。
1.2.2. 评判指标
评测指标用于评测推荐系统的性能,有些可以定量计算,如预测准确度、覆盖率、多样性、实时性;有些只能定性描述,如用户满意度、新颖性、惊喜度、信任度、健壮性和商业目标。
有了这些指标,就可以根据需要对推荐系统进行优化,通常的优化目标是在给定覆盖率、多样性、新颖性等限制条件下,尽量提高预测准确度。
离线实验 |
问卷调查 | 在线实验 | |
用户满意度 | × | √ | √ |
预测准确度 | √ | √ | × |
覆盖率 | √ | √ | √ |
多样性 | √ | √ | √ |
新颖性 | √ | √ | √ |
惊喜度 | × | √ | × |
下面我们分别介绍一下这几种评测指标。
(1) 用户满意度
用户满意度是评测推荐系统的重要指标,无法离线计算,只能通过用户调查或者在线实验获得。
调查问卷的设计需要考虑周全,用户才能针对特定问题给出准确的回答;
在线系统中用户的满意度通过统计用户行为得到。一般情况,可以用用户点击率、停留时间、转化率等指标度量用户的满意度。
(2) 预测准确度
预测准确度是度量一个推荐系统或其中推荐算法预测用户行为的能力。 是推荐系统最重要的离线评测指标。大致可从“评分预测”和“Top-N推荐”两个方面进行评测。
评分预测
预测评分的准确度,衡量的是算法预测的评分与用户的实际评分的贴近程度,一般通过以下指标度量:
设测试集 T 中有用户 u 和物品 i 用 r u i 表示用户 u u对物品 i 的实际评分;r ^ u i 表示推荐算法给出的预测评分。则
平均绝对误差(MAE)
# records[i] = [u,i,rui,pui] # rui是用户u对物品i的实际评分,pui是用户u对物品i的预测评分 def mae(records): """计算平均绝对误差""" return math.sqrt(sum([abs(rui-pui) for u,i,rui,pui in records])/len(records))
均方根误差(RMSE)
- 一般而言,RMSE的误差会比MAE小
# records[i] = [u,i,rui,pui] # rui是用户u对物品i的实际评分,pui是用户u对物品i的预测评分 def rmse(records): """计算均方根误差""" return math.sqrt(sum([(rui-pui)*(rui-pui) for u,i,rui,pui in records])/len(records))
Top-N推荐
如果推荐服务会给用户提供个性化的推荐列表,那么这种推荐就叫做Top-N推荐。
Top-N推荐的预测准确率,一般通过3个指标度量:
设 R ( u ) R(u)R(u) 是根据用户在训练集上的行为提供给用户的推荐列表,T ( u ) T(u)T(u) 是用户在测试集上的实际行为列表。
命中率 (Hits Ratio)
其中,h i t s ( i ) hits(i)hits(i)表示第i ii个用户访问的值是否在推荐列表中,是则为1,否则为0;N NN表示用户的总数量。
准确率(Precision)
召回率(Recall)
def HR_precision_recall(test, N): """ 计算命中率、准确率和召回率,这里是包括了推荐和计算HR、precision、recall两个步骤,注意取舍 test: 测试集 N: 推荐列表长度 """ hit = 0 n_recall = 0 n_precision = 0 n_user = 0 for user, items in test.items(): rank = Recommend(user, N) # 进行推荐 hit += len(rank & itmes) # 计算hit数,即HR n_user += 1 n_precision += N # 计算precision n_recall += len(items) # 计算recall return [hit/(1.*n_use), hit/(1.*n_precision, hit/(1.*n_recall))]
Top-N推荐由于其个性化特性突出,因此相对于评分预测更符合实际的应用需求。
(3) 覆盖率
覆盖率(Coverage)是描述一个推荐系统对物品长尾的发掘能力。覆盖率最简单的定义是:推荐系统能够推荐出来的物品占总物品集合的比例。
假设系统的用户集合为 U UU,总物品集合为 I II,推荐系统给每个用户推荐一个长度为 N NN 的物品推荐列表 R ( u ) R(u)R(u),覆盖率公式表达为:
覆盖率是内容提供者关心的指标,覆盖率为100%的推荐系统可以将每个物品都至少推荐给一个用户。
除了利用推荐物品的占比来定义覆盖率,还可以通过研究物品在推荐列表中出现的次数分布来描述推荐系统的挖掘长尾的能力。如果分布比较平,说明推荐系统的覆盖率很高;如果分布陡峭,说明分布系统的覆盖率较低。
信息论和经济学中有两个著名指标,可以定义覆盖率:
信息熵
其中p ( i ) p(i)p(i)是物品i ii的流行度除以所有物品流行度之和;
基尼系数(Gini Index)
其中,i j 是按照物品流行度 p pp 从小到大排序的物品列表中第 j jj 个物品。
基尼系数的计算原理:首先,我们将物品按照热门程度从低到高排列,那么下图中的黑色曲线表示最不热门的 x % x\%x% 物品的总流行度占系统的比例 y % y\%y% 。这条曲线肯定是在 y = x y=xy=x 曲线之下的,而且和 y = x y=xy=x 曲线相交在(0,0)和(1,1)。
令 S A 为 A 的面积,S B 为 B 的面积,那么基尼系数的形象定义就是 S A / ( S A + S B ) ,从定义可知,基尼系数属于区间 [ 0 , 1 ]如果系统的流行度很平均,那么 S A 就会很小,从而基尼系数很小。如果系统物品流行度分配很不均匀,那么 S A 就会很大,从而基尼系数也会很大。
from operator import itemgetter def gini_index(p): """计算基尼系数 p是一个字典, 格式:{item_id1:pop1, item_id2:pop2, ...}, 即{物品1:流行度1, 物品2:流行度2, ...} """ p_list = list(p.values()) cum = np.cumsum(sorted(np.append(p_list, 0))) sum = cum[-1] x = np.array(range(len(cum))) / len(p_list) y = cum / sum B = np.trapz(y, x=x) A = 0.5 - B G = A / (A + B) return G
(4) 多样性
为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴趣领域,即需要具有多样性。
多样性描述了推荐列表中物品之间的不相似性。假设 s ( i , j ) ∈ [ 0 , 1 ] s(i,j)\in [0,1]s(i,j)∈[0,1] 定义了物品 i ii 和 j jj 之间的相似度,那么用户u uu的推荐列表 R ( u ) R(u)R(u) 的多样性定义如下:
推荐系统整体多样性可以定义为所有用户推荐列表多样性的均值:
(5) 新颖性
新颖性也是影响用户体验的重要指标之一。它指的是向用户推荐非热门非流行物品的能力。评测新颖度最简单的方法是利用推荐结果的平均流行度,因为越不热门的物品,越可能让用户觉得新颖。
但是这种计算方法比较粗糙,因为不同用户不知道的东西是不同的,需要配合用户调查准确统计新颖度。
(6) 惊喜度
惊喜度与新颖度相关,它是指推荐结果和用户的历史兴趣不相似,但却让用户满意的程度。
(7) 信任度
信任度用于衡量用户对推荐系统的信任程度,这个指标的意义在于,如果用户信任推荐系统就会增多用户和推荐系统的交互。信任度目前只能通过问卷调查的方式来度量。
提高信任度的方式主要有两种:
增加系统透明度
即提供推荐解释,让用户了解推荐系统的运行机制。
利用社交网络信息
即利用用户的好友给用户做推荐。
(8) 实时性
许多物品具有很强的时效性,例如新闻、微博等,需要在时效期内推荐给用户,否则物品的价值就可能大打折扣。推荐系统的实时性包括两方面:
实时更新推荐列表满足用户新的行为变化;
将新加入系统的物品推荐给用户;
前者可以通过推荐列表的更新速率来控制和测评,后者可以通过计算推荐列表中有多大比例的物品是新加入物品来测评。
(9) 健壮性
任何能带来利益的算法系统都会被攻击,最典型的案例就是搜索引擎的作弊与反作弊斗争。推荐系统也不例外,健壮性衡量了推荐系统抗击作弊的能力。
2011年的推荐系统大会专门有一个推荐系统健壮性的教程,作者总结了很多作弊方法,最著名的是行为注入攻击(Profile Injection Attack)。就是注册很多账号,用这些账号同时购买某件商品A和自己的商品。此方法针对一种购物网站的推荐方法:“购买商品A的用户也经常购买的其他商品”。
一般会利用模拟攻击来评测算法的健壮性:
给定一个数据集和算法,用算法给数据集中的用户生成推荐列表;
用常用的攻击方法向数据集中注入噪声数据;
利用算法在有噪声的数据集上再次生成推荐列表;
通过比较攻击前后推荐列表的相似度评测算法的健壮性。
提高推荐系统健壮性的方法:
选择健壮性高的算法;
选择代价较高的用户行为,例如收费的用户行为(购物等)、限制用户权限(给用户分级);
在使用数据前进行攻击检测,从而对数据进行清理。
(10) 商业目标
设计推荐系统时,需要考虑最终的商业目标。不同网站具有不同的商业目标,它与网站的盈利模式息息相关。
比如电子商务网站的目标可能是销售额,基于展示广告盈利的网站其商业目标可能是广告展示总数,基于点击广告盈利的网站其商业目标可能是广告点击总数。因此,设计推荐系统时需要考虑最终的商业目标,也就是说网站使用推荐系统的目的除了满足用户发现内容的需求,同时也需要利用推荐系统加快实现商业上的指标。
1.2.3. 评判维度
增加评测维度的目的,就是知道一个算法在什么情况下性能最好,这样可以为融合不同推荐算法取得最好的整体性能带来参考。
一般评测维度分3种:
用户维度:主要包括用户的人口统计学信息、活跃度以及是不是新用户等;
物品维度:包括物品的属性信息、流行度、平均分以及是不是新加入的物品等;
时间维度:包括季节,是工作日还是周末,白天还是晚上等;
如果推荐系统的评测报告中包含了不同维度下的系统评测结果,就能帮我们全面了解系统性能,甚至找到一个看上去比较弱的算法的优势,或者发现一个看上去比较强的算法的缺点。
2. 数据来源
关于推荐系统常用的数据集,大家可以参考:RecBole Dataset List、LibRec Dataset、RS and Personalization Datasets。
2.1. 用户行为数据
基于用户行为数据获取数据也就是通过用户曾经进行过的行为来了解用户兴趣和需求。
用户行为数据一般存于网站的日志中,网站在运行过程中都产生大量原始日志(Raw Log),多种原始日志可以按照用户行为汇总成会话日志(Session Log),其中每个会话表示一次用户行为及其对应的服务。
下面给出一种用户行为的统一表示,可以作为数据库设计的参考:
字段 | 含义 |
user id | 产生行为的用户的唯一标识 |
item id | 产生行为的对象的唯一标识 |
behavior type | 行为的种类(比如是购买还是浏览) |
context | 产生行为的上下文,包括时间和地点等 |
behavior weight | 行为的权重(如果是观看视频的行为,那么这个权重可以是观看时长;如果是打分行为,这个权重可以是分数) |
behavior content | 行为的内容(如果是评论行为,那么就是评论的文本;如果是打标签的行为,就是标签) |
用户行为在个性化推荐系统中一般分两种:
显性反馈行为(Explicit Feedback)
显性反馈行为包括用户明确表示对物品喜好的行为。例如用户评分、点赞之类的用户表态;
隐性反馈行为(Implicit Feedback)
隐性反馈行为指的是那些不能明确反应用户喜好的行为。最具代表性的隐性反馈行为就是页面浏览行为,用户进行浏览既可能是对该页面的内容感兴趣,也可能是误操作。
我们从几个不同方面来比较显性反馈数据和隐性反馈数据:
—
显性反馈数据 |
隐性反馈数据 | |
用户兴趣 | 明确 | 不明确 |
数量 | 较少 | 庞大 |
存储 | 数据库 | 分布式文件系统 |
实时读取 | 实时 | 有延迟 |
正负反馈 | 都有 | 只有正反馈 |
下标列举了在各个领域的网站中这显性反馈数据和隐性反馈数据的例子:
显性反馈数据 |
隐性反馈数据 | |
视频网站 | 用户对视频的评分 | 用户观看视频的日志、浏览视频页面的日志 |
电子商务网站 | 用户对商品的评分 | 购买日志、浏览日志 |
门户网站 | 用户对新闻的评分 | 阅读新闻的日志 |
音乐网站 | 用户对音乐/歌手/专辑的评分 | 听歌的日志 |
在很多时候我们并不使用统一结构表示所有行为,因为使用统一的结构会造成很大的空间浪费。一般来说,会用不同的数据集包含不同的行为,目前比较有代表性的数据集有下面几个:
无上下文信息的隐性反馈数据集
每一条行为记录仅仅包含用户ID和物品ID,Book-Crossing 就是这种类型的数据集;
无上下文信息的显性反馈数据集
每一条记录包含用户ID、物品ID和用户对物品的评分;
有上下文信息的隐性反馈数据集
每一条记录包含用户ID、物品ID和用户对物品产生行为的时间戳。Lastfm数据集 就是这种类型的数据集;
有上下文信息的显性反馈数据集
每一条记录包含用户ID、物品ID、用户对物品的评分和评分行为发生的时间戳。Netflix Prize 提供的就是这种类型的数据集。
2.2. 用户标签数据
标签是一种重要的特征表现方式,用户用标签来描述对物品的看法,可以说标签是联系用户和物品的纽带,也是反应用户兴趣的重要数据源。
根据给物品打标签的人的不同,标签应用一般分为两种:一种是让作者或者专家给物品打标签;另一种是让普通用户给物品打标签,也就是UGC(User Generated Content,用户生成的内容)的标签应用。
标签系统中的推荐问题主要有以下两个:
如何利用用户打标签的行为为其推荐物品(基于标签的推荐)
如何在用户给物品打标签时为其推荐适合该物品的标签(推荐标签)
为了研究上面的两个问题,我们首先需要理解下面三个问题:
用户为什么要打标签
用户标注的动机一是便于上传者组织自己的信息,同时帮助其他用户找到信息;二是可以更好地组织内容,方便用户将来的查找,同时可以传达某些信息,比如照片的拍摄时间和地点等;
用户是如何打标签的
用户打标签的行为也具有长尾分布的特点,即只使用少数常用标签、只给少数热门物品打标签;
用户打什么样的标签
不同的系统有不同的标签系统,通常需要专家去定义一些标签给用户使用,否则用户很可能会给物品打上各种各样奇奇怪怪的标签。Delicious上的一种经典标签系统可以表示如下:
表明物品是什么。比如是一只鸟,就会有“鸟”这个词的标签;是豆瓣的首页,就有一个标签叫“豆瓣”;是乔布斯的首页,就会有个标签叫“乔布斯”。
表明物品的种类。比如表示一个网页类别的标签包括 article(文章)、blog(博客)、book(图书)等。
表明谁拥有物品。比如很多博客的标签中会包括博客的作者等信息。
表达用户的观点。比如用户认为网页很有趣,就会打上标签funny(有趣),认为很无聊,就会打上标签boring(无聊)。
用户相关的标签。比如 my favorite(我最喜欢的)、my comment(我的评论)等。
用户的任务。比如 to read(即将阅读)、job search(找工作)等。
2.3. 上下文信息
上下文信息是指用户访问推荐系统的时间、地点、心情等,对于提高推荐系统的推荐准确度是非常重要的。比如,一个卖衣服的推荐系统在冬天和夏天应该给用户推荐不同种类的服装。推荐系统不能因为用户在夏天喜欢过某件T恤,就在冬天也给该用户推荐类似的T恤。因此,准确了解用户的上下文信息,并将该信息应用于推荐算法是设计好的推荐系统的关键。
总的来说,一般在推荐系统中我们会主要利用用户的时间上下文信息和位置上下文信息。
2.3.1. 时间上下文信息
一般认为,时间信息对用户兴趣的影响表现在以下几个方面:
用户兴趣变化
用户兴趣变化是因为用户自身原因发生的变化。比如随着时间的推移,用户半年前喜欢看番剧,现在喜欢看文艺片。要准确预测用户现在的兴趣,就应该关注用户最近的行为,因为用户最近的行为最能体现他现在的兴趣。当然,考虑用户最近的兴趣只能针对渐变的用户兴趣,而对突变的用户兴趣很难起作用;
物品生命周期
当我们决定在某个时刻给某个用户推荐某个物品时,需要考虑该物品在该时刻是否已经过时了。典型的短生命周期物品有新闻、直播等;
季节效应
季节效应主要反映了时间本身对用户兴趣的影响。比如人们夏天吃冰淇淋,冬天吃火锅,夏天穿T恤,冬天穿棉衣,以及不同节假日的商品规律等等。
在给定时间信息后,推荐系统从一个静态系统变成了一个时变的系统,而用户行为数据也变成了时间序列。包含时间信息的用户行为数据集由一系列三元组构成,其中每个三元组 ( u , i , t ) (u,i,t)(u,i,t) 代表了用户 u uu 在时刻 t tt 对物品 i ii 产生过行为。在给定数据集后,通过统计如下信息研究系统的时间特性:
数据集每天独立用户数的增长情况
有些网站处于快速增长期,它们每天的独立用户数都在线性(甚至呈指数级)增加。而有些网站处于平稳期,每天的独立用户数都比较平稳。还有一些网站处于衰落期,每天的用户都在流失。在3种不同的系统中用户行为是不一样的;
系统的物品变化情况
比如新闻网站,每天都会出现大量新的新闻,而每条热门的新闻其时间周期都不会太长,今天热门的新闻也许明天就被人忘记了;
用户访问情况
有些网站用户来一次就永远不来了,有些网站用户每周来一次,而有些网站用户每天都来。为了度量这些特性,我们可以统计用户的平均活跃天数,同时也可以统计相隔T TT天来系统的用户的重合度。
2.3.2. 地点上下文信息
除了时间,地点作为一种重要的空间特征,也是一种重要的上下文信息。不同地区的用户兴趣有所不同,用户到了不同的地方,兴趣也会有所不同。
用户兴趣和地点相关的特征主要有两个:
兴趣本地化
不同地方的用户兴趣存在着很大的差别,不同国家和地区用户的兴趣存在着一定的差异。
活动本地化
一个用户在一段时间内往往只能在附近的地区活动。因此,在基于位置的推荐中我们需要考虑推荐地点和用户当前地点的距离,不能给用户推荐太远的地方。
2.4. 社交网络数据
社交网络可以很好地模拟现实社会,在社交网络中的用户通常相互认识,这大大提高了推荐的信任度,同时也缓解了推荐系统冷启动的问题。
不过,社会化推荐有一些明显的缺点,其中最主要的就是很多时候并不一定能提高推荐算法的离线精度(准确率和召回率)。特别是在基于社交图谱数据的推荐系统中,因为用户的好友关系不是基于共同兴趣产生的,所以用户好友的兴趣往往和用户的兴趣并不一致。比如,我们和自己父母的兴趣往往就差别很大。
现在互联网上充斥着各种各样带有社交性质的网站。那么,从什么方面可以获得社交网络数据呢?一般来说,有如下渠道:
电子邮件
电子邮件其实也是一个社交网络,可以通过分析用户的联系人列表了解用户的好友信息,进一步通过研究两个用户之间的邮件往来频繁程度度量两个用户的熟悉程度。
用户注册信息
在注册时引导用户填写一些诸如公司、学校等信息,就样就可以知道哪些用户曾经在同一家公司工作过,哪些用户曾经在同一个学校学习过。
用户的位置数据
位置信息也是一种反映用户社交关系的数据。在同一地点的用户更容易有相似的兴趣,甚至这些用户相互之间就认识。
论坛和讨论组
每个群聊或小组都包含一些有相同兴趣的人。如果两个用户同时加入了很多相同的小组,我们可以认为这两个用户很可能互相了解或者具有相似的兴趣。如果两个用户在讨论组中曾经就某一个帖子共同进行过讨论,那就更加说明他们之间的熟悉程度或兴趣相似度很高。
即时聊天工具
和电子邮件系统一样,用户在即时聊天工具上也会有一个联系人列表,而且往往还会给联系人进行分组。通过这个列表和分组信息,我们就可以知道用户的社交网络关系,而通过统计用户之间聊天的频繁程度,可以度量出用户之间的熟悉程度。
社交网站
社交网站是研究用户关系的绝佳地点,例如Facebook中的绝大多数用户联系基于社交图谱:由人们之间的亲属关系、工作关系而形成;Twitter中的绝大多数用户联系基于兴趣图谱:通过人们之间的共同兴趣和信念形成。
社交网络定义了用户之间的联系,我们通常用图描述社交网络。一般来说,有3种不同的社交网络数据:
双向确认的社交网络数据
以Facebook和人人网为代表,用户之间形成好友关系需要通过双方的确认;
单向关注的社交网络数据
以Twitter和新浪微博为代表,用户A可以关注用户B,而不用得到用户B的允许;
基于社区的社交网络数据
用户之间并没有明确的关系,但同在一个社区。比如豆瓣小组,属于同一个小组可能代表了用户兴趣的相似性;