新書推薦:
《
画楼:《北洋画报》忆旧(年轮丛书)
》
售價:HK$
337.5
《
大国脊梁:漫画版
》
售價:HK$
80.2
《
跟着渤海小吏读历史:大唐气象(全三册)
》
售價:HK$
189.0
《
心智的构建:大脑如何创造我们的精神世界
》
售價:HK$
81.4
《
美国小史(揭秘“美国何以成为美国”,理解美国的经典入门读物)
》
售價:HK$
81.4
《
中国古代北方民族史丛书——东胡史
》
售價:HK$
87.8
《
巨人传(插图珍藏本)
》
售價:HK$
705.6
《
地下(村上春树沙林毒气事件的长篇纪实)
》
售價:HK$
76.7
編輯推薦:
社交媒体是大数据的丰富来源,财富500强公司中的90%都在投资大数据方面的计划来帮助预测用户的行为。了解社交媒体数据*有效的挖掘方法能够帮助你获得产生惊人业绩的信息。
社交媒体是非结构化、动态、面向未来的。高效而有洞察力的数据挖掘需要新的分析工具和技术。由任职社交网络公司的业界专家所撰写的本书提供了一个实践教程,教授你如何使用最新的工具和专门针对社交媒体的复杂数据挖掘技术。本书深入剖析了收集和应用社交媒体数据的机制,以理解用户、定义趋势并做出预测,从而改善对增长和销售的分析。
你将了解如何充分利用从社交媒体及其他相关的丰富数据源所收集的数据,也将学习如何识别在线用户的共性行为模式,以便独立构建和应用基于这些模式的预测算法。
通过阅读本书,你将学到:
在线服务的4个关键特征:用户、社交网络、行为和内容
数据发现的生命周期:数据抽取、分析和可视化
使用社交媒体进行客户预测和推荐的技术
如何使用分布式计算高效处理大规模社交媒体数据
使用Python、R和Scala编写的代码级的示例解决方案
內容簡介:
本书围绕着如何探索和理解社交媒体系统的基本组成部分进行组织,简单地说来就是谁(who)、如何(how)、何时(when)和什么(what)构成了社交媒体过程。本书的目标是“授人以渔”。在涵盖了社交媒体分析的主要方面之后,本书还以大量篇幅介绍了大数据环境下处理社交媒体数据所需的工具、算法的原理和实际案例,读者可以以此为基础,快速介入生产环境下的社交媒体数据处理任务。
關於作者:
Gabor Szabo博士,是Tesla的高级软件工程师,曾作为数据科学家任职于Twitter,期间专注于预测众包在线服务中的用户行为和内容流行度,以及对大规模内容的动力学进行建模。他还开发了PyCascading数据处理库。
Gungor Polatkan博士,是一名技术主管和工程经理,他为LinkedIn学习相关的后端设计并实现了端到端的机器学习和人工智能离线及在线管道。之前曾在Twitter任职机器学习科学家,从事如广告定向投放和用户建模等专题的工作。
P. Oscar Boykin博士,是Stripe的软件工程师,从事机器学习基础设施的建设工作。他曾在Twitter任职高级工程师,解决数据基础设施的问题。他参与了Scala大数据库Algebird、Scalding和Summingbird的开发。
Antonios Chalkiopoulos硕士,是分布式系统专家。一位曾在媒体、博彩和金融领域交付过快速和大型数据项目的系统工程师。他现在作为共同创始人领导Lenses数据流平台的工作,同时担任https:senses.stream网站的CEO。
目錄 :
译者序
前言
致谢
作者简介
技术编辑简介
第1章 用户:谁参与社交媒体1
1.1 测量Wikipedia中用户行为的变化1
1.1.1 用户活动的多样性2
1.1.2 人类活动中的长尾效应18
1.2 随处可见的长尾效应:8020定律20
1.3 Twitter上的在线行为23
1.3.1 检索用户的Tweet24
1.3.2 对数分区26
1.3.3 Twitter上的用户活动27
1.4 总结28
第2章 网络:社交媒体如何运行29
2.1 社交网络的类型和属性30
2.1.1 用户何时创建连接:显式网络30
2.1.2 有向图与无向图31
2.1.3 节点和边的属性31
2.1.4 加权图32
2.1.5 由活动构建图:隐式网络33
2.2 网络可视化35
2.3 度:赢家通吃38
2.3.1 连接计数40
2.3.2 用户连接的长尾分布41
2.3.3 超越理想网络模型43
2.4 捕获相关:三角结构、簇和同配性45
2.4.1 局部三角结构和簇45
2.4.2 同配性49
2.5 总结53
第3章 时序过程:用户何时使用社交媒体54
3.1 传统模型如何描述事件发生的时间54
3.2 事件间隔时间57
3.2.1 与无记忆过程的对比60
3.2.2 自相关63
3.2.3 与无记忆过程的偏离64
3.2.4 用户活动中的时间周期66
3.3 个体行为的爆发70
3.4 预测长期指标78
3.4.1 发现趋势80
3.4.2 发现季节性82
3.4.3 利用ARIMA预测时间序列84
3.5 总结86
第4章 内容:社交媒体中有什么88
4.1 定义内容:聚焦于文本和非结构数据88
4.1.1 从文本生成特征:自然语言处理基础89
4.1.2 文本中词条的基本统计91
4.2 使用内容特征识别主题92
4.2.1 话题的流行度98
4.2.2 用户个体兴趣有多么多样化100
4.3 从高维文本中抽取低维信息102
4.4 总结120
第5章 处理大型数据集122
5.1 MapReduce:组织并行和串行操作122
5.1.1 单词计数124
5.1.2 偏斜:最后一个Reducer的诅咒127
5.2 多阶段MapReduce流127
5.2.1 扇出129
5.2.2 归并数据流129
5.2.3 连接两个数据源131
5.2.4 连接小数据集134
5.2.5 大规模MapReduce模型134
5.3 MapReduc程序设计模式135
5.3.1 静态MapReduce作业135
5.3.2 迭代MapReduce作业140
5.3.3 增量MapReduce作业146
5.3.4 时间相关的MapReduce作业146
5.3.5 处理长尾分布社交媒体数据的挑战153
5.4 抽样和近似:以较少计算得到结果154
5.4.1 HyperLogLog156
5.4.2 Bloom过滤器161
5.4.3 Count-Min Sketch166
5.5 在Hadoop集群上运行171
5.5.1 在Amazon EC2上安装CHD集群171
5.5.2 为合作者提供IAM存取174
5.5.3 根据需要增加集群处理能力175
5.6 总结175
第6章 学习、映射和推荐177
6.1 在线社交媒体服务177
6.1.1 搜索引擎177
6.1.2 内容参与178
6.1.3 与现实世界的互动179
6.1.4 与人的互动180
6.2 问题阐述180
6.3 学习和映射182
6.3.1 矩阵分解183
6.3.2 学习和训练184
6.3.3 电影评分示范187
6.4 预测与推荐197
6.4.1 评估199
6.4.2 方法概述200
6.5 总结209
第7章 结论210
7.1 人类互动模式出乎意料的稳定性210
7.2 均值、标准差和抽样211
7.3 移除异常值216
內容試閱 :
本书旨在通过数据来理解社交媒体服务是如何被使用的。自从Web 2.0问世以来,赋予用户主动变更和贡献内容的权力的站点及服务受到了广泛欢迎。社交媒体起源于早期的社交网络和社区通信服务,包括20世纪80年代的公告牌系统(Bulletin Board System,BBS)
以及其后出现的Usenet新闻组和20世纪90年代的地理城市(geocity),它们中的社区围绕着受关注的热门话题进行组织,并为用户提供电子邮件或聊天室作为交流平台。被称为Internet的全球信息通信网络则带来了一个更高层次的网络系统:在志同道合的个人和群体之间建立的全球性的关联网络。从那时开始,尽管跨越全球建立人与人之间联系的基本理念变化不大,但是社交媒体服务的范围和影响却达到了前所未有的程度。虽然大部分的交流仍然很自然地发生在“现实世界”,但是转向电子信息交换进行人际交互的趋势已经愈加强烈。移动设备的快速发展和联网程度的快速提升使得“口袋里的Internet”成为现实。在此基础上,在任何时间、任何地点与朋友、家人保持联系以及持续关注喜欢的事情都已经成为可能。
无怪乎用于满足人们交流和分享需要的服务大量涌现,并引领了公共和私人生活方式的改变。借助这些服务,我们可以即时了解其他人对品牌、产品以及彼此的看法。通过私下或匿名分享自己的想法,人们有了一个新的渠道,可以通过比传统媒体更自由的方式表达自己的想法。如果人们愿意的话,每个人的声音都可以被他人听到,所以从人们贡献的大量内容中大海捞针似地寻找相关信息也就成为这些服务的责任。也就是说,这些服务要为我们推送相关并且有趣的内容。
这些服务有什么共同点呢?那就是它们依赖于我们,因为它们只是人与人之间的媒介。这也意味着在某种程度上,通过分析这些服务的使用数据而发现的数学规律其实反映的是我们自身的行为。所以可以预期,在分析这些数据集时将遇到相似的发现和挑战。借助一些技术手段可以通过这些服务所收集的数据来理解用户如何参与其中,本书的目的就是指出这些规律和技术手段。
人际交互行为挖掘
顾名思义,社交媒体是由在线服务所提供的内容所引发的社会互动来驱动的。例如,社交网络使每个个体能够很容易地相互连接,共享图片、多媒体、新闻文章、Web内容以及各种其他信息。在这些服务最常见的使用场景中,人们会去Facebook获取朋友、亲戚和熟人的最新信息,并与他们分享一些自己生活的信息。而在Twitter,因为无须相互关注,所以用户可以了解任何其他用户的想法、所分享的内容,或者与其他人进行交流。LinkedIn则是一个专业的社交网络,它的目标是通过网络和团体将志同道合的专业人士彼此联系起来,并充当求职者和用人单位之间的桥梁。
也有其他类型的社交媒体服务,其社交互动的网络特性更多只是起到辅助作用,而不是以共同创建或欣赏被分享的内容为目的(例如,Wikipedia、YouTube或Instagram)。对这些社交媒体而言,尽管用户之间的连接是存在的,但连接的目的是让用户更易于管理内容的发现,并使内容的创建更有效率(例如,Wikipedia的文章)。
当然,还有许多针对特定的兴趣或领域的社交媒体站点和服务,如艺术、音乐、摄影、学术机构、地理位置、爱好等。这些都表明在线用户有着最深切的愿望同那些志同道合者建立联系。
尽管这些服务所关注的范围大不相同,但是它们有一个共同点:它们完全是因为拥有了用户和受众才能存在的。这也就是这些服务不同于那些“预先创建”的或静态的站点之处,此类站点包括传统媒体新闻网站、公司主页、目录以及任何以授权的内容生产者的特定小群体为中心所创建的网络资源。(这里的“小”是相对于使用社交媒体服务的数以百万计的用户群体而言的。)深入挖掘这些服务的使用模式能够观察到数以百万计的社交媒体用户的群体动力学的结果,这也正是本书的兴趣所在。
通过收集数据理解在线行为
当我们从社交媒体服务收集使用日志数据时,会一睹人类群体的统计行为,这些群体的聚集或是因为具有相似的动机或期望,或是因为朝着同一个目标而努力。给定服务的组织方式以及其展示内容的方式自然会对我们在用户活动日志中所看到的内容有很大的影响。这些访问和使用日志存储在服务的数据库中,因此,我们与他人交互的统计模式以及服务主机所包含的内容必然会通过这些痕迹展现出来。(只要这样的模式存在,并且我们不是以一种完全反复无常、随机的方式进行日常活动,我们就将看到统计规律无处不在,这也是直觉可能预期的。)
幸运的是,这些服务(多数情况下)在设计上并不会有非常极端的差异,从而导致完全不同的用户行为特征。这是什么意思呢?举个例子,我们想要度量一件简单的事情:一周之内用户返回我们的服务并参与某些活动的频繁程度。对每个用户来说,这只不过是一个从0到理论上为无穷大的数字。当然,在有限时间内,我们不会看到任何人在服务上进行无穷次的操作,不过可能会出现一个很大的数字。所以,当决定要统计活动的次数时,我们能否期望对于两个不同的系统有不同的统计结果呢,比如用户将视频发布到YouTube频道和将照片上传到Flickr账号?
答案显然是一个响亮的“是”。如果分别观察YouTube和Flickr使用频次的分布,我们自然会发现,每周上传一个视频的YouTube用户比例与每周上传一个图像的Flickr用户比例并不相同。这是很自然的,因为这两个服务以不同的使用场景吸引具有不同特征的用户群体,所以具体的分布当然不同。然而,在研究者分析过的大多数在线系统当中,我们发现了一个可能不那么直观的结果:这些分布具有一种相似的定性统计行为。
所谓“定性”是指,尽管两个服务所对应的使用模型的具体参数取值可能不同,但是用以描述这两个系统中用户行为的模型本身却是相同或者非常相似的(可能存在微小差异)。
关于这一点的好消息是,我们有理由相信,从活动日志中挖掘出的确实是在这些站点上驱动内容创建、传播、分享等操作的潜在的人类行为。另一个好消息是,如果遇到新的运行机制为由用户产生内容的服务,我们可以有根据地推测能够从中挖掘些什么。如果在数据分析结果中发现与以前看到的一般模式有所区别的新情况,那么我们应该为其寻找特定服务的原因,以便进一步研究。
因此,在某种程度上,只要一个全新的服务也由同样的潜在人类行为支配,本书所给出的方法和结果也可以很好地应用于这个新服务。对于目前我们所知被研究过的社交媒体服务而言,这一结论基本正确,几乎没有例外。因此,我们倾向于认为这些系统提供了洞察人类行为的机会,由于人们在服务的日志中留下了数字足迹,这种观察和描述由许多人的松散聚集所产生的群体行为的机会是前所未有的。(当然,在实践中必须考虑隐私问题,但此处我们感兴趣的只是大图景下的统计结果,而不是某个个体的具体行为。)后续小节将介绍在各种社交媒体服务中可能引人关注的数据,以及我们将在本书中使用哪些公共数据集作为示例。
需要收集何种数据
我们最终希望通过数据回答的问题决定了需要收集哪些数据。一般而言,拥有的数据越多,也就越能更好地回答当前以及未来的问题。由于我们永远不会知道何时需要完善或扩展对数据的分析,所以如果设计一个服务,最好提前考虑在日志中记录全部或者近乎全部的用户与服务及用户之间的交互行为。当前存储设备并不昂贵,所以明智的做法是尽可能满足未来的数据需求,而非过早地尝试优化存储空间。当然,随着服务的发展和其关注领域的日渐清晰,可以根据需要减少收集数据的总量并重构现有的数据源。
为了更好地理解一般需要的用户活动数据,下面列出一些大家可能感兴趣的关于社交媒体使用的典型问题:
谁是最活跃或最不活跃的用户?有多少这样的用户?
用户的使用习惯如何随着时间演化?能够提前预测每类用户(基于地理属性、用户特征、使用方式进行分类)的使用行为吗?
如何将用户与内容进行匹配?如何关联用户与用户?如何及时向用户推送感兴趣的内容?
用户的关系网络是什么样子的?吸引更多的用户会构成不同种类的网络吗?
如果用户确实会流失的话,他们为什么离开服务?用户流失是否有预兆,能否预测?
是什么使新用户加入服务?他们喜欢新的服务吗?如果不喜欢,乐在其中的用户与不满意的用户差异何在?
有没有用户在以某种方式利用我们的服务?用户中是否存在滥发信息、不道德的使用以及欺骗行为?
在任意给定时刻,最“有趣”的内容或者最有“风向标”意义的内容是什么?用户中有哪些参与其中?怎样才能找到这些内容,它是关于什么方面的?
能在用户产生的海量的新数据或历史数据中找到感兴趣的特定内容吗?例如,能找到最近提到某个词或某个主题的用户吗?
用户中的“流行”内容有哪些?它们的流行程度有很大差别吗?如果有,有多大?
本书讨论了上述问题中的一部分,并对一些具体服务给出了答案。显而易见,有些问题可以通过与用户进行主动实验(active experiment)得到很好的答案,特别是AB测试实验。(在AB测试实验中,对用户集A展示一个特征或使用一个算法,而对用户集B使用另一个。通过测量A和B之间用户活动的差异,可以判定特征的改变对用户有什么影响。)然而,由于我们更多地关注于分析已经收集的数据并尽可能地了解它们,我们不会涵盖这种通常用于优化用户服务体验的强大技术。
那么,应该从自己运营的服务或者从其他能够访问的社交媒体服务中采集哪些数据呢?为了回答前述问题,需要分析日志数据的以下几个方面:
1.用户使用服务时,他们会执行特定的动作,如阅读文章、查看图片、标记照片,以及分享状态的更新。当我们问自己用户在做什么以及对这些动作的描述时,用户(经过匿名化处理)的身份是我们希望知道的。
2.我们还需要知道用户执行这些动作的时间。对数据收集来说,亚秒级的时间(毫秒或微秒)通常就足够了。
3.显然,每个动作都可能产生多种元数据片段。例如,如果一个用户赞成或喜欢一个帖子,我们显然希望把那个帖子的唯一标识符和用户动作一起记录下来。
由于每个用户在一段时间内都可能有许多动作,以这种方式记录下来的原始数据最终会占用大量的后台存储空间。在这种情况下,即使是回答一些简单的问题,也需要很长的时间进行处理,而且对于最常见的问题,我们也并不总是需要所有的信息。因此,通常在生产环境中通过自动的ETL过程(提取、转换、加载)创建聚合数据的快照,例如记录用户之间所有关系的社交网络的当前状态、用户创建或共享的Tweet、帖子和照片的数量等,这些聚合数据通常是回答问题的首要信息来源。
尽管需要考虑如何将所有这些数据最好地存储在适当的数据库中,但是这些数据库模式的设计和实现所涉及的科学知识已经超出了本书的范围。我们更愿意聚焦于能够从数据中有所发现的方法,因此我们将使用可以公开获得的来自社交媒体服务的数据来展示如何进行不同类型的分析。
用数据提出和回答问题
我们的目标是在理解社交媒体服务所生成的数据的同时,让读者接触几种未来可能遇到的情况。经验现象研究(不仅仅与社交媒体有关)的常规方法一直遵循着数百年来科学研究的传统:
1.首先是用一般术语提出问题。这尚未涉及对数据的进一步假设,只是形式化地描述了我们想要了解特定行为的哪些方面。例如,“让我们能够预测用户在服务上的会话持续时间的用户重返服务的时序动态是什么?”
2.视情况提出一项关于输出的预期结果的假设。这有助于验证我们的预判是否有意义。此外,如果读者认为自己有一个能够很好地定量描述输出结果的模型,可以加以检验。在提出假设之后,预测一下若假设成立,则结果应该是什么样的。这个步骤是可选的,因为如果我们并不想围绕问题构建模型,并且目标只是通过结果来有所发现,那么可以跳过这个步骤。例如,对步骤1中问题的一个可能的假设是“用户将以随机的方式重返服务,这独立于他们近期是否使用过该服务”。(读者将在第3章中看到这个假设在实际服务中是否成立。)
3. 为了回答步骤1所提出的问题,要确定所采用的分析过程以及需要收集哪些输入数据。虽然在给定计算工具和已有技术时,分析过程通常是显而易见的,但是我们通常有很高的自由度从社交媒体中选择测试数据集。想从用户中抽样还是分析所有用户?准备使用哪个日期范围的数据?要过滤掉某些被认为不需要的动作吗?显然,我们希望尽可能深入地研究数据以保证结果的可信性,如采用不同时间段的数据或不同用户组的数据。例如,对于想要回答的问题(参见步骤1),读者可能希望获取用户在给定月份进行的所有操作的时间戳,然后分析不同时间戳子集的时间差异,从而分析它们的时间相关性。
4.进行数据分析!理想情况下,无论是自己动手,还是别人为你准备好了,数据收集工作都已经完成,所以无须等待数据。如果我们的目的是检验假设,那么还需要进行统计检验。如果只是想了解情况,那么我们获得的分析结果就是所提出的问题的答案。
本书使用的数据集
为了阐明人们的交互行为在社交媒体中产生的可被观察的过程和规律,当然应该使用一些来自这些社交媒体的、可以从Internet不同网站下载的现成数据。尽管大多数社交媒体服务都保持其数据的私有性(隐私问题是首要原因,但数据集可能因此变得十分巨大),一些服务仍将其所有的数据都向公众开放,最著名的是Wikipedia。另外,学术研究人员也通过爬取或数据共享从这些服务收集数据。下面列出了书中使用的数据源。由于可用的数据集是分析的先决条件,我们鼓励读者尝试并丰富这些实例。
我们选择了一些服务,这些服务提供了关于其用户和内容的开放、广泛可用、容易获取的数据集,来展示对于会被问及的问题在实际的社交媒体服务中能够期待何种结果。这些服务应该是大家耳熟能详的,而且我们还希望数据集的大小和时间跨度对用户来说是中等的,从而便于得到有意义的分析结论。为了便于理解全书采用的分析实例,下面将描述我们所采用的数据集。表1给出了我们所使用的实例数据集的简短描述。
表1 本书中使用的数据集的描述和位置
服务主页数据集
Wikipediawikipedia.org修订和页面元信息,无实际文本
Twittertwitter.com平台的Tweet
Stack Exchangescifi.stackexchange.com来自Stack Exchange科幻小说类的问题和问答
LiveJournallivejournal.com有向社交网络连接
Cora数据集来自一个学术搜索引擎的科学文档
MovieLensmovielens.org电影评分示例
亚马逊美食评论亚马逊“美食”的历史评论
注释:Wikipedia和Stack Exchange的内容依据Creative Commons Attribution-ShareAlike 3.0License获得使用许可(https:creativecommons.orglicensesby-sa3.0);
Livejournal数据由Mislove 等人收集,见文献“Measurement and Analysis of Online Social Networks”,IMC 2007(http:socialnetworks.mpi-sws.orgdata-imc2007.html);MovieLens数据集源自GroupLens Research(http:grouplens.orgdatasets
movielens);Cora 数据集由McCallum等人收集,见文献“Automating the Construction of Internet Portals with Machine Learning”,Information Retrieval vol 3,issue 2,2000。
读者可以很方便地获得这些数据集,运行datadownload_all.sh就可以从本书下载站点得到所有数据文件和基于这些数据的示例。(请注意,由于数据集很大,约为50GB~60GB,下载需要较长时间,特别是Wikipedia数据集。)
Wikipedia
我们使用的最大数据集是英文Wikipedia上数百万篇文章的修订历史。Wikipedia是一部合作编辑的百科全书,其英文版在2018年约有570万篇文章,每月约有30万的活跃编辑者(http:en.wikipedia.orgwikiWikipedia:Statistics)。其中文章“Wikipedia”的屏幕截图如图1所示。
图1 在线百科全书Wikipedia中关于Wikipedia自身的条目
Twitter
Twitter(见图2)用户可以发送最多140个字符的状态更新(到2017年为止,当时这个服务增加了状态更新的最大字符长度)。其他“关注”(follow)了发送者的用户,将会在他们的事件列表(timeline)收到这些短消息。图片和短视频也可以附加到状态更新中。许多用户关注新闻来源、名人及他们的朋友和家人。Twitter通常被认为是一个“信息网络”,用户可以关注任何他们想获知其状态更新的用户,而那些用户不必反过来关注他们。
图2 一个典型的Twitter搜索事件列表的截图。Tweet显示在中间,而趋势主题和推荐的关注对象显示在屏幕左侧
我们将通过Twitter的API收集样本用户的数据,并在第1章分析其活动。
Stack Exchange
Stack Exchange(见图3)是遵循提问–回答模式的站点联合网络,其用户可以就不同主题进行提问,其他用户可以回答这些问题并对问题和答案进行投票。这样,用户眼中高质量的内容会升到排行榜的顶部。截至2018年,Stack Exchange网络共由350多个站点组成,涵盖了从软件开发、天文学到扑克的各种主题。其中最著名的是2008年创建的初始站点Stack Overflow,它专注于计算机程序涉及的各个方面。第4章将选取科幻类(Science Fiction & Fantasy)站点,并分析用户提交的帖子的各种属性。该站点是Stack Exchange的热门站点之一。
图3 Stack Exchange提供包括许多话题子站点的提问–回答服务。我们选择了科幻类(Science Fiction & Fantasy)站点,因为(与那些和计算机相关的或专注于数学的类别相比)它在本质上不是纯技术性的,而且用户的数量和内容都相当可观
LiveJournal
LiveJournal(见图4)提供在线日记保管和博客服务,其用户可以与其他用户建立双向或单向的连接。用户的好友可以阅读他们的受保护条目,反之好友的博客帖子也出现在他们的“好友页面”(friends page)上。第2章将使用这个数据集研究社交网络有向连接的结构。
图4 LiveJournal主页,一个鼓励创建社区的博客平台
Cora的科学文献
这是一个较小的数据集,包含了来自Cora搜索引擎的2 410篇科学文献。(这个搜索引擎已被放弃,它是一个专注于计算机科学领域学术出版物的用于概念验证的搜索引擎。)第4章将使用这个数据集来说明用于自然语言文本处理的主题建模方法。这个数据集与R语言的lda包相捆绑,不需要另行下载。
Amazon美食评论
这是一个来自Amazon的包含“美食”评论的数据集,其中包括食品评论摘要、评分和一些用户详细信息。数据集包括到2012年10月为止共10年的数据。详细信息参见https:snap.stanford.edudataweb-FineFoods.html。
MovieLens电影评分
这个数据集包含了来自MovieLens服务(https:movielens.org)的电影评分数据,分值范围从1到5,包括938位用户对1682部电影的评价。在第6章的示例中将使用这个数据集预测用户在知晓其他相似用户的评价后,如何为一部他们尚未看过的电影打分。
本书使用的语言和框架
本书中的示例主要采用三种程序设计语言和框架编写:R、Python和Scalding。使用R语言是因为它在统计、机器学习和图形图像方面的出色性能;使用Python是因为它在预处理大型数据集和调用服务的API接口两个方面的简便、快速;而使用Scalding是因为它对在MapReduce上执行分布式运算任务而言是一个灵活稳定的框架。
总之,我们认为这些工具对数据挖掘任务而言也是非常有用的。因此,我们假定读者已经熟悉它们,或者至少能够理解用这些语言所编写的代码。它们为面向数据的算法原型化和快速测试提供了便捷的开发路径,并且借助广泛的社区支持,关于它们的几乎所有常见的技术挑战都能够在在线论坛上获得答案。
本书中示例代码的标题使用了示例的源代码文件名(除非代码段非常短)。相应源文件在本书代码库的srcchapterX子目录下,其中X表示代码示例出现的章节。
注释:有关下载文件的信息,请参阅本节结尾处的“源代码”部分。
这些脚本默认为在代码库所提取的目录下执行,无须将默认目录更改为它们所在的位置:例如,若只下载Wikipedia数据集,读者可以运行:srcchapter1wikipediaget_data.sh;为预处理Stack Exchange数据集,读者可以运行:python srcchapter4process_stackexchange_xml.py(我们将在后面的相应章节中解释这些特定脚本的功能)。
R语言
R是一种面向统计的程序设计语言,它不仅在统计学家中流行,在其他学科希望进行数据分析的专业人士中同样很受欢迎。这主要是因为R编程社区开发了大量的程序库:在CRAN任务视图页面(http:cran.r-project.orgwebviews)按照学科分类浏览可用的程序库时,我们会在包含众多类别的列表中发现计量经济学、金融学、遗传学、社会科学和Web技术。由于R是开源免费的,代码共享文化吸引了来自世界各地的开发者贡献社区开发的代码库,推动了R语言生态系统的繁荣发展。关于R的社区同样活跃,至少对于常见问题很容易找到答案。(然而,有时候网络搜索会成为一个挑战,因为字母“R”有时在其他文档中同样常见,所以最好试试rseek.org!)
对于那些还不熟悉这种语言的人来说,R的语法可能看起来有点吓人:R横跨函数式编程风格和命令式编程风格,同时借鉴了这两种范式。要掌握R语言很困难,但值得去学习它。官方的R语言教程可从http:cran.rproject.orgdocmanualsR-intro.pdf下载,这个教程是熟悉该语言的良好途径,掌握该教程足以理解本书使用的示例。R提供的强大资产之一是它的数据存储机制,称为数据帧(data frame),其中与数据有关的记录可以存储在矩阵的命名列中(列可以保存任意类型的向量,而不仅仅是数值类型)。
下载和安装基本的R系统是一个简单的过程。Linux、Mac OS X和Windows版本的R均可在http:cran.r-project.org下载。安装页面上的说明文档很好理解,所以我们觉得没有必要在这里重复这些步骤,如果按照 “运行示例的系统需求”一节中的步骤操作,读者甚至不需要手动安装。我们需要提醒的是,使用R的集成开发环境(IDE)是比较好的选择:虽然R有命令行,但是图形界面更容易使用。两个主要的可选项分别是RStudio(http:www.rstudio.com)和Eclipse的StatET插件(http:www.walware.degotostatet)。前者提供了一键安装方式以及简单的界面,后者为Eclipse用户提供了更好的灵活性,并方便与其他程序设计语言进行集成。
为了运行示例代码,读者还需要在基本的R之上安装一组软件包。表2列出了这些R软件包。下文的“运行示例的系统需求”一节给出了如何轻松安装这些软件包的信息。
表2 本书示例代码中使用的R软件包
R软件包我们使用的功能
ggplot2
scales使用直观的语法从图层构建图形,创建漂亮的绘图
reshape2重构数据帧,在长表和宽表的数据表示形式之间切换
plyr基于列的值对数据分组,在数据块上执行一些聚合操作,并将结果组合成所需形式返回
forecast时间序列预测
Matrix稀疏矩阵包
NMF实现矩阵补全的非负矩阵分解函数
glmnet有效解决逻辑回归问题
ROCR可视化预测任务的性能指标
tm由自然语言文本生成词条–文档矩阵
ggdendro绘制树状图
Wordcloud
dendextend生成词云来可视化文档中的词条
entropy计算分布的熵
lda使用潜在迪利克雷分配(LDA)模型发现文本中的主题
rPython从R调用Python函数——两全其美
Python
尽管R是一个功能强大、通用性强的工具,具有大量的可扩展库,但是分析社交媒体的某些常见任务时,它却不是最佳的选择。我们经常需要清洗、过滤或转换从所关注的服务中收集的数据集。在这种情况下,R被证明并非是最优的,因为R关注的是在内存中进行计算,所以当我们想利用R语言处理有时间戳的用户一年所产生的数据中一个星期的部分时,就需要首先读取整个数据集,然后使用一些过滤器来限制数据范围。很多时候,考虑到所遇到的数据的量级,这个任务在个人计算机的RAM中是不可能完成的。
为了进一步分析中型至大型数据集,还有更好的选择进行预处理或者聚合。我们在示例代码中使用的另一种程序设计语言是Python,就开发脚本所需要的时间而言,它是一种高效的编程语言。它也是世界上使用最广泛的编程语言之一,其周围同样有一个极其活跃的开发社区。与R语言类似,Python也有大量的开源模块可用,于是也可以很容易地检查代码的使用情况。本书使用的模块如表3所示。
表3 本书示例代码中使用的Python软件包
Python模块我们使用的功能
matplotlib绘图
networkx
python-igraph存储、遍历和绘制图
nltk将文档token化并将单词词干化
beautifulsoup4预处理包含HTML标签的文本
tweepy从Twitter API获取tweet
scipy
numpy通用科学及数值计算库
在SciPy、NumPy、matplotlib和pandas等库的支持下,Python是一个功能强大的机器学习和分析平台。然而,由于采用R语言完成了大部分任务,我们将主要使用Python语言的核心功能和少量的附加模块。如前所述,当对数据集进行简单的转换时,Python非常适合流式处理(stream-processing)中等大小的数据集。当任务更“底层”(low level)、更接近传统的面向过程程序设计时, Python通常是比R更好的工具。Python的语法类似于伪代码,因此我们相信,即使没有深入的Python经验,只要了解Python的列表(list)和字典(dictionary)两个基本概念,也是可读懂示例代码的。(另外,官方的Python教程也是很好的开始,可以在https:docs.python.org2tutorial获得。)运行示例代码需要Python 2.7版,在下文的“运行示例的系统要求”一节中同样描述了如何安装Python。
数据分析过程通常会分为若干步骤,后续步骤建立在之前结果的基础之上。让我们看一个小例子:假定我们希望确定一个小型社交网络中所有度(邻居数)大于1的节点之间的最短路径长度的分布。这个问题的处理步骤应该是:加载网络、过滤度大于1的节点、计算所有节点间的最短路径、由计算结果生成分布图。如果要处理一个相当大的网络,计算最短路径会需要很长时间,可能还需要从源数据文件中读取和建立网络。最简单的方式是写一个包含所有步骤的Python脚本,然后一并执行。然而,在分析过程中,我们经常会犯错或者忘记一些想要包含的内容。例如,在绘制了分布图之后,我们觉得不仅要把结果绘制在屏幕上,而且要有一个输出文件。在这种情况下,必须修改脚本并再次执行所有代价高昂的计算。
因此,使用交互式Python控制台几乎在所有情况下都是更好的选择,我们可以在发出Python命令的同时将所有变量保存在内存中。内置的Python控制台可以很方便地支持这种工作方式(通过运行Python启动)。然而,它还有更强大的版本ipython(https:ipython.org)和Jupyter Notebook(http:jupyter.org),它们提供了许多附加的辅助功能,如变量名补全(variable name completion)、命令历史搜索、嵌入式和交互式绘图以及并行计算(http:ipython.orgipython-docdevparallel)。虽然我们在本书中没有使用,但是后者对于在CPU内核上花费很长时间的计算是有益的。
对于Python,还有很多IDE可供选择——有关列表,请参阅https:wiki.python.orgmoinIntegratedDevelopmentEnvironments。图5显示了一个简单的基于控制台的IPython会话。
图5 一个带绘图的交互式IPython会话
Scalding
本书第5章将侧重于处理大型数据集的算法,这种大型数据集是分析社交媒体服务日志时经常面对的。本书中大多数示例问题,在单机的单个处理器上运行就足够了,但某些时候处理过程可能需要几个小时。而实际上,当处理由几百万个用户生成的活动数据时,我们几乎总是采用分布式计算来解决问题。
当前,我们见证了在面向大规模数据处理的开发工具和框架方面所取得的前所未有的进展,新的框架、工具和数据库常常在几年内就会使前代产品过时。然而,MapReduce模型已经成为在成百上千台计算机上批量处理大型数据集的主导模型,因为它具有扩展到大型数据中心的能力,并且具有兼容单个服务器故障的弹性,这是大量计算机被昼夜不停地同时使用时必然会出现的情况(开源世界已经拥抱了它基于Java的实现——Hadoop)。这项技术长期以来一直是分布式数据处理的可靠平台,而今已有各种基于它的成熟的解决方案。了解这些解决方案的思想有助于处理日常所面对的大量用户生成的数据。
尽管MapReduce是位于计算机集群之上的“引擎”,但其最基本的形式并不便于编写分析性任务。尽管许多对社交媒体数据的操作可以直接在最基本的MapReduce框架下编写,但转换为更高层次的任务形式是更好的选择,这样使得这些操作的表达更为自然,也更接近我们的日常思维。Scalding(可在https:github.comtwitterscalding获得)是这些框架中的一个,它使你能够使用Scala程序设计语言来构建用于分析社交媒体日志数据的数据处理流水线(pipeline)。我们希望通过Scaling展示一些基本的想法和设计模式,使我们能够对来自社交媒体服务的大型数据集进行精确的近似计算。
运行示例的系统需求
我们在Ubuntu Linux操作系统(18.04 LTS发行版)上开发和运行本书中的示例。如果读者使用其他的操作系统,特别是Windows,我们建议建立单独的开发环境,或者使用Ubuntu 18.04 LTS系统的虚拟机,或者采用流行的在线云主机服务,来准备一个安装了Ubuntu 18.04 LTS系统的实例。
在得到我们为本书提供的源码库之后,读者可以把它解压到指定目录下,并在该目录下运行setupsetup.sh来安装所需要的系统、R和Python程序包,以便能够运行书中给出的源代码。
此外,如前所述,还需要执行datadownload_all.sh脚本以获取示例所需的数据文件。请在执行任何示例之前运行此脚本一次。如前所述,这些数据文件需要占用大约60 GB的磁盘空间。
章节概览
本书围绕着如何探索和理解社交媒体系统的基本组成部分进行组织,简单地说来就是谁(who)、如何(how)、何时(when)和什么(what)构成了社交媒体过程。因为社交媒体本质上是人们聚集在不同网站上的讨论、娱乐和分享,所以我们将从用户的角度来看待这些主题。他们是谁?他们是如何连接的?他们是什么时候产生关联的?最后,他们作为一个集体所创造和消费的内容是什么样子的?
第1章讨论了通常问到的关于服务的用户的一个最重要的问题:它的用户有多活跃?我们将探索这些服务中所特有的人类活动的普遍方面,以及为什么一些用户之间会存在如此巨大的差异,本章采用来自Wikipedia和Twitter的度量结果分析这些差异。
第2章描述了社交媒体服务提供的另一个重要设施——社交网络。这个术语有时被用来表示整个服务。但是,该章主要关注有向连接的图(如在Wikipedia、Twitter和LiveJournal所看到的)以及我们可以从中发现的规律。
第3章是关于事件在何时发生的章节。我们在Twitter和Wikipedia收集时间数据,并查看这些站点中用户行为的时间戳告诉了我们什么。我们还将结果与通常在动态系统中成立的基本假设预期进行比较,并介绍进行时间序列预测的基本技术。
第4章回顾了自然语言处理技术的低级和高级方法,帮助读者理解人们在文本形式的帖子中谈论什么。除准备了基本的文本数据之外,我们还描述了文本的统计特性,并使用多种算法在帖子中寻找主题,使用的数据包括从Stack Exchange问答站点收集的帖子和在Cora上发表的文章。
第5章介绍分析大型数据集的挑战,大型数据集在社交媒体研究中普遍存在。在介绍MapReduce技术之后,读者会看到使用Scalding框架处理大型人类行为数据时通用程序设计模式的示例代码。作为扩展知识,该章还将介绍如何使用近似算法以快速获得在精确结果的已知误差范围内的近似解,并简要介绍了在云服务上设置计算机集群以执行并行框架的过程。
第6章的主题是用户推荐,将展示如何用机器学习技术预测人们是否喜欢电影,并对预测结果进行评估。读者还可以检验分析模型,看看它是否有助于对文本条目(电影标题)进行分类。
第7章由浅入深地分析了全书中用于分析不同问题的通用统计模式,以及如何使用类似的分析技术去理解它们。
本书的在线代码库
本书的完整示例源代码可以登录Wiley.com下载,也可以登录华章网站(www.hzbook.com)下载。