微博文本挖掘并生成词云图(小白教程,放心食用~非计算机朋友也能完成)
写在前面:该博文补充了相较于前一篇文章缺失微博数据爬取的部分,根据这边内容即可完整完成标题所述需求噢!
—————————————————————————
在参与正大杯市场调研大赛的准备过程中,我被分配到了文本挖掘及后续可视化的工作任务,其中就包括爬取微博博文内容数据、以及将内容可视化(生成云图)接下来我将以生成词云图为目标,介绍实现方法以及煮波的一些心路历程。
一、微博数据爬取
要对微博做文本挖掘,对于像煮波这样的小白而言有两种方法:
1.用现成的挖掘工具——八爪鱼(推荐非科班同学使用)
八爪鱼有很多现成的爬取模板可供使用,图形化的页面非常直观,也有很多的视频教程让小白轻松上手,八爪鱼的官方链接:八爪鱼采集器 - 免费网络爬虫软件_网页大数据抓取工具
以下是八爪鱼的界面以及一些比较热门的模板
2.用python代码(推荐计算机专业同学使用)
GitHub上有非常好用的轮子,聪明的煮波选择借力~
代码网址如下:https://github.com/dataabc/weibo-search
🪄【打不开?请选择科学上网~】
(1)进入上面的网址
点击绿色的code
→DOWNLOAD ZIP
即可下载压缩包
(2)在vscode中打开解压后的文件
在点击【打开文件夹】后,打开解压后的文件
(3)【关键!】认真仔细阅读readme的内容,照着做就完了!
尤其注意:获取cookie的步骤在README的最后噢~不要像我一样半天找不到
(4)按照自己的需要,修改settings.py里的爬取条件
(5)在终端输入运行命令scrapy crawl search -s JOBDIR=crawls/search
,开始运行~
此时会发现终端开始疯狂输出,在【结果文件】中也有了大量的数据存放在csv格式的文件中。
3.问题汇总
(1)No pyvenv.cfg file!!
不说是一生之敌,这个问题也是三日之敌了,反正煮波遇到的问题是在pycharm的添加新的解释器interpreter时,选择现有的conda虚拟环境,但是一直没有找到正确的路径(真的就是字面意思没找到)
总而言之我认为解决这个问题的大体思路是:
在anacanda中创建一个新的虚拟环境→激活这个环境→在conda中安装需要的包→在pycharm中选择这个新虚拟环境作为解释器。
以下是系统解决这个问题的方案:
问题描述
在尝试运行 Python 项目时,遇到了 No pyvenv.cfg file
错误。这个错误通常表示 Python 无法找到虚拟环境的配置文件 pyvenv.cfg
,这可能是由于虚拟环境未正确创建或路径不正确导致的。
遇到的情况
- 错误信息:
No pyvenv.cfg file
:表示 Python 无法找到虚拟环境的配置文件pyvenv.cfg
。无法连接到控制台进程
:可能是因为虚拟环境未正确激活或路径不正确。
- 检查虚拟环境:
- 确认虚拟环境是否已正确创建。使用
conda env list
或python -m venv
命令检查虚拟环境列表。 - 确认虚拟环境的路径是否正确。使用
conda info --envs
或venv
命令查看虚拟环境的路径。
- 确认虚拟环境是否已正确创建。使用
- 激活虚拟环境:
- 尝试激活虚拟环境。使用
conda activate <env_name>
或source <venv_path>/bin/activate
(Linux/macOS)或<venv_path>\Scripts\activate
(Windows)命令激活虚拟环境。 - 确认激活后命令行提示符是否显示虚拟环境名称,例如
(myenv) C:\Users\13321>
。
- 尝试激活虚拟环境。使用
- 检查 Python 解释器:
- 确认当前使用的 Python 解释器是否是虚拟环境中的解释器。使用
which python
(Linux/macOS)或where python
(Windows)命令查看当前使用的 Python 解释器路径。
- 确认当前使用的 Python 解释器是否是虚拟环境中的解释器。使用
- 重新创建虚拟环境:
- 如果虚拟环境存在问题,尝试重新创建虚拟环境。使用
conda create -n <env_name> python=3.x
或python -m venv <venv_path>
命令创建新的虚拟环境。
- 如果虚拟环境存在问题,尝试重新创建虚拟环境。使用
最终解决方案
- 确认虚拟环境路径:
- 确认虚拟环境的路径是否正确。使用
conda info --envs
或venv
命令查看虚拟环境的路径。
- 确认虚拟环境的路径是否正确。使用
- 激活虚拟环境:
- 激活虚拟环境。使用
conda activate <env_name>
或<venv_path>\Scripts\activate
(Windows)命令激活虚拟环境。 - 确认激活后命令行提示符是否显示虚拟环境名称,例如
(myenv) C:\Users\13321>
。
- 激活虚拟环境。使用
- 检查 Python 解释器:
- 确认当前使用的 Python 解释器是否是虚拟环境中的解释器。使用
which python
(Linux/macOS)或where python
(Windows)命令查看当前使用的 Python 解释器路径。
- 确认当前使用的 Python 解释器是否是虚拟环境中的解释器。使用
- 重新创建虚拟环境:
- 如果虚拟环境存在问题,尝试重新创建虚拟环境。使用
conda create -n <env_name> python=3.x
或python -m venv <venv_path>
命令创建新的虚拟环境。 - 重新激活新创建的虚拟环境,确保路径和解释器正确。
- 如果虚拟环境存在问题,尝试重新创建虚拟环境。使用
- 配置 IDE:
- 如果你使用的是 PyCharm 或其他 IDE,确保项目配置的 Python 解释器是虚拟环境中的解释器。
- 在 PyCharm 中,进入
File
>Settings
>Project: [Your Project Name]
>Python Interpreter
,选择虚拟环境中的 Python 解释器。
(2)博文时间问题
尽可能避免中断数据爬取,否则可能导致大量的重复数据等问题。
(3)。。。等待补充ing
二、生成词云图
从微博爬取的数据会以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)
-
减少单词数量,调整单词大小。
总结
通过以上步骤,相信你可以解决在生成词云图过程中遇到的常见问题。希望这些方法对大家有所帮助!如果你在使用词云图生成时还有其他问题,欢迎继续提问,让我们一起解决~