【python 数据可视化】 WordCloud词云图

2024-07-06 1544阅读

目录

词云简介

准备工作

安装方法一:

安装方法二:

 生成词云步骤

数据预处理:

分词:

 统计词频出现的次数:

 去除词语:

生成词云:

显示词云:

保存词云:

完整代码


词云简介

“词云”这个概念由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)于提出,词云是一种可视化描绘单词或词语出现在文本数据中频率的方式,它主要是由随机分布在词云图的单词或词语构成,出现频率较高的单词或词语则会以较大的形式呈现出来,而频率越低的单词或词语则会以较小的形式呈现。词云主要提供了一种观察社交媒体网站上的热门话题或搜索关键字的一种方式,它可以对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨。

【python 数据可视化】 WordCloud词云图

准备工作

我们需要安装一些基本的库:(因为wordcloud库,jieba库不是python的内置库)

  • wordcloud
  • jieba

    安装方法一:

    windows+R,打开cmd,在命令行输入:

    pip install wordcloud

    等待安装完成即可。同样的方法安装jieba库; 

    安装方法二:

    直接再pycharm软件中安装:

    打开pycharm,找到pythong软件包,在搜索框中搜索要下载的库,点击安装即可。

    (如果第一次安装失败的话,直接再次尝试安装,基本上第二次是可以成功的)。

    【python 数据可视化】 WordCloud词云图

     生成词云步骤

    1.  准备好文本数据,词云背景模板;
    2. 数据预处理:对文本数据处理,如去除标点符号,停用词,数字等,以便更好的生成词云图;
    3. 分词:文本数据处理好后,使用分词工具进行分词,也就是将词分成一个个词语;
    4. 统计词频:也就是统计每个词语出现的次数;
    5. 去除不想要的词语;
    6. 生成词云图:使用wordcloud库的函数生成词云图,设置一些背景颜色,字体,词云形状;
    7. 显示词云图;
    8. 保存词云图;

    数据预处理:

    file = open(r"test.txt", mode="r",encoding="utf-8")
    txt1 = file.read()
    txt2 = re.sub(r"[^\u4e00-\u9fa5]","",txt1)
    
    • 这里file是打开文件的操作:如果直接print(file),结果显示的也只是一个操作,不会显示文本内容;要想真正的把文本里面的内容读取出来,就需要file.read()的方法;
    • txt1中存放的就是原始文本,但是只是原始文本并不行,使用re库中的re.sub将文本中的标点进行匹配,替换成空白,优化好的文本我们放到txt2中;

      这里re.sub()函数可以看:re.sub()用法的详细介绍_jackandsnow的博客-CSDN博客_re sub

      分词:

      我们平常看到的词云:

      【python 数据可视化】 WordCloud词云图

      如果整个文本直接生成词云肯定是不行的,接下来我们就需要对文本进行分词操作;

      txt3 = jieba.cut(txt2)  # 可迭代对象
      #for i in txt3:
      #    print(i)

      这里我们就用到了准备工作中的jieba库:

      jieba.cut(s) 精确模式:把文本精确的切分开,不存在冗余单词;

      这样txt3中的保存的就是一个个的词语:

      【python 数据可视化】 WordCloud词云图

       统计词频出现的次数:

      txt4 = {}
      for i in txt3:
          if i not in txt4:
              txt4[i]=1
          else:
              txt4[i]+=1
      txt5 = sorted(txt4.items(),key=lambda x :x[1],reverse=True)
      txt6={}
      for word,count in txt5:
          txt6[word]=count

      这里我们把结果存放到字典里面,因为{key:value},可以存放值和出现次数;

      存放好后,我们进行排序;

      • sorted函数是默认升序排序,当需要降序排序时,需要使用reverse = Ture;
      • 这里的items是将txt4字典转换为一个列表;

         我们排好序后,还需要将这个列表转换为一个字典;

         去除词语:

         统计并排好词后我们打印一下:

        【python 数据可视化】 WordCloud词云图

        如果里面有不想出现的词语,可以把它删去:

        list1={'的','和','我','我们','会','可以','是','我会','例如'} #去除不想要的词语
        for i in list1:
            del txt6[i]

        生成词云:

        img =Image.open("R-C.jpg")//我们想要的词云模板导入
        img_array = np.array(img)
        wordcloud = WordCloud(
            mask=img_array, # 设置词云模板
            background_color='white', #背景颜色
            font_path='simsun.ttc', #字体路径
            max_words=500, #最大显示的单词数
            max_font_size=100, #单词最大字号
            width = 500, #宽度
            height= 500, #高度
        ).generate_from_frequencies(txt6)

        显示词云:

        plt.Figure(figsize=(8,8))  #画布大小
        plt.imshow(wordcloud,interpolation='bilinear')
        plt.axis('off') #关闭坐标轴
        plt.show()

        保存词云:

        wordcloud.to_file('词云图片.jpg')  # 保存图片

        完整代码

        import re
        import matplotlib.pyplot as plt
        from wordcloud import WordCloud
        import jieba
        import numpy as np
        from PIL import Image
        file = open(r"test.txt", mode="r",encoding="utf-8")
        txt1 = file.read()
        # print(txt1)  #原始文本
        txt2 = re.sub(r"[^\u4e00-\u9fa5]","",txt1)
        # print(txt2) #进化后的文本
        txt3 = jieba.cut(txt2)  # 可迭代对象
        # for i in txt3:
        #     print(i)
        txt4 = {}
        for i in txt3:
            if i not in txt4:
                txt4[i]=1
            else:
                txt4[i]+=1
        txt5 = sorted(txt4.items(),key=lambda x :x[1],reverse=True)
        # print(txt5)
        txt6={}
        for word,count in txt5:
            txt6[word]=count
        print(txt6)
        list1={'的','和','我','我们','会','可以','是','我会','例如'} #去除不想要的词语
        for i in list1:
            del txt6[i]
        # print(txt6)
        img =Image.open("R-C.jpg")
        img_array = np.array(img)
        wordcloud = WordCloud(
            mask=img_array, # 设置词云模板
            background_color='white', #背景颜色
            font_path='simsun.ttc', #字体路径
            max_words=500, #最大显示的单词数
            max_font_size=100, #单词最大字号
            width = 500, #宽度
            height= 500, #高度
        ).generate_from_frequencies(txt6)//使用给定的词频数据txt6生成词云图。
        plt.Figure(figsize=(8,8))  #画布大小
        plt.imshow(wordcloud,interpolation='bilinear')//将生成的词云图像绘制在 Matplotlib 图形对象
        plt.axis('off') #关闭坐标轴
        plt.show()//显示生成词云图
        wordcloud.to_file('词云图片.jpg')  # 保存图片

        完结!!

         


        后续改进补充:

         对于第3和第4步可以简化一下:

        1. 分词:文本数据处理好后,使用分词工具进行分词,也就是将词分成一个个词语;
        2. 统计词频:也就是统计每个词语出现的次数;

         可以直接用python内置的Counter()来统计:

        t3=list(jieba.cut(t2))
        t4=Counter(t3)

        这样t4 就是一个字典,其中键是单词,值是该单词在文本中出现的次数。

        简化后的代码(主要是文本处理的简化,生成词云的步骤基本上没有变):

        import re
        import jieba
        from collections import Counter
        from wordcloud import WordCloud
        import matplotlib.pyplot as plt
        import numpy as np
        from PIL import Image
        f=open('test.txt','r',encoding='utf-8')
        t1=f.read()
        t2=re.sub(r"[^\u4e00-\u9fa5]","",t1)
        t3=list(jieba.cut(t2))
        t4=Counter(t3)
        l=['的','和','我们','我','是','他们','那','在','什么']
        for i in l:
            del t4[i]
        img=Image.open('R-C.jpg')
        img_array=np.array(img)
        # img_array 变量将包含图像的像素数据
        wordcloud=WordCloud(
            mask=img_array,
            background_color='white',
            font_path='simsun.ttc',
            max_words=500,
            max_font_size=100,
            width=500,
            height=500
        ).generate_from_frequencies(t4)
        plt.Figure(figsize=(8,8))  #画布大小
        plt.imshow(wordcloud,interpolation='bilinear')
        plt.axis('off') #关闭坐标轴
        plt.show()
        wordcloud.to_file('词云图片.jpg')  # 保存图片

        完结!!

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]