词云图是一种直观的方式来展示文本数据,可以体现出一个文本中词频的使用情况,有利于文本分析,通过词频可以抓住一篇文章的重点
本文通过处理一篇关于分析影响洋流流向的文章,分析影响洋流流向的主要因素都有哪些
文本在文末结尾
1、用到库
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
import numpy as np
import jieba.posseg as pseg
from collections import Counter
import PIL.Image as Image
from matplotlib import colors
#安装库可以用清华的镜像网站(可能会更新,可以上官网查询地址)
pip install wordcloud -i https://pypi.tuna.tsinghua.edu.cn/simple
2、读取文本文件
#jieba.posseg是Python中的一个分词工具,它可以将文本切割成词语,并且为每个词语标注词性。这个工具可以帮助我们更好地理解和处理自然语言文本。而pseg则是jieba.posseg的别名,用于方便快捷地进行调用。
text = open("有哪些因素会影响海洋洋流的方向?.txt", encoding="utf-8").read()
words = pseg.cut(text)
3、分词
# 按指定长度和词性提取词
# len(word)设置的是词长,想要提取两个两个字的就设置2,三个三个字的就设置3(以此类推)
report_words = []
for word, flag in words:
print(f"{word} => {flag}")
if (len(word) >= 2) and ('n' in flag): # 选择词的长度大于等于2,且词性为名词的词
report_words.append(word)
'''
对以上word 和 flag打印后会得到如下结果
的 => uj
具有 => v
相对 => d
稳定 => a
速度 => n
的 => uj
水平 => n
流动 => vn
, => x
是从 => v
一个 => m
海区 => n
水平 => n
或 => c
r表示代词,v表示动词,a表示形容词,n表示名词,uj表示助词,x表示标点符号。通过对文本进行词性标注,我们可以更好地理解文本及其中包含的实体。
'''
4、设置停用词&在已处理的文本中过滤停用词
# 设置停用词
stopwords = set(STOPWORDS)
stopwords.update(['补偿','海水','南半球','大西洋','印度洋','太平洋','差异','荒漠','南极洲','产生','current','Current','wind'])
# 去除停用词
report_words = [word for word in report_words if word not in stopwords]
# 统计高频词汇
result = Counter(report_words).most_common(200) # 词的个数
# 建立词汇字典
content = dict(result)
# 输出词频统计结果
for i in range(37):
word, flag = result[i]
print("{0:<10}{1:>5}".format(word, flag))
5、设置png掩膜(设置图像显示的形状)
# 设置png掩膜
background = Image.open("rabbit.png").convert('RGB')
mask = np.array(background)
'''
如果输出结构还是长方形(正方形),应该是png图片“有问题”,可以尝试以下的处理
1.用p图软件把图片改成纯黑色(可能别的也可以,我没试过)
2.用以下代码把白色背景改为透明
# 如果当前位深是32的话,可以不用写转RGBA模式的这一句,但是写上也没啥问题
# 从RGB(24位)模式转成RGBA(32位)模式
img = Image.open("rabbit.png").convert('RGBA')
W, L = img.size
white_pixel = (0, 0, 0, 0) # 白色
for h in range(W):
for i in range(L):
if img.getpixel((h, i)) == white_pixel:
img.putpixel((h, i), (255, 255, 255, 0)) # 设置透明
img.save("yourfile_new.png") # 自己设置保存地址
'''
6、字体和颜色设置
# 设置字体样式路径
font_path = r"C:\Windows\Fonts\simhei.TTF"
# 设置字体大小
max_font_size = 200
min_font_size = 10
# 建立颜色数组,可更改颜色
color_list = ['#CD853F','#DC143C','#00FF7F','#FF6347','#8B008B','#00FFFF','#0000FF','#8B0000','#FF8C00',
'#1E90FF','#00FF00','#FFD700','#008080','#008B8B','#8A2BE2','#228B22','#FA8072','#808080']
# 调用颜色数组
colormap = colors.ListedColormap(color_list)
7、生成词云
# 生成词云
wordcloud = WordCloud(scale=4, # 输出清晰度
font_path=font_path, # 输出路径
colormap=colormap, # 字体颜色
width=1600, # 输出图片宽度
height=900, # 输出图片高度
background_color='white', # 图片背景颜色
stopwords=stopwords, # 停用词
mask=mask, # 掩膜
max_font_size=max_font_size, # 最大字体大小
min_font_size=min_font_size) # 最小字体大小
wordcloud.generate_from_frequencies(content)
# 使用 matplotlib 显示词云
# plt.imshow()将数据变成图像 ,plt.show() 将图像显示出来
# interpolation:插值方法。它定义了图像在放大或缩小时的插值方式。常用的值有’nearest’、‘bilinear’、'bicubic’等。较高的插值方法可以使图像看起来更平滑,但计算成本更高
plt.imshow(wordcloud, interpolation='bilinear')
# 关闭坐标轴
plt.axis('off')
plt.show()
# 保存词云图
wordcloud.to_file("wordcloud.png")