美文网首页
微信好友个性签名词云

微信好友个性签名词云

作者: RossH | 来源:发表于2019-01-01 22:00 被阅读0次

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

    安装itchat

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

    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
    首先是获取好友个性签名,由于部分好友签名会带有表情,会带有一些特殊字符和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()
    

    最后词云图如下:


    好友签名词云

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


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

    相关文章

      网友评论

          本文标题:微信好友个性签名词云

          本文链接:https://www.haomeiwen.com/subject/okmolqtx.html