暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【Python】生成云词

一生之记 2022-07-26
1135

背景:分析Excel某一列的数据出现的数据次数,并生成词云图片(建议直接和数据库结合使用效果更好)。


一、导入需求的python模块

模块名称
功能安装命令
openpyxl操作表格
pip install openpyxl
wordcloud云词相关
pip install wordcloud
imageio图像数据读取库pip install imageio

二、对某一列的表格进行提取(当然也可以不使用openpyxl模块,看自己习惯使用哪个模块)。

    from openpyxl import *
    # 表格数据集list集
    list = []
    # 读取存在的表格
    wb = load_workbook('/表格的路径.xlsx')
    # 指定Sheet页面
    sheet = wb['Sheet名称']
    prj = sheet.columns
    prjTuple = tuple(prj)
    # 过滤第I列
    # 0,4是遍历A、B、C、D列 #(0,len(prjTuple)) 遍历全部列
    for idx in range(8, 9):
    for cell in prjTuple[idx]:
    # 将值写入到list空列表中
    list.append(cell.value)

    三、将list数据进行分析生成字典,key对应词,value对应词出现的次数,例子:{词:词出现的次数}。

      # 把结果放到字典里面去{键值对类型}
      results = {}
      for s in list:
      # results[s]获取key值,results.get(s, 0)+ 1 指定键的值不存在时,返回0,如果存在就会在原key值的基础上+1
          results[s] = results.get(s, 0) + 1



      四、imageio.v2.imread('路径') 设置指定图片模版进行替换到WordCloud中的图片,图片白色底不会展示词汇。

        import imageio
        from wordcloud import WordCloud
        # 读取背景图片并用变量接收(文字只会展示在非白色背景上)
        color_mask = imageio.v2.imread("/指定模版图片路径.jpg")
        cloud = WordCloud(
        # 设置字体,不指定就会出现乱码
        font_path="Library/Fonts/Songti.ttc",
        # 设置背景色
        background_color='white',
        # 词云形状,使用读取的图片
        mask=color_mask,
        # 允许最大词汇
        max_words=2000,
        # 最大号字体
        max_font_size=200,
        # 最小号字体
        # min_font_size=50
        # 设置图片宽度
        width=375,
        # 设置图片高度
            height=300,
        )
        # 产生词云
        word_cloud = cloud.generate_from_frequencies(results)
        # 保存词云图片,并指定保存路径
        word_cloud.to_file("/指定保存图片路径.jpg")
        • 不设置模版前生成的云词图片:

        • 模版:



        • 设置模版后生成的云词图片:

        • WordCloud常用方法

        设置方法
        传值类型
        备注
        font_path=Nonestring字体OTF or TTF路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'
        width=400int输出图片(画布)的宽度,默认400像素
        height=200int输出图片(画布)的宽度,默认200像素
        margin=2int图片(画布)边缘留白的空隙,默认留白空间是2像素
        ranks_only=None
        可以忽略,这块确实不知道啥意思
        prefer_horizontal=0.9float词语水平方向排版出现的频率,默认 0.9 ,所以词语垂直方向排版出现频率为 0.1
        mask=Nonend-array or None是否使用mask(蒙板),默认不使用。如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了
        scale=1float在字段width和height乘以的倍数,最终呈现的画布尺寸以这个结果。默认是1,此方法适合需要呈现大尺寸的图片(画布)
        color_func=Noneccallable生成新颜色的函数,默认为空。如果为空,则使用 self.color_func
        max_words=200int单词最多显示数量,默认200个
        min_font_size=4int单词最小尺寸,默认4像素
        stopwords=Noneset of strings or None设置需要屏蔽展示的词,如果为空,则使用内置的STOPWORDS。若使用generate_from_frequencies生成方式,则会忽略此参数
        random_state=Noneint or None为每个单词返回一个PIL颜色
        background_color='black'cstring输出画布背景颜色,默认黑色
        max_font_size=Noneint单词最大尺寸,默认不限制
        font_step=1int字体步长,默认1。如果步长大于1,会加快运算但是可能导致结果出现较大的误差(这块确实不知道啥意思)
        mode='RGB'string颜色显示模式,默认”RGB”。当参数为“RGBA”并且background_color是None时,背景色为透明
        relative_scaling='auto'float词频和字体大小的关联性(倍数)。默认是auto,即为0.5。若为0,只考虑单词的排列顺序;若为1,则单词展现的大小和出现的频率一致;若两者都考虑则可以设置为auto。若参数repeat=True,则此项为0
        regexp=Nonestring or None (optional)把文本切片的通用方法。若为空,则使用正则匹配r"\w[\w'];若使用generate_from_frequencies生成方式,则忽略此参数
        collocations=Truebool是否包含两个单词的搭配性,默认包含。若使用generate_from_frequencies生成方式,则忽略此参数
        colormap=Nonestring or matplotlib colormap给每个单词随机分配颜色或者使用Matplotlib调色板,默认颜色是”viridis”即翠绿色。若使用了参数color_func,则忽略此项
        normalize_plurals=Truebool是否去掉单词末尾的‘s’,默认去掉。若为真,并且单词以‘s’结尾(若以‘ss’结尾则不符合此规则),‘s’会被去除并且去除后的单词出现的频率会被统计。若使用generate_from_frequencies生成方式,则忽略此参数
        contour_width=0floatmask轮廓线宽。若mask不为空且此项值大于0,就绘制出mask轮廓 (default=0)
        contour_color='black'color valueMask轮廓颜色,默认黑色
        repeat=Falsebool单词是否重复展示,默认不重复

        五、全部代码
          from openpyxl import *
          from wordcloud import WordCloud
          import matplotlib.pyplot as plt
          import imageio
          # 表格数据集list集
          list = []
          # 读取存在的表格
          wb = load_workbook('/表格的路径.xlsx')
          # 指定Sheet页面
          sheet = wb['Sheet']
          prj = sheet.columns
          prjTuple = tuple(prj)
          # 过滤第I列
          # 0,4是遍历A、B、C、D列 #(0,len(prjTuple)) 遍历全部列
          for idx in range(8, 9):
          for cell in prjTuple[idx]:
          # print(cell.coordinate, cell.value)
          list.append(cell.value)


          # 把结果放到字典里面去{键值对类型}
          results = {}
          for s in list:
          # results[s]获取key值,results.get(s, 0)+ 1 指定键的值不存在时,返回0,如果存在就会在原key值的基础上+1
          results[s] = results.get(s, 0) + 1
          # 读取背景图片并用变量接收(文字只会展示在非白色背景上)
          color_mask = imageio.v2.imread("/指定模版图片路径.jpg")
          cloud = WordCloud(
          # 设置字体,不指定就会出现乱码
          font_path="Library/Fonts/Songti.ttc",
          # 设置背景色
          background_color='white',
          # 词云形状,使用读取的图片
          # mask=color_mask,
          # 允许最大词汇
          max_words=2000,
          # 最大号字体
          max_font_size=200,
          # 最小号字体
          # min_font_size=50
          # 设置图片宽度
          width=375,
          # 设置图片高度
          height=300
          )
          # 产生词云
          word_cloud = cloud.generate_from_frequencies(results)
          # 保存词云图片,并指定保存路径
          word_cloud.to_file("/指定保存图片路径.jpg")


          文章转载自一生之记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论