用Python词云库WordClound制作词云图片


前言

之前练习Scrapy爬取网页文本,爬完后发现有2W多个TXT文档,如果一个个去看内容的话肯定不现实,这时突然想起了快速了解文本信息的‘词云’,因此萌生了用这2W多TXT文档制作一个词云图片快速了解核心内容的想法,顺便熟悉一下Python词云制作的方法。

WorlCloud

百度一下Python词云制作,发现了WorlClound这个鼎鼎有名的库,它通过三个步骤即可生成词云:

  1. 生成实例对象,可以添加参数改变最终输出的图片样式

    import wordclound
    wc=wordclound.WordCloud(
        width=1000,
        height=1000,
        font_path="msyh.ttc",
        background_color='white',
        )

    支持的参数具体功能如下表:

    参数 描述
    width 指定词云对象生成图片的宽度,默认400像素
    w=wordcloud.WordCloud(width=600)
    height 指定词云对象生成图片的高度,默认200像素
    w=wordcloud.WordCloud(height=400)
    min_font_size 指定词云中字体的最小字号,默认4号
    w=wordcloud.WordCloud(min_font_size=10)
    max_font_size 指定词云中字体的最大字号,根据高度自动调节
    w=wordcloud.WordCloud(max_font_size=20)
    font_step 指定词云中字体字号的步进间隔,默认为1
    w=wordcloud.WordCloud(font_step=2)
    font_path 指定文体文件的路径,默认None
    w=wordcloud.WordCloud(font_path="msyh.ttc")
    max_words 指定词云显示的最大单词数量,默认200
    w=wordcloud.WordCloud(max_words=20)
    stop_words 指定词云的排除词列表,即不显示的单词列表
    w=wordcloud.WordCloud(stop_words="Python")
    mask 指定词云形状,默认为长方形,需要引用imread()函数
    from scipy.msc import imread
    mk=imread("pic.png")
    w=wordcloud.WordCloud(mask=mk)
    background_color 指定词云图片的背景颜色,默认为黑色
    w=wordcloud.WordCloud(background_color="white")
  2. 解析文本,generate()函数会按照空格将文本识别成不同的词语

    import wordclound
    wc=wordclound.WordCloud(
        width=1000,
        height=1000,
        font_path="msyh.ttc",w
        background_color='white',
        )
    wc.generate('you are a superman!')

    然而在中文句子中,并不是每一个词语都有空格隔开,所以generate()函数对中文的支持并不好,这时我们需要用到另外一个辅助帮忙把中文词用空格隔开的库jieba:

    import wordclound
    import jieba
    
    #使用jieba.lcut(text)将文本中词语切割开形成一个列表
    jb = jieba.lcut('你是一个超人!')
    #使用空格将列表内容连起来
    t = " ".join(jb)
    #再把有空格分隔词语的文本给generate()函数处理
    wc.generate(t)
  3. 输出词云

import wordclound
import jieba

#使用jieba.lcut(text)将文本中词语切割开形成一个列表
jb = jieba.lcut('你是一个超人!')
#使用空格将列表内容连起来
t = " ".join(jb)
#再把有空格分隔词语的文本给generate()函数处理
wc.generate(t)
#输出词云到指定图片
wc.to_file('lzy.png')

image-20200602104955476

处理大量文本文件生成词云

上面实现了词云制作的过程,接下来按需求拼接2W多个文本(友情提示:我2W多个文件大小总共只有200M左右,消耗内存大概2G,如果文件太大需谨慎,避免内存爆掉……),然后传递给jieba分词,再给wordclound生成词云。

先写遍历文件拼接并返回文本内容的函数:

#遍历文件夹获取文件名的函数
def get_filename(s_path):
    #遍历文件夹,获取文件夹下所有文件名和文件夹
    list=os.listdir(s_path)
    #初始化一个空列表
    text_list=[]
    for data in list:
        #拼接目录和目录下的对象,形成全路径
        data_fullname=os.path.join(s_path,data)
        #isfile判断是否为文件
        if os.path.isfile(data_fullname):
            #将文件中每一行读出          
            with open(data_fullname, "r",encoding='UTF-8') as f:
                lines=f.readlines()
                #循环每一行加入到初始化的列表中
                for line in lines:
                    text_list.append(line)
    #将每一行连起来形成一个完整的文本                
    a=''.join(text_list)
    return a

然后在jieba分词的文本改成调用函数即可:

jb = jieba.lcut('get_filename(s_path)')

知晓方法后,调整以下代码,将各部分整合成函数,jieba分词放到读取文件一起,完整代码如下:

import wordcloud
import jieba
import os
#遍历文件夹获取文件名的函数
def get_filename(s_path):
    #遍历文件夹,获取文件夹下所有文件名和文件夹
    list=os.listdir(s_path)
    #初始化一个空列表
    text_list=[]
    for data in list:
        #拼接目录和目录下的对象,形成全路径
        data_fullname=os.path.join(s_path,data)
        #isfile判断是否为文件
        if os.path.isfile(data_fullname):
            with open(data_fullname, "r",encoding='UTF-8') as f:
                lines=f.read()
                #直接将文本用jieba分词
                jb = jieba.lcut(lines)
                #循环每个词加入到初始化的列表中
                for line in jb:
                    text_list.append(line)
    #将每个词用空格连起来形成一个完整的文本                
    a=' '.join(text_list)
    return a

def to_wordclound(s_path):
    c=wordcloud.WordCloud(
        width=1000,
        height=1000,
        font_path="msyh.ttc",
        background_color='white',
        #max_font_size=100,
        min_font_size=50
        )
    c.generate(get_filename(s_path))
    c.to_file('lzy.png')

if __name__ == "__main__":
    s_path = r'C:\06Python\Scrapy\get_ais\get_ais\filedata\xs'
    to_wordclound(s_path)

结果如图:

image-20200602114954842

词云还可以定制背景图和颜色等,后续再研究。


文章作者: 无咎
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无咎 !
评论
 上一篇
Scrapy自带的图片和文件下载器 Scrapy自带的图片和文件下载器
前言我们在使用Scrapy爬取资料时,除了获取页面看得到的文本信息外,经常会遇到需要下载图片或文件的情况,这个时候就可以使用Scrapy自带的下载起来下载,下面我们来学习一下Scrapy里面图片和文件下载器的使用。 应用案例简书上有对Fil
2020-06-07
下一篇 
使用python将四万多图片分文件夹存储 使用python将四万多图片分文件夹存储
1 前言先说明下背景吧,之前学习Scrapy爬了一个网站的美女图片,爬完后发现数量居然有4W多个,此前完全没想到这么多,所以存储时直接放在了一个文件夹,导致现在打开文件夹时巨慢无比,因此想要批量给他们归个类,按不同的文件夹存储。 爬取图片时
  目录