近日,微信迎来重要更新,允许用户自定义“发现”页面。不知道从什么时候开始,微信的朋友圈越来越复杂了。当越来越多的人选择“只展示最近三天的朋友圈”时??,就连微信官方的脸也无奈了。友情的逐渐泛化,让微信从熟人社交逐渐过渡到陌生人社交,朋友圈里真实虚幻的状态更新似乎都在努力证明每个人都“有趣”。有人选择在朋友圈记录生活细节,有人选择在朋友圈展示观点的异同,但说到底,人无时无刻不在窥探别人的生活,只是害怕而已其他人会对自己的生活了解太多。人性中的光明与黑暗交织在一起,就像一只长满刺的刺猬。离得太远会觉得冷,离得太近又怕被荆棘刺伤。朋友圈就像过年走亲戚一样。就算心里有一万件不开心的事,也总是不愿意撕破脸,或者拉黑对方,或者不给对方看,或者只给对方看最后三天,所以人脉中通讯录越来越多,朋友圈越来越大,却再也没有真正能触动你内心的“小红点”。人类把一个产品做的越来越复杂,然后说它满足不了人类的需求。一开始是没想到的!前言有人说人性远比计算机编程复杂,因为即使是人类最伟大的发明计算机,在面对人类的自然语言时也会慌张。有多少人类语言有歧义?我认为语言是人类最大的误解。人类通常喜欢推测语言背后隐藏的含义。似乎在交流时表达明确的意思会让人丢脸,更何况是网上流行的猜测女友真实意图的案例。在金庸先生的武侠小说《射雕英雄传》中,在信息封锁的南宋,裘千丈的江湖胡言乱语让整个武侠界天翻地覆。其实不是一两句话就说清楚了吗?黄药师、全真七子、江南六怪之间的种种纠葛,哪一个不是误会?一群古今武功惊人的武林高手,怎么就没有半点辨别真假的本事,又因语言引起了多少误会。但即使人类的语言复杂如无字之书,人类仍然可以从这些语言中找到蛛丝马迹。古人有文王“判奏易经”,东方朔有量字占卜。这种带有“迷信”色彩的原始崇拜,就像今天人们对八字的迷信信仰一样。它是人类在几千年的演化过程中经验的不断总结。和训练结果。这样看来,我们的人工智能或许并不是更科学的“迷信”,因为数据和算法让我们不断相信这一切都是真的。生活在数字时代的我们无疑是悲哀的。在试图向他人隐藏真实自我的同时,我们后悔无处可逃。每一根数字神经都与你我紧密相连。你不能指望任何数字设备具有真正的智能,但你生活中的每一刻都在悄悄地被数据反映出来。今天的文章将基于Python分析微信好友的数据。这里选择的维度主要包括:性别、头像、签名、所在地。结果主要以两种形式呈现:图表和词云。其中,文本信息会用到词频分析和情感分析两种方法。俗话说:工欲善其事,必先利其器。在正式开始本文之前,简单介绍一下本文使用的第三方模块:*itchat:微信网页版接口封装了Python版本,本文用于获取微信好友信息。*jieba:Python版的口吃分词,在本文中用于对文本信息进行分词。*matplotlib:Python中的图表绘制模块,本文用于绘制柱状图和饼图*snowlp:Python中的中文分词模块,本文用于对文本信息进行情感判断。*PIL:Python中的一个图像处理模块,本文用于处理图像。*numpy:Python中的一个数值计算模块,与本文的wordcloud模块配合使用。*wordcloud:Python中的词云模块,本文用于绘制词云图。*腾讯优图云:腾讯优图提供的Python版SDK,本文用于人脸识别和提取图片标签信息。以上模块可以通过pip安装。各个模块的详细使用说明请参考各自的文档。数据分析分析微信好友数据的前提是获取好友信息。通过使用itchat模块,这一切都会变得非常简单。我们可以通过下面两行代码实现:itchat.auto_login(hotReload=True)friends=itchat.get_friends(update=True)就像登录网页版微信一样,我们可以通过扫描二维码登录用我们的手机。这里返回的friends对象是一个集合,第一个元素是当前用户。因此,在下面的数据分析过程中,我们始终以friends[1:]作为原始输入数据,集合中的每个元素都是一个字典结构。以我为例,大家可以注意到有Sex、City、Province、HeadImgUrl、Signature这四个字段。我们下面的分析从这四个字段入手:好友性别分析好友性别,我们首先需要获取所有好友的性别信息,这里我们提取每个好友信息的Sex字段,然后统计Male,Female,Unkonw的数量分别。我们将这三个值组装成一个列表,然后使用matplotlib模块绘制饼图。代码实现如下:defanalyseSex(firends):sexs=list(map(lambdax:x['Sex'],friends[1:]))counts=list(map(lambdax:x[1],Counter(sexs).items()))labels=['Unknown','Male','Female']colors=['red','yellowgreen','lightskyblue']plt.figure(figsize=(8,5),dpi=80)plt.axes(aspect=1)plt.pie(counts,#性别统计结果labels=labels,#性别显示标签colors=colors,#饼图区域配色labeldistance=1.1,#labeldistancefromdotdistanceautopct='%3.1f%%',#饼图区域文字格式shadow=false,#饼图是否显示阴影startangle=90,#饼图起始角度pctdistance=0.6#饼图区域文字与文字之间的距离dot)plt.legend(loc='upperright',)plt.title(u'%s微信好友的性别构成'%friends[0]['NickName'])plt.show()这里简单解释一下这段代码。微信中的性别字段有三个值:Unkonw、Male和Female,对应的值分别为0、1、2。这三个不同的值是通过Collection模块中的Counter()进行统计的。items()方法返回一个元组集合,元组的第一维元素代表key,即0,1,2,元组的第二维元素代表数字,元组的集合为sorted,也就是key按照0,1,2的顺序排列,所以通过map()方法可以得到三个不同的值的个数,我们只要传给matplotlib来绘制即可,以及这三个不同值的百分比是通过matplotlib计算出来的。下图是matplotlib绘制的好友性别分布:看到这个结果我并不意外,男女比例严重失衡。虽然这可以解释我单身的原因,但我不认为可以通过调整男女比例来解决问题。很多人认为自己单身是因为交际圈小,那么扩大交际圈是否可以摆脱单身呢?我觉得这可能会增加脱单的概率,但是幸运之神应该不会眷顾我,因为我的好运气早在24岁之前就已经耗尽了。知乎上有个热门话题:现在男人普遍不追求女人了吗?,其实,哪里会有人愿意一个人待着?无非就是害怕一次次失望。有些人不是我的花,我只是恰好路过她绽放。曾有人说我是一个热情的人,但她永远不会知道,我做的每一个决定都是热情而悲壮的。所谓“智之极则伤,情之深则不长久;君子谦和而柔,温润如玉”,世间受五毒之害的人,大概就是这样吧。好友爆头分析好友爆头分析从两个方面进行分析。首先,在这些朋友的头像中,使用人脸头像的朋友比例是多少?第二,从这些朋友的头像中可以提炼出哪些有价值的关键词。这里需要根据HeadImgUrl字段将头像下载到本地,然后使用腾讯优图提供的人脸识别相关API接口检测头像图片中是否有人脸,提取图片中的标签。其中,前者是分类汇总,我们用饼图来呈现结果;后者是对文本进行分析,我们用词云来呈现结果。关键代码如下:defanalyseHeadImage(frineds):#InitPathbasePath=os.path.abspath('.')baseFolder=basePath+'\\HeadImages\\'if(os.path.exists(baseFolder)==False):os.makedirs(baseFolder)#AnalyseImagesfaceApi=FaceAPI()use_face=0not_use_face=0image_tags=''forindexinrange(1,len(friends)):friend=friends[index]#SaveHeadImagesimgFile=baseFolder+'\\Image%s.jpg'%str(index)imgData=itchat.get_head_img(userName=friend['UserName'])if(os.path.exists(imgFile)==False):withopen(imgFile,'wb')asfile:file.write(imgData)#DetectFacestime.sleep(1)result=faceApi.detectFace(imgFile)ifresult==True:use_face+=1else:not_use_face+=1#ExtractTagsresult=faceApi.extractTags(imgFile)image_tags+=','.join(列表(地图(lambdax:x['tag_name'],result)))labels=[u'使用人脸头像',u'不使用人脸头像']counts=[use_face,not_use_face]colors=['red','yellowgreen','lightskyblue']plt.figure(figsize=(8,5),dpi=80)plt.axes(aspect=1)plt.pie(counts,#性别统计结果labels=labels,#gender显示标签colors=colors,#cakeMap区域配色labeldistance=1.1,#labeldistancefromdotdistanceautopct='%3.1f%%',#饼图区域文字格式shadow=False,#饼图是否显示阴影startangle=90,#饼图起始角度pctdistance=0.6#饼图区域文字距离dot)plt.legend(loc='upperright',)plt.title(u'%s微信好友使用人脸头像'%friends[0]['NickName'])plt.show()image_tags=image_tags.encode('iso8859-1').decode('utf-8')back_coloring=np.array(Image.open('face.jpg'))wordcloud=WordCloud(font_path='simfang.ttf',background_color="white",max_words=1200,mask=back_coloring,max_font_size=75,random_state=45,width=800,height=480,margin=15)wordcloud.generate(image_tags)plt.imshow(wordcloud)plt.axis("off")plt.show()这里我们新建一个HeadImages目录在当前目录下创建用来存放所有好友的头像,然后我们这里会用到一个叫FaceApi的类,这个类是腾讯优图的SDK封装的,分别调用人脸检测和图像。标签识别有两个API接口。前者会统计“使用人脸头像”和“不使用人脸头像”的好友数量,后者会将每个头像抽取的标签相加。分析结果如下图所示:可以看出,在所有微信好友中,约有1/4的微信好友使用人脸头像,而近3/4的微信好友没有人脸头像。“自信的人只占好友总数的25%,或者75%的微信好友行事风格低调,不喜欢用人脸做微信头像,这是否意味着“长得好看”皮肤”没有千篇一律,好看的人真的是少数中的少数。因此,当女生的妆容越来越接近“韩式半永久浓扁眉”、“瓜子脸”、“大红唇”时,当男生的打扮越来越接近“大背毛”、“高领毛衣”当我们离“长大衣”越来越近时,我们是否真的可以拥有一次个性。生活中有太多东西被世界绑架了。你必须与其他人不同,同时又与大多数人一样。这就是人生的无奈。考虑到腾讯优图无法真正识别“人脸”,这里我们再次提取好友头像中的标签,帮助我们了解微信好友头像中有哪些关键词。分析结果如图:通过词云我们可以发现,在微信好友的签名词云中,出现频率相对较高的关键词有:女孩、树、房子、文字、截图、卡通、合影,天空,大海。由此可见,在我的微信好友中,好友选择的微信头像主要来自四个来源:日常生活、旅行、风景、截图。、海、房屋、树木。通过观察我所有好友的头像,我发现我的微信好友中,有15人使用个人照片作为微信头像,53人使用网络图片作为微信头像,25人使用动漫图片作为微信头像,25人使用集体照。用图片做微信头像的有3人,用小孩照片做微信头像的有5人,用风景图片做微信头像的有13人,用女生照片做微信头像的有18人,基本一致与图像标签提取的分析结果。.好友签名分析好友签名。签名是好友信息中最丰富的文字信息。根据人类使用的“标签”方法论,签名可以分析某个人在某个时间段内的状态,就像人在开心和悲伤时笑一样有两个标签,哭和笑,分别表示状态快乐和悲伤。这里我们对签名做了两种处理。第一个是用口吃分词对词进行分词后生成词云。目的是了解好友签名中的关键词是什么,哪些关键词出现的频率比较高;第二个是用SnowNLP分析朋友签名中的情绪倾向,即朋友签名总体上是正面的、负面的还是中性的,各自的比例是多少。这里提取签名段即可,其核心代码如下:defanalyseSignature(friends):signatures=''emotions=[]pattern=re.compile("1f\d.+")forfriendinfriends:signature=friend['Signature']if(签名!=无):signature=signature.strip().replace('span','').replace('class','').replace('emoji','')signature=re.sub(r'1f(\d.+)','',signature)if(len(signature)>0):nlp=SnowNLP(signature)emotions.append(nlp.sentiments)signatures+=''.join(jieba.analyse.extract_tags(signature,5))withopen('signatures.txt','wt',encoding='utf-8')asfile:file.write(signatures)#SinatureWordCloudback_coloring=np.array(Image.open('flower.jpg'))wordcloud=文字云(font_path='simfang.ttf',background_color="white",max_words=1200,mask=back_coloring,max_font_size=75,random_state=45,width=960,height=720,margin=15)wordcloud.generate(signatures)plt.imshow(wordcloud)plt.axis("off")plt.show()wordcloud.to_file('signatures.jpg')#SignatureEmotionalJudgmentcount_good=len(list(filter(lambdax:x>0.66,情绪)))count_normal=len(列表(过滤器(lambdax:x>=0.33andx<=0.66,情绪)))count_bad=len(列表(过滤器(lambdax:x<0.33,情绪)))labels=[u'negativenegative',u'neutral',u'positivepositive']values=(count_bad,count_normal,count_good)plt.rcParams['font.sans-serif']=['simHei']plt.rcParams['axes.unicode_minus']=Falseplt.xlabel(u'情绪判断')plt.ylabel(u'频率')plt.xticks(range(3),labels)plt.legend(loc='upperright',)plt.bar(range(3),values,color='rgb')plt.title(u'%s'微信好友签名信息情感分析'%friends[0]['NickName'])plt.show()通过词云,我们可以发现,在微信好友的签名信息中,出现频率相对较高的关键词有:努力、成长、美丽、幸福、生活、幸福、生活、距离、时间、行走。果然,我的微信好友个个都是热情、淳朴的好青年!:smile:其实签名的设置在一定程度上反映了一个人的心态。人在年轻的时候,难免会“对不起写新词”。时光的画面破碎了,也许这就是我们不想让别人知道过去的原因,因为随着人的成长,某一瞬间的状态不忍直视,QQ空间一直陪伴着我们这一代人的整个青春,使得《那年和今天》的感人作用时而让我们感受到回忆的温暖,时而让我们感受到岁月的逝去。“那时候,只是平凡”物是人非,“回头看那一向凄凉的地方”,是淡定从容。、“今何夜”的失落与惆怅……都在这行签名上留下了或深或浅的烙印。知乎上有关于签名的话题讨论,对此感兴趣的朋友不妨找时间看看。:smile:通过直方图我们可以发现,在微信好友的签名信息中,正面情绪判断占比约55.56%,中性情绪判断占比约32.10%,负面情绪判断占比约12.35%。这个结果和我们通过词云展示的结果基本一致,这表明微信好友的签名信息中,约有87.66%的人传达了积极的态度。朋友圈基本上有两类用户。第一类用户通过朋友圈记录自己的生活,第二类用户通过朋友圈输出自己的观点。显然,对于第二类用户来说,它并不介意别人知道它的过去,更关心??它输出的观点是否自始至终一致。所以,不管其他人在朋友圈里发什么美食、旅游、爱情、宝贝、鸡汤等等,在我看来,这就是一种生活方式,精神层面和物质层面都高于你的。很多人觉得你朋友圈里的内容“无聊”,这符合人类一贯的认知方式。在大多数情况下,是那些与你处于同一水平的人,对不熟悉的人或事物做出判断。如果你不喜欢我朋友圈里的内容,请直接拉黑我,因为这样我们还可以做朋友;如果因为喜欢A就跟我说B不好,这真的是三观不合。我相信两个人的利益并不完全匹配,即使是男女朋友或恋人之间,总之,真诚和相互尊重是与人相处的基本要求。好友位置分析好友所在位置,主要是通过抽取Province和City这两个字段。Python中的地图可视化主要是通过Basemap模块。该模块需要从国外网站下载地图信息,使用起来很不方便。百度的ECharts用在前端比较多。虽然社区提供了pyecharts项目,但是我注意到由于政策变化,Echarts不再支持导出图的功能。因此,地图定制仍然是一个问题。主流的技术方案是配置全国所有省市的JSON数据。这里博主使用的是BDP个人版。这是一个零编程解决方案。我们通过Python导出一个CSV文件,然后上传到BDP。只需拖放即可制作可视化地图,再简单不过了,这里我们只展示生成CSV部分的代码:defanalyseLocation(friends):headers=['NickName','Province','City']withopen('location.csv','w',encoding='utf-8',newline='',)ascsvFile:writer=csv.DictWriter(csvFile,headers)writer.writeheader()forfriendinfriends[1:]:row={}row['NickName']=friend['NickName']row['Province']=friend['Province']row['City']=friend['City']writer.writerow(row)图片下面是BDP生成的微信好友的地域分布,可以发现我的微信好友主要集中在宁夏和陕西。数字时代的神经影响着社交关系链中的每一个人,而我们想要保护的隐私,就在这些数据中一点一滴地体现出来。人类或许可以不断地伪装自己,但这些从数据中提炼出来的规则和联系并不会欺骗人类。数学曾被称为最无用的学科,因为生活中不需要神圣纯粹的计算。在不同的学科知识中,经验公式总是比理论公式更常用。但此时此刻,你看,世界就像一个滴答作响的时钟,每一分每一秒都天衣无缝。这篇文章的总结写这篇文章的时候,我不知道如何开始写,因为微信是一个神奇的存在,它是一个国民级的全民APP,所以微信的??产品设计一直是一个有趣的现象.底部标签页数,每个标签页名称,“发现”页面自定义,小程序入口,朋友圈入口到朋友圈评论等一系列设计细节无不对得起我们的人性和心理。即便是被人们封为神明的“张小龙”,面对结构最复杂的中国用户群体,潇洒中依然充满无奈。从他不理朋友圈就可以看出。功能不尽如人意。任何一个生态,当面对庞大的用户群体时,功能的增减都会成为一个问题。正所谓“林中有百鸟”,知乎同样面临着营销的问题公众号,在不断消费社会话题的同时,引导着一批又一批粉丝的价值取向。人类总是渴望别人了解自己,但人类真的了解自己吗?这篇博客是对数据分析的又一次尝试。主要从性别、头像、签名、位置四个维度对微信好友进行简单的数据分析。结果主要以两种形式呈现:图表和词云。一句话,“数据可视化是手段而非目的”。重要的不是我们在这里拍了这些图,而是这些图所反映的现象。我们能得到什么本质的启迪,我的一个朋友问我为什么要抢一切,为什么,因为我不懂人!原文链接:http://blog.csdn.net/qinyuanpei/article/details/79360703
