python:基于Wordcloud的词云可视化

本文介绍了如何使用jieba库进行中文分词,结合WordCloud库生成词云,并提供了如何添加词云轮廓以及使用示例代码。重点关注了文本清洗、停用词处理和生成个性化词云图形的过程。

声明:

本文章是基于经过文本清洗去除停用词、利用jieba库进行中文分词后的词云可视化。本文不对上述提及的相关技术做详细解释,如有需要,可参考文章:NLP:利用jieba库,基于TF-IDF算法的关键词提取-CSDN博客

wordcloud库的安装:

pip install wordcloud -i https://pypi.tuna.tsinghua.edu.cn/simple

 关键代码:

生成词云的方法:
# 生成简单词云的方法

new_text = " ".join(final_list)
# 这里final_list是经过文本清洗及分词的一个词语列表,
# 其具体形式为["你好","中国","芯片"...]   
# 此步骤是将上面列表中的词语拼接起来,符合wordcloud的格式


#创建一个wordcloud模版,设置一些参数
wordcloud = WordCloud(font_path='simhei.ttf',  # 指定中文字体路径
                       background_color='white',
                       #mask=shape, # 这里用于设定前面得到的轮廓
                       max_words=100,  # 显示最大词数
                       max_font_size=100,  # 显示最大字体大小
                       random_state=30,  # 随机状态,使得结果可复现
                       width=800, height=400  # 词云图的尺寸
                      # contour_color='red',  # 添加词云轮廓,设置为红色
                      # contour_width=1
                      )  # 轮廓线条的粗细

wordcloud.generate(new_text)  # 生成词云

wordcloud.to_file('./wordcloud.png')  # 保存词云图到文件
 为词云绘制轮廓的方法:
# 比如我想将词云绘成苹果的模样
pic = Image.open("apple3.png")   # 读取文件
shape = np.array(pic) # 提取文件的轮廓


#在之前设定好的wordcloud模版中添加mask = shape即可

wordcloud = WordCloud(font_path='simhei.ttf',  # 指定中文字体路径
                       background_color='white',
                       mask=shape, # 在这里添加前面设定好的轮廓即可
                       max_words=100,  # 显示最大词数
                       max_font_size=100,  # 显示最大字体大小
                       random_state=30,  # 随机状态,使得结果可复现
                       width=800, height=400  # 词云图的尺寸
                      # contour_color='red',  # 添加词云轮廓,设置为红色
                      # contour_width=1
                      )  # 轮廓线条的粗细

#其余步骤一致

wordcloud.generate(new_text)  # 生成词云

wordcloud.to_file('./wordcloud.png')  # 保存词云图到文件

完整源码:

 代码中已有详细注释。

import pprint

import jieba
import re
# 示例文本
with open("huawei.txt", 'r', encoding='utf-8') as file:
    text = file.read()
# print(text)
# exit()
def clean_text2(test):
    pattern = r'[^\w\s]' #^是取反的意思,即与后面的条件不相符的情况
    # \w 匹配任何字母、数字或下划线,就相当于[a-zA-Z0-9_]
    # \s 匹配任何空白字符,空格、制表符等。

    cleaned_text = re.sub(pattern,'',text)   # 使用re.sub()函数替换标点符号为空字符串,不过这种写法处理后的文本中会出现空格的情况
    return cleaned_text
cleaned_text = clean_text2(text)
# print(cleaned_text)

# 使用jieba进行分词
words = jieba.cut(cleaned_text,cut_all = False) #使用jieba分词后,返回结果是一个生成器类型,无法直接看到分词的结果,需要将其转化成列表的
# 形式或者用for循环来查看分词结果。用generator类型,能够节省内存,用完立马就释放了,不会像存储在一个变量中一样。
words_list = list(words) #分词结果
# pprint.pprint(words_list)  #通过这里才可以看到分词的结果


# 读取停用词列表
with open('../stop_words/customize.txt', 'r', encoding='utf-8') as file:
    stop_word = set([line.strip() for line in file])
# pprint.pprint(list(stop_word)[0:10]) #这里需要将set转成集合才能够查看输出,而且,因为集合是无序的,所以其实每次结果都会不一样
# exit()
# 这里的set是一种数据结构——集合,不采用list的形式是因为其较于列表有这样的优势:
# 自动去重、查找速度较快(因为后面得对分词进行判断,是否为停用词)


# 正确写法
final_list = []  # 创建新的列表,存储不存在于停用词列表中的元素,或者采用列表推导式,但是不好理解
for word in words_list:
    if word not in stop_word:
        final_list.append(word)
# pprint.pprint(final_list)

from wordcloud import WordCloud
from PIL import Image
import numpy as np
# from imageio import imread
new_text = " ".join(final_list)   # 需要将上面列表中的词语拼接起来,符合wordcloud的格式

pic = Image.open("apple3.png")   # 读取文件
shape = np.array(pic) # 提取文件的轮廓
# 创建WordCloud对象,设置一些参数,比如背景颜色,最大词数等
wordcloud = WordCloud(font_path='simhei.ttf',  # 指定中文字体路径
                       background_color='white',
                       mask=shape, # 这里用于设定前面得到的轮廓
                       max_words=100,  # 显示最大词数
                       max_font_size=100,  # 显示最大字体大小
                       random_state=30,  # 随机状态,使得结果可复现
                       width=800, height=400  # 词云图的尺寸
                      # contour_color='red',  # 添加词云轮廓,设置为红色
                      # contour_width=1
                      )  # 轮廓线条的粗细


wordcloud.generate(new_text)  # 生成词云

wordcloud.to_file('./wordcloud.png')  # 保存词云图到文件


效果展示:

备注:

本文使用的停用词是采用。txt的形式存储的,大家也可自行在网上搜索下载。 

实例文本也是采用.txt文本进行存储了,大家也可自行设计一段中文文本测试。

至于想将词云绘制成何种形状,提前下载好自己需要的相关图片即可。这里需要说明的是,作为轮廓的图片最好是白底。参考图片:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值