在参与正大杯市场调研大赛的准备过程中,我被分配到了文本挖掘及后续可视化的工作任务,其中就包括爬取微博博文内容数据、以及将内容可视化(生成云图)接下来我将以生成词云图为目标,介绍实现方法以及煮波的一些心路历程。
一、微博数据爬取(另外介绍)
二、生成词云图
从微博爬取的数据会以csv的格式存放在项目文件中,目前我采用的方法是将csv文件转为excel,再对excel中的文本进行词频统计,从而生成词云图,将内容可视化。
用到的软件:Pycharm,Anaconda,Excel
1.在pycharm中打开项目WordCloud
代码非常简短,只有如下几十行:
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import jieba
import pandas as pd
# 读取 Excel 文件
df = pd.read_excel(u"C:\\Users\\XXX\\Desktop\\微博数据1.xlsx")
# 假设文本内容在 '博文内容' 列中
text = df['博文内容'].astype(str).str.cat(sep=' ')
# 使用 jieba 进行分词
words = jieba.cut(text)
word_freq = {}
for word in words:
if len(word) > 1:
word_freq[word] = word_freq.get(word, 0) + 1
# 按词频排序
items = sorted(word_freq.items(), key=lambda x: x[1], reverse=True)
# 将词频写入 output.txt 临时文件
with open("output.txt", 'w', encoding='utf-8') as wf:
for word, count in items[:100]:
print(word, count)
wf.write(word + ' ' + str(count) + '\n')
# 如果要设置词云图的形状,读取形状图片
mask_image = Image.open(r'pic/heart.png').convert('RGBA')
mask = np.array(mask_image)
# 将图片的透明部分设置为0,非透明部分设置为255
mask = np.where(mask[:, :, 3] == 0, 0, 255) # 透明部分设置为0,非透明部分设置为255
# 生成词云
wordcloud = WordCloud(
font_path=r'C:\Windows\Fonts\msyh.ttc',#设置图片字体
colormap=plt.cm.Pastel1, # 使用渐变颜色映射
background_color='white', # 设置背景颜色为白色
# mask=mask, # 设置形状背景
width=800, # 增大画布宽度
height=600, # 增大画布高度
max_font_size=100, # 减小最大字体大小
min_font_size=10, # 减小最小字体大小
max_words=100 # 减少单词数量
).generate_from_frequencies(word_freq)
# 显示词云
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
2.安装必要的库
ps:由于煮波的pycharm interpreter用的是anaconda中生成的虚拟环境,所以以下库我都是在Anaconda Prompt里面安装的。
pip install jieba #中文分词插件
pip install matplotlib #用于显示和保存云图
pip install wordcloud #保存和显示云图
pip install numpy
pip install image
pip install pandas
在生成词云图的过程中,numpy和pandas也发挥着重要作用:
numpy的作用:
- 处理图片数组:将图片转换为数组形式,特别是在处理mask(蒙版)时
- 数据处理:提供高效的数组操作,用于处理大量数据
- 图形处理:协助处理词云图的形状和布局
pandas的作用:
- 数据读取:方便地读取Excel文件中的数据
- 数据清洗:处理和转换文本数据
- 数据整理:将文本内容转换为适合生成词云的格式
这两个库的结合使用大大简化了数据处理和图像生成的过程,提高了代码的效率和可读性。
3.将源代码中部分相应的路径改为自己的
- 读取的excel文件的位置
- 读取形状图片的位置
- 字体的位置(!!一定注意)一般是在C盘的font文件夹中,不过一定要注意检查路径
- 生成词云部分的词云样式,matplotlib提供了许多美观的颜色映射,可以自行搜索参考,这里我使用的是Paste1,颜色很柔和美观:
4.接下来~运行!一般情况下就不会有报错啦(有的话大不了再挨个查,对于我这样的小白而言运行代码的过程不断改bug的过程)
运行后会生成临时文件output.txt,这个文件中将出现读取的excel中相应一栏中的高频词及其频次,最后也会生成词云图Figure1,到此就圆满结束啦!
不过考虑到大家的问题应该都是大同小异,我在下面整理了我遇到的问题报错供大家参考——
5.问题汇总
1. 安装和环境配置问题
问题:
ModuleNotFoundError: No module named 'matplotlib'
:表示matplotlib
库未安装。ModuleNotFoundError: No module named 'wordcloud'
:表示wordcloud
库未安装。ModuleNotFoundError: No module named 'jieba'
:表示jieba
库未安装。
解决方法:
-
使用
pip
安装缺失的库:pip install 库名
2. 文件路径和权限问题
问题:
FileNotFoundError
:表示文件路径不正确或文件不存在。PermissionError
:表示没有权限读取或写入文件。OSError: cannot open resource
:表示无法打开指定的字体文件。
解决方法:
-
确保文件路径正确,使用绝对路径:
file_path = r'C:\Users\13321\Desktop\文件名.xlsx' font_path = r'C:\Windows\Fonts\msyh.ttf'
-
确保当前用户有读取和写入文件的权限。
在文件资源管理器中,右击相应文件夹→属性→安全,设置相应的权限。
3. 编码问题
问题:
UnicodeDecodeError
:表示文件编码不正确,导致解码失败。
解决方法:
-
指定文件编码为
utf-8
:with open(file_path, 'r', encoding='utf-8') as f: content = f.read()
-
使用
pandas
读取 Excel 文件时指定编码:df = pd.read_excel(file_path, encoding='utf-8')
4. 词云图形状问题
问题:
- 生成的词云图形状不符合预期,文字出现在了透明部分而不是黑色部分。
解决方法:
-
确保掩码中的透明部分设置为0,非透明部分设置为255:
mask_image = Image.open(r'C:\Users\13321\Desktop\shape.png').convert('RGBA') mask = np.array(mask_image) mask = np.where((mask[:, :, 0] == 255) & (mask[:, :, 1] == 255) & (mask[:, :, 2] == 255), 0, 255)
-
确保图片的背景是透明的,形状部分是黑色或其他非白色颜色。
5. 词云图生成空间不足问题
报错:
ValueError: Couldn't find space to draw. Either the Canvas size is too small or too much of the image is masked out.
:表示画布尺寸太小或掩码中的有效区域太少。
解决方法:
-
增大画布尺寸:
wordcloud = WordCloud( font_path=font_path, colormap=plt.cm.Pastel1, background_color='white', mask=mask, width=800, height=600, max_font_size=100, min_font_size=10, max_words=100 ).generate_from_frequencies(word_freq)
-
减少单词数量,调整单词大小。
总结
通过以上步骤,相信你可以解决在生成词云图过程中遇到的常见问题。希望这些方法对大家有所帮助!如果你在使用词云图生成时还有其他问题,欢迎继续提问,让我们一起解决~