最近学习了词云wordcloud,然后想练练手,就把主意打到了我的微信好友上。想在即将到来的2019年之前,看看我的微信好友2018年的个性签名是怎样的。
安装itchat
首先,要获取微信好友信息。这里需要用到一个可以调用微信接口的第三方库itchat。
itchat的安装:在终端运行pip install itchat
itchat简单示例
在获取好友个性签名制作词云之前,先写个itchat的简单例子获取好友性别并做简单可视化分析。
主要用到的方法:
-
itchat.login()
:生成二维码给用户扫码登陆 -
itchat.get_friends(update=True)
:返回更新的完整好友列表,其中第一项为本人微信号
import itchat
# 登陆并获取好友列表
itchat.login()
friends = itchat.get_friends(update=True)
# 打印第一个好友信息,即本人信息
print(friends[0])
从打印的结果可以看出每一个账号信息应该是一个JSON对象。以下为部分信息:
<User: {'MemberList': <ContactList: []>, 'Province': 'Paris', 'Signature': '吾心所愿:一生两人三餐四季', 'Sex': 1}>
上面的结果包含了我要获取的信息。性别Sex
,个性签名Signature
。
先看一下性别分布。
import matplotlib.pyplot as plt
sex = dict()
for friend in friends:
if friend['Sex'] == 1:# 男
sex['male'] = sex.get('male', 0) + 1
elif friend['Sex'] == 2:# 女
sex['female'] = sex.get('female', 0) + 1
else: # 未知
sex['unknown'] = sex.get('unknown', 0) + 1
# 用柱状图显示性别分布
for key, value in sex.items():
plt.bar(key, value)
plt.show()
结果如下:
从展示图可以看出我的微信好友,男女比例接近2:1,这对一个理工男来说算是不错的比例了哈哈哈。还有接近25个左右是没有设置性别的,这些应该都是男的哈哈(来自一个理工直男的直觉)。
除了用直方图展示分布外,还可以用饼图来展示。
# 用饼图显示性别分布
explode = [0, 0.1, 0] # 将第二块凸显出来
plt.pie(list(sex.values()), explode=explode, labels=list(sex.keys()), autopct='%1.1f%%', startangle=90)
plt.axis('equal')
plt.show()
效果如下:
微信好友性别饼图
个性签名词云
接下来就进入主题了。绘制好友签名词云。
这里主要需要两个库:制作词云的wordcloud
和进行中文分词的jieba
首先是获取好友个性签名,由于部分好友签名会带有表情,会带有一些特殊字符和emoji
、class
等。所以需要在获取时进行过滤。这里用到了正则表达式。
# 获取好友签名
sList = []
for friend in friends:
# 部分签名带有表情,去除span, emoji, class。还有特殊字符
signature = friend['Signature'].strip().replace('emoji','').replace('class','').replace('span','')
pattern = re.compile("1f\d+\w*|[<>/=]")
signature = pattern.sub('', signature)
sList.append(signature)
# 拼接字符串
text = " ".join(sList)
在获取到经过过滤清洗的好友签名之后,用jieba
进行中文分词,然后统计每个词语的出现频率。最后按词频进行排序。
# 使用jieba进行分词
word_list = jieba.cut(text)
# 统计词频
total = {}
for word in word_list:
total[word] = total.get(word, 0) + 1
# 按词频进行排序,只选取包含两个或两个字以上的词
word_sorted = dict(sorted({k: v for k, v in total.items() if len(k) >= 2}.items(), key=lambda x: x[1], reverse=True))
最后的重头戏就是生成词云了。在这里需要重点说一下font_path
的设置,如果没有设置的话,对于英文词云来说没有影响,但是中文词云会乱码,所以需要指定一个中文字体的font_path
,我这里是在本地系统找的字体文件,然后放在了代码根目录,所以参数值直接就是文件名,如果不是在代码根目录的,需要完整的路径名。
# 词云属性设置
wordCloud = WordCloud(font_path='simhei.ttf', background_color='white', max_font_size=40, random_state=42, max_words=2000, mask=alice_mask)
# 生成词云
wordCloud.generate_from_frequencies(word_sorted)
alice_mask = np.array(Image.open('timg.jpg'))
image_color = ImageColorGenerator(alice_mask)
plt.imshow(wordCloud.recolor(color_func=image_color))
plt.axis('off')
plt.show()
最后词云图如下:
好友签名词云
从图可以看出我的微信好友的个性签名用的词语比较多的有:自己、努力、人生、成为、自律、未来、幸运等。感觉还是正能量满满的哈哈。
都看到最后了,要不~点个赞?加波关注?
网友评论