微信好友个性签名词云

2019-01-01  本文已影响0人  RossH

最近学习了词云wordcloud,然后想练练手,就把主意打到了我的微信好友上。想在即将到来的2019年之前,看看我的微信好友2018年的个性签名是怎样的。

安装itchat

首先,要获取微信好友信息。这里需要用到一个可以调用微信接口的第三方库itchat
itchat的安装:在终端运行pip install itchat

itchat安装

itchat简单示例

在获取好友个性签名制作词云之前,先写个itchat的简单例子获取好友性别并做简单可视化分析。
主要用到的方法:

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
首先是获取好友个性签名,由于部分好友签名会带有表情,会带有一些特殊字符和emojiclass等。所以需要在获取时进行过滤。这里用到了正则表达式。

# 获取好友签名
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()

最后词云图如下:


好友签名词云

从图可以看出我的微信好友的个性签名用的词语比较多的有:自己、努力、人生、成为、自律、未来、幸运等。感觉还是正能量满满的哈哈。


都看到最后了,要不~点个赞?加波关注?

上一篇下一篇

猜你喜欢

热点阅读