你好,游客 登录
背景:
阅读新闻

利用python深度分析微信朋友圈好友

[日期:2018-06-14] 来源:  作者: [字体: ]

最近看了wxpy这个包,感觉还不错,分析一下微信的好友。

分析的目的:

1.看看好友的性别占比、地域分布

2.分析好友的个性签名

3.对好友的签名进行情感分析

环境:python 3.6

需要的包wxpy、jieba、snownlp、scipy、wordcloud(这个pip可能直接安装不了,会提示需要c++之类的错误,直接去官网下载whl文件,用pip离线安装就好了,命令:pip install  D:/xxxx/xxxx/xxx.whl把xxx换成你的文件路径)

过程如下:

先导入需要的所有包。利用wxpy的bot()接口,可以获得好友、公众号、群聊等属性,可以完成大部分web端微信的操作,比如自己跟自己聊天,添加好友等。

[python] view plain copy
  1. from wxpy import * 
  2. from snownlp import SnowNLP,sentiment 
  3. import re,jieba 
  4. from scipy.misc import imread 
  5. from wordcloud import WordCloud, ImageColorGenerator,STOPWORDS 
  6. import matplotlib.pyplot as plt 
  7. from collections import Counter 
  8.  
  9. bot=Bot() 
  10. friends=bot.friends()#获得好友对象 
  11. groups=bot.groups()#获得群聊对象 
  12. mps=bot.mps()#获得微信公众号 
  13. print(mps) 
  14. #计算男女性别,画出饼图 
  15. sex_dict={'boy':0,'girl':0,'other':0
  16. for friend in friends: 
  17.     if friend.sex==1
  18.         sex_dict['boy']+=1 
  19.     elif friend.sex==2
  20.         sex_dict['girl']+=1 
  21.     else
  22.         sex_dict['other']+=1 
  23. print('有男生{}个,女生{}个,未知性别{}个'.format(sex_dict['boy'],sex_dict['girl'],sex_dict['other'])) 
  24. labels = ['boy','girl','other'
  25. colors = ['red','yellow','green'
  26. explode = (0.100#最大的突出显示 
  27. plt.figure(figsize=(8,5), dpi=80
  28. plt.axes(aspect=1
  29. plt.pie(sex_dict.values(),explode=explode,labels=labels, autopct='%1.2f%%',colors=colors,labeldistance = 1.1, shadow = True, startangle = 90, pctdistance = 0.6
  30. plt.title("SEX ANALYSIS",bbox=dict(facecolor='g', edgecolor='blue', alpha=0.65 ))#设置标题和标题边框 
  31. plt.savefig("sex_analysis.jpg"
  32. plt.show() 

运行过程中,会弹出二维码,微信扫描登录一下就可以看到下面的图片了。

我的好友男女平均分配,不知道其他人的怎么样。

接下来看好友的地域分布

[python] view plain copy
  1. city=[] 
  2. Municipality=['上海','上海市','北京','北京市','重庆','重庆市','天津','天津市'
  3. for friend in friends: 
  4.     if friend.province  in Municipality: 
  5.         city.append(friend.province)#直辖市直接添加城市 
  6.     else
  7.         city.append(friend.city) 
  8. #print(city.count('上海')) 
  9. counts=dict(Counter(city))#统计各个地区人数 
  10. print(counts) 
  11. df=pd.DataFrame([counts]).T#转成DataFrame方便保存和后面画图,装置成竖排形式 
  12. df.to_excel('city.xlsx'

看地理图,就要请出大名鼎鼎的tableau,一键生成,用matplotlib也可以画地理图,比较麻烦一些而已。

地理图可以很清晰看到好友分布地域和数量。

接下来进行好友签名分析和情感分析

text1=[]
emotions=[]
for friend in friends:
sig=friend.signature.strip()
    newsig=re.sub(re.compile('<.*?>|[0-9]|。|,|!|~|—|”|“|《|》|\?|、|:'), '', sig)#去掉数字标点符号
text1.append(newsig)
    if len(newsig)>0:
sentiments = SnowNLP(newsig).sentiments
        emotions.append(sentiments)
text = "".join(text1)
wordlist=" ".join(jieba.cut(text,cut_all=True))#结巴分词,用空格连接
stopwords = STOPWORDS#设置停用词
bgimg=imread(r'C:\Users\lbship\Desktop\mice.jpg')#设置背景图片
font_path=r'C:\Windows\Fonts\simkai.ttf'
wc = WordCloud(font_path=font_path,  # 设置字体
background_color="white",  # 背景颜色
max_words=2000,  # 词云显示的最大词数
stopwords = stopwords,        # 设置停用词
mask=bgimg,  # 设置背景图片
max_font_size=100,  # 字体最大值
random_state=42,#设置有多少种随机生成状态,即有多少种配色
width=1000, height=860, margin=2,# 设置图片默认的大小,margin为词语边缘距离
).generate(wordlist)
image_colors = ImageColorGenerator(bgimg)#根据图片生成词云颜色
plt.imshow(wc)
plt.axis("off")#不显示坐标尺寸
plt.savefig("sig.jpg")
plt.show()
#情感分析
positive=len(list(i for i in emotions if i>0.66))
normal=len(list(i for i in emotions if i<=0.66 and i>=0.33))
#normal = len(list(filter(lambda x:x>=0.33 and x<=0.66,emotions)))
negative=len(list(i for i in emotions if i<0.33))
labels = ['POSITIVE','NORMAL','NEGATIVE']
values = (positive,normal,negative)
plt.rcParams['font.sans-serif'] = ['simHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title("SENTIMENTS ANALYSIS",fontsize='large',fontweight='bold',bbox=dict(facecolor='blue', edgecolor='yellow', alpha=0.5 ))
plt.xlabel('sentiments analysis')
plt.ylabel('counts')
plt.xticks(range(3),labels)
plt.bar(range(3), values, color = 'rgb')
plt.savefig("sentiment.jpg")
plt.show()

分析的结果如下。

嗯,都是有梦想会努力会坚持会珍惜会幸福会生活懂人生的小伙伴。

朋友圈还是积极向上的朋友比较多。

下面是完整代码:

[python] view plain copy
  1. from wxpy import * 
  2. from snownlp import SnowNLP,sentiment 
  3. import re,jieba 
  4. import pandas as pd 
  5. from scipy.misc import imread 
  6. from wordcloud import WordCloud, ImageColorGenerator,STOPWORDS 
  7. import matplotlib.pyplot as plt 
  8. from collections import Counter 
  9.  
  10. bot=Bot() 
  11. friends=bot.friends()#获得好友对象 
  12. groups=bot.groups()#获得群聊对象 
  13. mps=bot.mps()#获得微信公众号 
  14. print(mps) 
  15. #计算男女性别,画出饼图 
  16. sex_dict={'boy':0,'girl':0,'other':0
  17. for friend in friends: 
  18.     if friend.sex==1
  19.         sex_dict['boy']+=1 
  20.     elif friend.sex==2
  21.         sex_dict['girl']+=1 
  22.     else
  23.         sex_dict['other']+=1 
  24. print('有男生{}个,女生{}个,未知性别{}个'.format(sex_dict['boy'],sex_dict['girl'],sex_dict['other'])) 
  25. labels = ['boy','girl','other'
  26. colors = ['red','yellow','green'
  27. explode = (0.100#最大的突出显示 
  28. plt.figure(figsize=(8,5), dpi=80
  29. plt.axes(aspect=1
  30. plt.pie(sex_dict.values(),explode=explode,labels=labels, autopct='%1.2f%%',colors=colors,labeldistance = 1.1, shadow = True, startangle = 90, pctdistance = 0.6
  31. plt.title("SEX ANALYSIS",bbox=dict(facecolor='g', edgecolor='blue', alpha=0.65 ))#设置标题和标题边框 
  32. plt.savefig("sex_analysis.jpg"
  33. plt.show() 
  34.  
  35. #获取城市分布 
  36. city=[] 
  37. Municipality=['上海','上海市','北京','北京市','重庆','重庆市','天津','天津市'
  38. for friend in friends: 
  39.     if friend.province  in Municipality: 
  40.         city.append(friend.province)#直辖市直接添加城市 
  41.     else
  42.         city.append(friend.city) 
  43. #print(city.count('上海')) 
  44. counts=dict(Counter(city))#统计各个地区人数 
  45. print(counts) 
  46. df=pd.DataFrame([counts]).T#转成DataFrame方便保存和后面画图,装置成竖排形式 
  47. df.to_excel('city.xlsx'
  48. #获取好友签名,生成词云,并进行情感分析 
  49. text1=[] 
  50. emotions=[] 
  51. for friend in friends: 
  52.     sig=friend.signature.strip() 
  53.     newsig=re.sub(re.compile('<.*?>|[0-9]|。|,|!|~|—|”|“|《|》|\?|、|:'), '', sig)#去掉数字标点符号 
  54.     text1.append(newsig) 
  55.     if len(newsig)>0
  56.         sentiments = SnowNLP(newsig).sentiments 
  57.         emotions.append(sentiments) 
  58. text = "".join(text1) 
  59. wordlist=" ".join(jieba.cut(text,cut_all=True))#结巴分词,用空格连接 
  60. stopwords = STOPWORDS#设置停用词 
  61. bgimg=imread(r'C:\Users\lbship\Desktop\mice.jpg')#设置背景图片 
  62. font_path=r'C:\Windows\Fonts\simkai.ttf' 
  63. wc = WordCloud(font_path=font_path,  # 设置字体 
  64.                background_color="white"# 背景颜色 
  65.                max_words=2000# 词云显示的最大词数 
  66.                stopwords = stopwords,        # 设置停用词 
  67.                mask=bgimg,  # 设置背景图片 
  68.                max_font_size=100# 字体最大值 
  69.                random_state=42,#设置有多少种随机生成状态,即有多少种配色 
  70.                width=1000, height=860, margin=2,# 设置图片默认的大小,margin为词语边缘距离 
  71.                ).generate(wordlist) 
  72. image_colors = ImageColorGenerator(bgimg)#根据图片生成词云颜色 
  73. plt.imshow(wc) 
  74. plt.axis("off")#不显示坐标尺寸 
  75. plt.savefig("sig.jpg"
  76. plt.show() 
  77. #情感分析 
  78. positive=len(list(i for i in emotions if i>0.66)) 
  79. normal=len(list(i for i in emotions if i<=0.66 and i>=0.33)) 
  80. #normal = len(list(filter(lambda x:x>=0.33 and x<=0.66,emotions))) 
  81. negative=len(list(i for i in emotions if i<0.33)) 
  82. labels = ['POSITIVE','NORMAL','NEGATIVE'
  83. values = (positive,normal,negative) 
  84. plt.rcParams['font.sans-serif'] = ['simHei'
  85. plt.rcParams['axes.unicode_minus'] = False 
  86. plt.title("SENTIMENTS ANALYSIS",fontsize='large',fontweight='bold',bbox=dict(facecolor='blue', edgecolor='yellow', alpha=0.5 )) 
  87. plt.xlabel('sentiments analysis'
  88. plt.ylabel('counts'
  89. plt.xticks(range(3),labels) 
  90. plt.bar(range(3), values, color = 'rgb'
  91. plt.savefig("sentiment.jpg"
  92. plt.show() 
推荐 打印 | 录入:Cstor | 阅读:
相关新闻      
本文评论   
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款