参考文章:用Python更加了解微信好友
本实验参考网络上的代码,其中遇到很多错误,不过都顺利解决了,这其中的心酸可想而知。写这篇博文的目的也是记载一下这些出错的解决方法,至少在我的环境下解决了。
实验环境:UBUNTU14.04 LTS + python3.4
有人说,废啥话赶紧上代码。。。好吧,I Tell You
#-*- coding: utf-8 -*-
import re
from wxpy import *
import jieba
import numpy
import pandas as pd
import matplotlib.pyplot as plt
from scipy.misc import imread
from wordcloud import WordCloud,ImageColorGenerator
def login():
#初始化机器人
bot = Bot()
#获取所有好友
my_friends = bot.friends()
print(type(my_friends))
return my_friends
def show_sex_ratio(friends):
#使用一个字典统计好友男性和女性的数量
sex_dict = {'male':0, 'female':0}
for friend in friends:
if friend.sex == 1:
sex_dict['male'] += 1
elif friend.sex == 2:
sex_dict['female'] += 1
print(sex_dict)
def show_area_distribution(friends):
#使用一个字典统计各省好友数量
province_dict = {u'北京':0, u'上海':0, u'天津':0, u'重庆':0, u'河北':0,
u'山西':0, u'吉林':0, u'辽宁':0, u'黑龙江':0, u'陕西':0, u'甘肃':0,
u'青海':0, u'山东':0, u'福建':0, u'浙江':0, u'台湾':0, u'河南':0,
u'湖北':0, u'湖南':0, u'江西':0, u'江苏':0, u'安徽':0, u'广东':0,
u'海南':0, u'四川':0, u'贵州':0, u'云南':0, u'内蒙古':0, u'新疆':0,
u'宁夏':0, u'广西':0, u'西藏':0, u'香港':0, u'澳门':0}
#统计省份
for friend in friends:
if friend.province in province_dict.keys():
province_dict[friend.province] += 1
#为方便统计数据,生成Json Array格式
data = []
for key,value in province_dict.items():
data.append({'name':key, 'value':value})
print(data)
def write_txt_file(path, txt):
'''
写入文本
'''
with open(path, 'a', encoding='utf-8', newline='')as f:
f.write(txt)
def read_txt_file(path):
'''
读取文本
'''
with open(path, 'r', encoding='utf-8', newline='') as f:
return f.read()
def show_signature(friends):
#统计签名
for friend in friends:
#对数据进行清洗,将标点符号等对词频统计造成的因素清除
pattern = re.compile(r'[一-龥]+') #从一到龥几乎所有汉字都包括
filterdata = re.findall(pattern, friend.signature)
write_txt_file('signatures.txt', ''.join(filterdata))
#读取文件
content = read_txt_file('signatures.txt')
segment = jieba.lcut(content)
words_df = pd.DataFrame({'segment':segment})
#读取stopwords
stopwords = pd.read_csv("stopwords.txt", index_col=False, quoting=3,
sep=" ", names=['stopword'],encoding='utf-8')
words_df = words_df[~words_df.segment.isin(stopwords.stopword)]
print(words_df)
words_stat = words_df.groupby(by=['segment'])['segment'].agg(
{"计数":numpy.size})
words_stat = words_stat.reset_index().sort_values(by=["计数"],
ascending=False)
#设置词云属性
color_mask = imread('wx.jpg')
wordcloud = WordCloud(font_path="SimHei.ttf", #设置字体可以显示中文
background_color = "White", #背景颜色
max_words = 100, #词云显示的最大词数
mask=color_mask, #设置背景图片
max_font_size=100, #字体最大值
random_state=42,
width=640,height=640,margin=2,#设置图片默认的大小
)
#生成词云,可以用generate输入全部文本
#也可以计算好词频后使用generate_from_frequencies
word_frequence = {x[0]:x[1] for x in words_stat.head(100).values}
print(word_frequence)
word_frequence_dict = {}
for key in word_frequence:
word_frequence_dict[key] = word_frequence[key]
wordcloud.generate_from_frequencies(word_frequence_dict)
#从背景图片生成颜色值
image_colors = ImageColorGenerator(color_mask)
#重新上色
wordcloud.recolor(color_func=image_colors)
#保存图片
wordcloud.to_file('output.png')
plt.imshow(wordcloud)
plt.axis("off")
plt.show()
def main():
friends = login()
show_sex_ratio(friends)
show_area_distribution(friends)
show_signature(friends)
if __name__ == '__main__':
main()
代码给你了,然后你就迫不及待复制到电脑上运行看效果。。。。
我拉个去,什么库没找到。刚要生气,转念一想不就是个库没装吗,那就装上呗!
然后一顿操作猛如虎:
sudo pip3 install wxpy requests jieba numpy pandas matplotlib scipy imread wordcloud
好了,按照提示把缺少的库都安装齐全了。运行发现又是什么东西没找到,报了很多错误,仔细看看代码,好像词云属性里面有个ttf什么的,八度/古哥一下看看原理这是个字体文件,恩这个没有的话就应该有错误,因此网络上下载个字体文件到与代码文本相同的目录下。还有那个停止词,就是过滤掉一些频率高得词,这个网络上找到并下载stopwords.txt。再次运行,嘿这次出来个框框,里面没啥内容。什么鬼,绘不出来图。再一次请出八度/古哥两兄弟查查,不知道谁说,matplotlib需要另一个库的支持,缺什么cairocffi。那就安装呗:
sudo pip3 install cairocffi
发现始终安装不了,这又是什么意思。八度/古哥两位大哥别玩了,快把答案告诉俺。。。不知道,好吧!只能慢慢搜结果了。网络上的大神真的很多,别放弃。。。终于找到了大神某年月的一个回答,先装sudo apt-get install libffi-dev,然后它会安装相关的依赖库,再次安装cairocffi就能成功了。再次运行代码,终于看到久违的词云了。哈哈哈......
参考文章:用Python更加了解微信好友