zoukankan      html  css  js  c++  java
  • 【Python成长之路】词云图制作

    【写在前面】

        以前看到过一些大神制作的词云图 ,觉得效果很有意思。如果有朋友不了解词云图的效果,可以看下面的几张图(图片都是网上找到的);

        网上找了找相关的软件,有些软件制作 还要付费。结果前几天在大神的公众号里的文章中看到了python也能实现,而且效果也很不错 。那还等什么,不赶紧盘它?

    【示例代码】

     1 # coding=utf-8
     2 # @Auther : "鹏哥贼优秀"
     3 # @Date : 2019/7/31
     4 # @Software : PyCharm
     5 import numpy as np
     6 import jieba
     7 from PIL import Image
     8 from wordcloud import WordCloud, STOPWORDS
     9 import matplotlib.pyplot as plt
    10  
    11 def draw_word_cloud(word):
    12     words = jieba.cut(word)
    13     wordstr = " ".join(words)
    14     sw = set(STOPWORDS)
    15     sw.add("ok")
    16     mask = np.array(Image.open('2.jpg'))
    17     wc = WordCloud(
    18         font_path='C:/Windows/Fonts/simhei.ttf',  # 设置字体格式
    19         mask=mask,
    20         max_words=200,
    21         max_font_size=100,
    22         stopwords=sw,
    23         scale=4,
    24     ).generate(wordstr)
    25  
    26     # 显示词云图
    27     plt.imshow(wc)
    28     plt.axis("off")
    29     plt.show()
    30     # 保存词云图
    31     wc.to_file('result.jpg')
    32  
    33 if __name__ == "__main__":
    34     with open("test2.txt", "rb") as f:
    35         word = f.read()
    36     draw_word_cloud(word)

    【效果如下】

    【知识点】

    1、词云图 制作前,需要先准备几个东西:

    (1)下载python wordcloud库,也是词图库制作的关键库。我在下载这个库 时,经常因为网络超时导致下载失败,怎么办呢?多试几次呗;

    (2)numpy库,用于图片处理,将图片读取后解析成数组;

    (3)如果要对中文句子进行分词,那么需要jieba库;如果是英文分词,那可以不下载;

    (4)如果要在界面上直接展示词云图 ,那么需要matlplotlib来画图;

    (5)要处理图片,根据少不了PIL,毕竟它可是官方的图像处理库;

    2、接下来,就是准备要分析的内容。示例代码中的txt内容,是我上一篇文章。然后就是词云图的形状。示例代码中的图片2.jpg原图如下:

    3、准备工作 做完了,那自然就开始编码了。

    (1)jieba.cut():就是对txt内容进行分词了,注意得到的是个generator,因此需要将其转成字符串;当然也可以使用jieba.lcut(),这 样得到的就是列表了;

    (2)STOPWORDS集合的设置:停用词有什么呢?主要是对一些你不想要的单词进行过滤,比如“好的”“可以”这 类单词。另外,在对停用词进行过滤时,有两种方法,一种是像示例代码,将stopwords作为wordcloud方法的参数,这样最简单;也可以自己写段代码,人为过滤停用词;

    (3)将你要的词云图形状图片打开,并作为参数传给wordcloud方法

    (4)wordcloud方法各参数的意义,可以参考其他帖子:

    https://blog.csdn.net/kouyi5627/article/details/80530569

    里面我想着重讲的是regexp参数,即正则表达式。没错,就是正则表达式,有了这个参数,我们可以用正则表达式规则进一步实现自己的单词过滤,比如d只显示数字。我之前遇到过 这 个坑,下面再讲。

    另外,scale=4生成的图片一般是500KB左右,如果不填,默认只有10几KB;

    (5)对内容进行生成词云图时,generate方法最简单,直接将字符串传进来就可以;generate_from_frequencies方法的话,需要传入字典,并自己统计好每个单词的次数;

    (6)界面显示词云图的代码很简单,axis("off")是为了不显示坐标,这样更美观;

    (7)即将生成的词云图保存到本地,也不多解释。

    综上,大致就是示例代码 的流程,是不是蛮简单的?那自己动手来玩一次吧。

    4、下面我再讲讲自己在制作词云图遇到的坑。

        一开始我是想对各期双色球号码进行词云图分析的,结果一直报错,错误如下:

    ValueError: We need at least 1 word to plot a word cloud, got 0.

    意思就是说我传入的wordstr是空的?怎么可能呢,我明明有数字呀?最后我在wordcloud方法的官方说明中找到了原因:

    看到没?regexp参数如果不填写的话,默认是会自动过滤掉单个词的,因此数字就是因为这个原因一直被过滤了。怎么解决呢?有两个办法,第一就是传入regexp参数,比如regexp="d*";第二种方法就是用

    generate_from_frequencies方法,这样因为有每个数字的频繁在,就不会自动被过滤掉了。从我自己的使用结果来看,还是用第二种方法的效果好看点。

    如果大家觉得看了有所帮助或者喜欢的话,可以关注我的公众号“鹏哥贼优秀”,谢谢大家!

    HDC.Cloud 华为开发者大会2020 即将于2020年2月11日-12日在深圳举办,是一线开发者学习实践鲲鹏通用计算、昇腾AI计算、数据库、区块链、云原生、5G等ICT开放能力的最佳舞台。

    欢迎报名参会https://www.huaweicloud.com/HDC.Cloud.html?utm_source=&utm_medium=&utm_campaign=&utm_content=techcommunity

     

  • 相关阅读:
    使用JS完成首页轮播图效果
    使用JS完成注册表单的数据校验
    网上商城------表单校验
    网上商城-----注册功能的实现
    网上商城-----环境配置
    博客还是搬到csdn吧~
    【【【超高仿】】】迅雷播放器教程 -- 总结(14)
    duilib进阶教程 -- 总结 (17)
    duilib进阶教程 -- 改进List控件 (16)
    duilib进阶教程 -- 设置资源路径 (15)
  • 原文地址:https://www.cnblogs.com/huaweicloud/p/12229478.html
Copyright © 2011-2022 走看看