抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Python WordCloud 词云可视化脚本

几年前就看到了,所以这技术已经很成熟了,网上找了下轮子也很成熟了,主要就是 wordcloud 库,中文词组拆分的 jieba 库,一些图片处理库,然后没了。

依赖库

pip3 install numpy matplotlib pillow wordcloud imageio jieba snownlp itchat -i https://pypi.tuna.tsinghua.edu.cn/simple

脚本代码

经过一番品读,网上找了份写得好看的代码 完全没改 改了改,代码如下:

import jieba  
import numpy as np  
# import imageio
from pathlib import Path  
from PIL import Image  
from wordcloud import WordCloud, ImageColorGenerator  
from matplotlib import pyplot as plt
from collections import Counter

def split_four_text(text):  
# split_four_text函数用于jieba分词并分隔为特定个字为一组的内容。

    words =jieba.cut(text)

    # 用Counter方法计算单词频率数
    count = Counter(words)
    most_count = count.most_common()
    words_list = []

    for i in most_count:
        if len(i[0]) >= 3:
            words_list.append(i[0])
    # 打印出前 500 高频词
    # print(words_list[:500])
    return words_list


def draw_wordcloud(text, image_mask,):  
# draw_wordcloud函数以用户定义的模板轮廓图来显示中文词云。

    mask = np.array(Image.open(image_mask))
    # 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
    # mask = imageio.imread(image_mask)

    wordcloud = WordCloud(background_color = 'white', mask = mask, 
                          max_words = 1000,
                          # 如果不设置中文字体,可能会出现乱码
                          font_path = '/System/Library/Fonts/Hiragino Sans GB.ttc')


    wordcloud.generate(text)

    image_colors = ImageColorGenerator(mask)

    plt.figure(figsize = (14, 8))

    # 创建左侧中文词云图
    plt.subplot(121)
    plt.imshow(wordcloud.recolor(color_func = image_colors), interpolation = 'bilinear')
    plt.axis('off')

    # 创建右侧原图
    plt.subplot(122)
    plt.imshow(mask, interpolation = 'bilinear')
    plt.axis('off')

    plt.show()


# 读取文件内容    
text_path = Path('your_doc_path')  
with text_path.open(encoding = 'UTF-8') as f:  
    text_content = f.read()

# 把文件内容交给自定义的split_four_text中文分词函数处理。
split_content = split_four_text(text = text_content)

# 由于split_four_text函数返回的是一个list类型,词云只接收字符串或者二进制形式输入,
# 所以用str()函数转换为字符串。
# draw_wordcloud(text = text_content, image_mask = 'your_pic_path')  
draw_wordcloud(text = str(split_content), image_mask = 'your_pic_path')

注意点不多,代码逻辑也很简单,需要替换的只有三点:

  1. 中文字体路径 上述 font_path 指定
  2. 源文件输入 字段 your_doc_path
  3. 背景图输入 字段 your_pic_path

结果图:我这里底图是透明背景,所以撑满了,只需要换成白底 – 对比度高的图片,就是网上常见的带图片形状的结果。至于输出,自行调节即可。

优化

可以看到关键词里还有很多无关紧要的词,当然这个得根据实际情况进行排除,网上有一些开源的词库(但大多数情况下并没啥用),比如:

中文常用停用词表

用法实际上就是在 wordcloud 初始化时加上 stopwords 参数即可:

# 构建并配置词云对象w,注意要加stopwords集合参数,将不想展示在词云中的词放在stopwords集合里,这里去掉“小操”和“小明”两个词
w = wordcloud.WordCloud(background_color = 'white', mask = mk, 
                        max_words = 1000,
                        font_path='/System/Library/Fonts/Hiragino Sans GB.ttc',
                        stopwords={'小操','小明'}
                        )

大概这样就可以满足大多数需求了,当然,这里都是复制的,原始教程在这里:

词云可视化:四行Python代码轻松上手到精通

互联网就是这样,零零散散~ 以上,仅做个人记载 !

可能会遇到的问题

执行脚本报错:ImportError:cannot import name ‘WordCloud

极大可能是:py 脚本名指定为了 wordcloud.py,我就是,第一时间偷懒直接保存为了 wordcloud.py ~,太巧了。

参考/拷

python导入词云包失败:ImportError:cannot import name ‘WordCloud’的解决办法

Python之WordCloud词云库

用wordcloud和jieba生成中文词云

词云可视化:四行Python代码轻松上手到精通

你不知道的词云


本站由以下主机服务商提供服务支持:

0条评论

发表评论