声明:
本文章是基于经过文本清洗、去除停用词、利用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文本进行存储了,大家也可自行设计一段中文文本测试。
至于想将词云绘制成何种形状,提前下载好自己需要的相关图片即可。这里需要说明的是,作为轮廓的图片最好是白底。参考图片:

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

3万+

被折叠的 条评论
为什么被折叠?



