python学习IT共论百宝箱

爬取简书百万页面 分析简书用户画像

2017-05-26  本文已影响12120人  hirainchen
爬取简书百万页面 分析简书用户画像

在本文中我会尝试如何从0数据开始到获取百万页面,进行用户数据分析、建模,再数据信息化、可视化,生成用户画像分析用户特征。

缘起:几个月前正式进驻简书平台,不由的想了解下在这个平台上聚集的都是些什么人,有哪些人跟我 臭味相投 品味相似。作为技术人,首先想到是用一些技术手段来分析,看到简书上有不少爬虫、数据分析技术文章,不由的技痒,于是便有了自造轮子的想法。

本文会谈及以下内容:


大纲


用户画像概述(是什么,有什么用,怎么做)

用户画像是根据用户基本属性、社会属性、生活习惯和消费行为等信息而抽象出的一个标签化的用户模型。构建用户画像的核心工作即是给用户贴“标签”,而标签是通过对用户信息分析而来的高度精炼的特征标识。

用途

用户画像的作用

用户画像的基本构成

构建用户画像的可以通过四组属性,它们是:用户静态属性、用户动态属性、用户消费属性、用户心理属性

用户静态属性

用户静态属性,是指一些较稳定不会频繁变化的属性,静态属性是用户画像建立的基础,最基本的用户信息记录。如性别、年龄、学历、角色、收入、地域、婚姻状态等。

用户动态属性

用户动态属性,动态属性指具有可变性,如用户的兴趣爱好、在互联网上的活动行为特征。

用户心理属性

用户心理属性,心理属性指用户在环境、社会或者交际、感情过程中的心理反应,或者心理活动

用户消费属性

消费属性指用户的消费意向、消费意识、消费心理、消费嗜好等,对用户的消费有个全面的数据记录,对用户的消费能力、消费意向、消费等级进行很好的管理。

用户画像类型

用户画像可分为群体用户画像和个体用户画像,前者是抽象的族群代表,表示某一类人的特征,用于分析群体特征;后者是具体到某个个体用户上,表示该用户的特征,用于做个性化分析。

怎么做

说到数据挖掘,是把散乱数据转换成「有价值」信息的过程,数据是可以是数字或者文本内容甚至图像,而信息是有语义的、人脑可理解的报告、图表。

数据挖掘的过程是:获取数据(内部数据库查询、外部网站抓取、购买接口)-> 数据清洗(数据结构化)-> 数据分析(建模、应用算法公式)-> 数据信息化(报表结论、数据可视化)

更具体怎么做,下面我会以简书的真实用户数据为例子展示下。


构建简书用户画像

简书用户数据收集

获取抽样用户数据

作为简书的外部普通用户,也只有通过“数据采集”(网页爬虫)这个途径来获取数据,而据说简书用户上千万,日活过百万,显然全部抓取下来不知何年月,因此进行抽样分析是比较合理的做法。

需要什么样的抽样数据?
显然活跃用户是我们需要的关注。在简书上,活跃用户有2种,一种是大V(粉丝数量多),另外一种是发帖多的,这里我选择了粉丝数量多的这类用户。为什么不选发帖最多的?一个网站的人气一般都是靠大V用户群带动的,这群人产生的内容介于PGC(专业编辑)和UGC(普通用户贡献)之间,他们产生的内容会比较有影响力。而发帖多不代表有影响力,在背后发帖的说不定还可能是脚本程序。

为了使用方便,我使用Ruby 开发了自己的爬虫(简书上有很多介绍Scrapy这个优秀的爬虫框架的使用教程,工具使用自己熟悉的就好),链接规则设置为允许网站首页、用户主页、文章内容页(为了获取评论用户链接)、粉丝列表(followers)、关注列表(following),如图↓

爬虫链接规则设置.png

爬虫启动后会自动抓取符合这些规则的页面,并自动解析页面内链接,保存符合配置规则的链接再进行抓取。

〖Tips:说易行难,为了提高爬虫效率一般我们都会使用多线程,这里面要涉及到并发编程、master-worker调度的工作模式,总而言之,写爬虫不难,但开发一个高效爬虫框架不轻松,建议初学者先掌握使用流行工具框架再去造轮〗

最后爬虫抓取了约31万个页面,其中有11万个用户主页,感觉也够用了,如图

简书用户页面抓取结果.png

增加一个ExtractUserPipeline(Pipeline是我用于在爬虫框架中处理获取页面内容的自定义类,可参考Scrapy的Pipeline概念)来解析提取用户的信息,可使用css selector、正则表达式处理页面内容,得到一个包含用户名称、性别、粉丝数、文章数等基础用户信息的json结构的数据,例如:

用户提取数据example.png

在爬虫框架上运行这个Pipeline,获取到11万份格式好的用户数据样本,作为抽样没有必要使用全部数据,因此我只选取了排行榜上的前10000个数据,按照关键值“followers_count”来排序,最后得到了一份“简书Top 10000 粉丝排行榜” ,如图

简书Top 10000 粉丝排行榜.png

〖Tips:一开始我是使用1000条数据,数据量时少方便调整模型和算法参数,跑一次最多几十分钟,到最后要出结论报表时才使用10000用户数据,会涉及近70万文章页面,这时每跑一次分析运算都是按小时算的了〗

获取用户发表内容,提取用户关键词

观其“言行举止”是了解一个人的办法,在简书上,用户“发声”的自然就是其发布的文章,因此需要获取用户发表过的文章内容是收集下一个特征数据的基础。

简书给出了第一个“难题”:用户的文章列表使用AJAX翻页,普通爬虫无法直接获取分页列表。这种问题一般有两种解决:一是查看Network请求,通过编程拼接出所请求的url;二是使用headless browser(如 PhantomJS/Selenium/SlimerJS/Chrome headless)。使用headless browser比较通用但运行效率低,而简书的分页规则也只是最简的分页数+1,所以我的解决办法是添加一个Pipeline,在获取到一个列表页时执行分析拼接出下一页的链接加入待抓取页面列表。

开启爬虫服务对这1万个用户链接进行爬取,跑完能得到约60万个内容页、7万个列表分页,再加上前面的抓取的31万,多达到100万个页面,为家里的网络带宽心疼一下下。

简书内容页面抓取结果-数量.png

另外,从爬虫框架对简书的抓取结果的分析报告中,发现简书的网页响应都很快,平均每个页面300ms,97%的页面都能秒开,只有15%的页面打开在300ms以上,而超过3秒以上的几乎是0%,赞!

简书内容页面抓取结果-分析.png

〖Tips:有少量用户约50个在抓取时返回404,可能被简书关闭了帐号,所以下面出现分析报表中并不是完整的10000整数〗

一篇内容页中除了正文,还有很多重复的“装饰”语,如简书每个内容页面都有“赞赏支持”、“关注”、“登录” 等词,如果都无差别收录显然会是出现最高频次、却是对文章表述毫无意义的词,因此需要先提取出正文内容,再对正文进行分词才合理。最简单的做法是使用正则、css selector提取即可。我使用了密度算法,不需要编写正则,把密度高部分作为正文对待,这样无论是什么类型的内容页、网页改版页面结构变更了都能处理了。

中文NLP(自然语言处理)中第一步就是中文分词,从最简单的机械分词(各种MM算法)到复杂的神经网络分词算法,需要处理歧义识别、新词发现;另外再好的分词算法也需要有2份词典,一个是专用词典,一个是停用词典。有时会感叹英文国家的NLP技术发展那么快是因为英文分词门槛低吗?好在现在开源分词库也不少,效果各有特点,选则自己熟悉的即可。

从每篇文章提取出20个词频出现最高的词作为文章关键词,效果如下图

内容页分词.png

在二十几篇文章中,只有一篇出现了“关注”这个词,说明这个作者真的有在求关注。

对每个用户,再合并其所有文章内容中的关键词,并统计重复次数作为词频,按词频高低取前100个,这份数据作为该用户的“常用词”。

〖Tips:这是很重要的一份特征数据,对后面的用户性别、兴趣爱好分析都要使用到〗

现在我们先看一下 简书CEO 简叔 的常用词的词云 是什么样:

简书CEO 简叔 词云.png

词云显示他喜欢聊“秘密”,关注“简书”,“创业”、“团队”、“产品”、“写作”,“平台”、“互联网”,“作者”。
我会猜他有很多“想法”,平时喜欢去“咖啡厅”找“创作”的“灵感”,要在“上海”或“北京“找个“办公室”组建一个“创业”“团队”,做一个基于“互联网”的“文章” “写作” “内容” “平台”,“产品”叫“简书”或“jianshu”,会招揽很多“作者” 并保护他们的“著作权”,提供“手机”“app”的“下载”,得了“苹果” 的“优秀” “设计” “推荐”,求“群友”多“交流”多“关注”,求“打赏”求“评论”。

(哈哈 以上完全瞎猜,我对“简叔”的认识只有这2个字)

最后再统计下所有用户的关键词使用的比率,得到 “简书用户常用词 Top 100排行榜”

简书用户常用词 Top 100排行榜.png

现在简单分析下前20个词,可以发现简书上的用户每书写100个词时,就有2次提及“作者”、“简书”,关心“著作权”,表明写作意愿很强烈,也关注平台自身,符合简书打造写作平台本身的定位;常谈论“生活”、“工作”,常说“选择”,很在意“时间”,说明在职人士应该是主要用户;喜欢谈“喜欢”什么、谈“感觉”、常会说“故事”,文艺味很浓;做事讲究“方法”,有大堆的“世界”观、“人生”观,说明大部分用户教育程度比较高(大学);有“孩子”、喜欢晒“图片”的用户估计占比也很高,继而可以推测主要的用户年龄段在24-36(23大学毕业,36以上是中年)之间;喜欢讨论“app”,符合移动互联网的时代特征;关注“学习”,在这个社区推“知识付费”学习课程准是一呼百应。

以上纯粹直观印象不算结论。

另外,为了能搭上这里“文艺”的氛围,特意献上一份 “简书用户常用词 Top 100词云图.png”,大家看看 “感觉”是否“喜欢”:

简书用户常用词 Top 100词云图.png

下面再继续看看如何获取其他的用户属性特征。

性别分析

性别是用户最基础的静态属性之一,作为人类自然体上最大基因差异特征,对用户言行举止、思想决策有莫大的影响,因此性别分析几乎是所有领域都需要研究分析的。

但简书这里留了第二个“难题”:性别是选填,大部分用户留空。

看下现在的用户性别比率统计:

简书用户性别比率-预测前.png

在这10000人中,75%是未知的,剩下已知的男女各占一半。感觉玩不下去了 。

幸好现在是机器学习时代,可以使用机器学习,对用户的特征行为进行学习,从而对用户进行性别预测。
前面说了人类性别对其言行有莫大影响,因此我使用“用户常用词”作为输入特征,来预测用户性别。

性别分类是典型的二分类问题,可以使用朴素贝叶斯、决策树、SVM等有监督学习的分类算法,我选择了朴素贝叶斯,NBC模型所需的参数很少,对缺失数据不太敏感,算法也比较简单,结果还挺有效。

机器学习过程有4步:1,特征工程;2,训练;3,测试及评估;4,预测;

一开始使用1000个用户数量进行练习时,得到的性别数量很少,不足够训练出一个可信任的分类模型。
经简书上的Python爬虫大师 @向右奔跑 提醒,简书用户公开信息上会有新浪微博的链接,而新浪微博上有用户性别信息。
尝试了一轮,发现只有部分用户会有新浪微博链接,而新浪微博却有个业界知名的反爬系统,必需降频率抓取,成效不是很高。最后使用10000个用户数据时感觉训练数据量已经足够。

训练集准备好后,就可以构建分类器,把已知性别和对应用户的常用词,作为标签和特征值,进行训练,如图:

用户性别预测-训练.png

分类器训练完后,要对训练好的模型进行准确率评估,意思是看看预测结果靠不靠谱。
我在这里使用了“F1 Score”,简单科普下:

F1分数(F1 Score),是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的准确率和召回率。F1分数可以看作是模型准确率和召回率的一种加权平均,它的最大值是1,最小值是0。

简单来说,F1分数是个加权平均值,越接近1表示预测结果越准确。

测试的结果如下:

用户性别预测-结果评估1.png

分数略低,经过一番调整参数重新训练后,得到

用户性别预测-结果评估2.png

现在的F1 分数 为 “0.864”,实际测试有 87.6% 的准确率,感觉分类模型已经可用了。

做下抽样检查,看到对程序员的性别识别还是比较准确性

用户性别预测-结果抽样.png

使用训练好的模型,尝试对所有未知用户性别进行预测:

用户性别预测-预测未知性别结果.png

应用预测结果,并查看最终的性别比率图表:

简书用户性别比率-预测后.png

以10000个简书用户为样本的抽样调查中,女性占58.1% 男性占 41.9%。

原来简书女性用户那么多的吗,真是万万没想到,第一次来到一个女性用户比男性高的社区,有点小紧张,怎么装做经常来的样子 。

爱好分析

有了一份静态属性的特征数据,我们继续看看动态属性中的“兴趣爱好”要如何提取分析。

在这里我给“爱好”和“兴趣”做了细分定义,爱好跟兴趣的区别:爱好是固定分类,兴趣是动态词条,例如可以是热门头条话题;爱好不会轻易消亡,兴趣会随时间降低关注热情;爱好是“做什么”、“某一类事物”,例如“读书”,“文学”;兴趣是“某个具体事物”,如某本书、某个明星人物;爱好是频繁是去做的事情,兴趣可能只是一时的心血来潮偶尔接触一次。

一个人如果对某个事物喜爱,便会经常提及;如果只是某天一时感兴趣了,可能会某一篇文章里会反复提及此事物,但不会出现频繁在其他文章中提及。
基于这个理论,我们可以把用户的所有文章的常用词中出现的一些关键词定性,例如他的大部分文章出现了“减肥”这个词,那么这个用户应该是很在意“减肥”这个事;如果他只是在某1、2篇文章里提及“减肥”,这个词甚至都有可能不会出现在他的常用词榜内。

爱好作为分类信息,需要构建一个爱好词典,再使用用户常用词进行匹配,最后给用户打上所匹配的分类标签。

我整理了一个600多个分类的爱好词典,常见的爱好都应该包含了:

爱好词典-example.png

〖Tips:亮点自找〗

对每个用户进行爱好分类,可以得到一个用户爱好排行榜:

简书用户爱好 Top 100排行榜.png

简单分析下:
“学习”在所有爱好中有15%,在用户中占55.6%,也就说简书大部分用户都是爱“学习”,学习氛围浓厚,简书可以组织一些学习为主题的交流活动,至少一半用户会马上感兴趣,至少可优先发邮件通知下;
有27%的用户爱好“写作”,符合”二八”定律分布,一个内容平台总得有大量读者型的用户来围观点赞、打赏,写作型的用户才有动力继续写作;
“阅读”、“读书”、“电影”、都占了20%以上,这个感觉是要跟豆瓣的目标用户重叠的节奏了,所以要从同样以读书、电影(影评)为核心的豆瓣上抢用户,简书运营者要花不少力气。

现在可以使用爱好标签来聚合用户了,比如有什么电影节活动时,可以打了“爱好:电影” 这样标签的用户发个早鸟票什么的,用户会感觉怎么我昨天才看到电影海报的文章今天就收到预售票通知,其他用户还没有,好智能、好贴心、好嗨森。

但只如果是做为简单的分类标签,聚合的粒度会比较粗糙,比如说有4个用户:

显然对于A,他跟用户B、C的爱好相似度(有2项目重合)会大于 用户D(只有一项重合),但实际上A、B、C三个人的对读书的喜爱程度是不一样,那么对于A,他跟B、C之间,谁的爱好相似会更接近呢?系统要给A推荐时B和C时,首先要推荐哪个?

为了解决这个问题,我引入一个“爱好喜好指数”(Hobbies Favor Index)的概念,可以给用户的每个爱好打分,分值范围是1-10分,10分表示“十分热爱”,1分表示“一般般”,计算时使用用户常用词的词频作为输入,跟他所用的其他词根据词频做排位进行比较得到分位值再除以10收敛,得到1到10分,结果使用雷达图表做数据呈现,得到一个“用户爱好雷达图”,如图:

用户爱好雷达图-example.png

通过雷达图我们可以很直观的了解这个用户的爱好分布,以及每一项爱好的喜好程度,再与其他用户做比较也有了基础:重叠面积越多的越表示爱好越相近,被推荐的排名则越靠前,如图:

用户爱好相似推荐-example.png

终于可以知道简书上谁跟我最 臭味相投 品味相近了!

至此,我得到了第三份简书用户特征数据-爱好分类。

关键兴趣分析

用户兴趣会很广泛,要分析每一项兴趣十分耗时耗力,特别作为运营平台,不大可能也不值得花太多时间精力分析一些跟平台运营方向无关的数据(所以这就是我们要有针对性建模的原因),对于简书来说,读书、写作显然是最需要关注的点,因此什么用户的食物口味、喜欢看什么漫画类型这些非核心、关键的特征,没有太多必要去做收集和分析。所以,我们要做的是〖关键〗兴趣分析,“简书”里也有个“书”字,我就以“书籍”作为关键兴趣,尝试进行分析。

书籍数据收集,最简单,但却不容易。

“简单”是说数据提取可直接用正则匹配文章正文中用书名号《》包含的内容,但事实上从最初提取到的数据上发现书名号内的不止是书名,还有电影名、电视节目、文章标题、app名称等,甚至有人喜欢用《简书》这样来引用简书,因此需要进行数据清洗;有些书名中会包含问号?感叹号!,写正则匹配处理也比较麻烦;最保守的做法是使用专用词典,但词典的创建和更新也是有些工作量,不够“智能”。
另外,还有些人喜欢使用“不合法”的标点符号来引用书籍名称,例如【】、「」、『』、〖〗,我觉得很有必要呼应响应《标点符号用法 - 中华人民共和国教育部》这个规范:

标点符号用法 - 中华人民共和国教育部.png

使用双书名的正确姿势应该是:

书刊电影名:
已在中国出版发行的作品(报纸、杂志、图书、名章、电影、电视节目、电子游戏、歌曲、戏剧等),请务必核实官方译名。上述类型的作品名翻译为中文时均使用书名号《》,使用外文时斜体、不加书名号,首次在文中出现时,请在译名的后面加括号注上原文。
例如:电影《黑暗骑士崛起》(The Dark Knight Rises)首映式发生枪击案。

为了解决干扰词问题,我创建了一个书籍专用停用词库,内容类似 :

简书
百词斩
扇贝单词
首页投稿
首页热门
网易云音乐
网易公开课
简书连载作品龙虎榜
世界互联网大会|xxxxxx

生活中每个人对某个事物的喜好程度是不一样的,为了能做量化和计算比较,我定义了一个“兴趣点数”概念,跟之前“爱好喜好指数”相似,也是1到10分(参考豆瓣的10分制,但10分制有精度问题,在最后的问题章节里有说明),10分就表示“十分喜爱”,使用书籍名出现的频率作为输入值进行换算,这样能得到每个用户的“喜爱书籍排行榜”,方便最后做用户个性化推荐分析。

添加一个Pipeline用于收集用户文章中出现的书名,运行Pipeline后,得到每个用户的书籍列表,把兴趣点数用5星条显示,便可以很直观的看出用户对书籍的喜爱程度,如图:

兴趣点数-example.png

在数据分析框架上能自动将所有用户的书籍汇总统计比率,便得到了“简书用户喜爱书籍 Top 100 排行榜”:

简书用户喜爱书籍 Top 100 排行榜.png

榜首是《红楼梦》,15%的用户比率,说明每10个简书用户里就有1个人喜欢《红楼梦》,遇到心仪的女性用户没有话题时,说些红学关键词说不定就能引起共鸣;
第2位是《西游记》,这个我相信用户看的更多是电视剧,国产少有精品;
第3的《欢乐颂》虽说也有书籍(豆瓣上6.7分),但出现在这个排名绝对是因为作为同名电视剧而被用户提及;
排名4、5、6的《论语》、《圣经》、《诗经》,也有10%的用户比率,让我不得不确认简书是文青聚集地,国学当道;
四大名著除了《水浒传》其他三本都进了前10;
而我所喜欢的《三体》也进入了前20比较欣慰,硬科幻终于火一把了;

结合用户性别,还可以到得出2份报表:

〖Tips:榜单不一一贴出了,但这2份数据在后面的构建网站群体用户画像时会用到〗

影评也是写作的好素材,也容易产生话题效应,因此也可以作为简书用户的关键兴趣之一,再说我也很喜欢看电影 。

已经使用爬虫抓取到一些流行电影数据(如图),以后再做分析。

电影数据-example.png

「重点来了」简书用户数据分析及预测 - 数据可视化、输出报表、趋势预测

构建网站群体用户画像

网站的群体用户画像,可以用来表示这个网站的大部分用户的共同属性特征、行为特征,对于网站运营者可以直观的了解自己的用户群体概括。

使用前面步骤得到的“简书用户常用词 Top 100排行榜”以及“简书用户喜爱书籍 Top 100 排行榜” 2份数据,在分析系统里中创建一个虚拟用户进行分析,下面是见证奇迹的时刻:

分析简书整体用户群体画像.gif

得到“简书整体用户群体画像”:

简书整体用户群体画像.png

从得到的画像上看,预测的性别是女性,说明用户中女性占多,这个跟前面用户性别比率分析中女性占多这个结果是一致的;
大部分人的爱好是:阅读、电影、读书、写作、学习,因此还可以从这几个爱好进行更细致的建模,采集更多的用户特征数据;
用户最喜爱的书籍是:《西游记》、《小王子》、《红楼梦》、《欢乐颂》、《论语》、《平凡的世界》等,可以围绕些做话题活动;

下面再根据性别特征来细分出2个用户群体:男性和女性群体用户画像。

简书男性群体用户画像.png 简书女性群体用户画像.png

当然还可以按其他属性如年龄、某类爱好、区域等,这些都需要建模并收集获取到辅助分析的特征数据。

〖Tips:分析系统在汇总男、女性用户的关键词、书籍数据时,会自动忽略每个用户的词频数据,相当于一人一票机制,每个人都对关键词投票,但一个词只投一票,这样得到的词频和排名才合理〗

网站个体用户画像

典型男性用户例子及分析 彭小六.png

他的爱好是:书籍、读书、写作、阅读、学习;文章提及过500多本书籍,其中比较喜欢的书籍是:《如何阅读一本书》、《让未来现在就来》、《影响力》、《这样读书就够了》、《颠覆平庸》

再找一个女性用户画像例子,大V女性用户有一位【简黛玉】:

典型女性用户例子及分析 简黛玉.png

看得到她的爱好相当广泛,但实际上这是个非自然人帐号,专门收录一些简书不同作者的精彩文章做推荐,所以表现出来的特征会比较宽泛,这个正好可以代表简书官方PGC(专业编辑内容)的倾向,可以大概看出简书官方的内容引导倾向是以哪些类型的文章为主。

用户推荐

为了增加用户粘性,提高内容爆光率,进行营销活动推广,网站可以使用一些推荐系统,可针对群组推荐,更好的做法是千人千面的个性化推荐,细致到可针对每一个用户的喜好、关注点进行推荐。

推荐系统可以使用一些推荐算法如:个性化标签;协同过滤(UserCF/ItermCF)等。这里我简单的使用个性化标签和基于用户推荐的理念来演示下可以如何做个性化推荐。

在协同推荐理论中,要给用户推荐他感兴趣的内容,可以从跟他爱好相近的用户入手。

通过爱好标签的聚合运算,跟“彭小六”爱好最相近的用户有这些,如图中右侧列表:

典型男性用户例子及分析-相似用户列表.png

看下分析系统推荐的第一个用户“用时间酿酒”跟他的爱好会有多相近:

典型男性用户例子及分析-相似用户雷达图.png

看得出他们都爱好 书籍、读书、写作、阅读、学习,而且各项爱好的喜好程度也相近(爱好雷达图的重叠面积大)。

再看下这个被推荐出来的用户的自身的用户画像:

典型男性用户例子及分析-相似用户首推.png

可以看到两个人的感兴趣的书籍也非常接近。

那么推荐系统在做个性化推荐时,就可以把用户“用时间酿酒” 比较喜欢的书籍(例如Top1的《哪有没时间这回事》),推荐给用户“彭小六”。基于同样的原理,可以把这个用户收藏的文章、打赏过的文章,推荐给“彭小六”。

至此,我们从0数据开始,通过百万页面抓取,到获取了10000个抽样用户数据,生成了一些用户特征属性,构建了群体和个体的用户画像,大概了解到了简书整体用户群体特征,能知道某个具体用户的兴趣爱好特征,也知道要应该如何给用户推荐个性化内容。

存在问题

在整个数据挖掘过程中,发现一些问题还有待完善:

涉及工具

下期预告

上一篇下一篇

猜你喜欢

热点阅读