微博文本挖掘并生成词云图(完整版)

微博文本挖掘并生成词云图(小白教程,放心食用~非计算机朋友也能完成)

写在前面:该博文补充了相较于前一篇文章缺失微博数据爬取的部分,根据这边内容即可完整完成标题所述需求噢!
—————————————————————————
在参与正大杯市场调研大赛的准备过程中,我被分配到了文本挖掘及后续可视化的工作任务,其中就包括爬取微博博文内容数据、以及将内容可视化(生成云图)接下来我将以生成词云图为目标,介绍实现方法以及煮波的一些心路历程。

一、微博数据爬取

要对微博做文本挖掘,对于像煮波这样的小白而言有两种方法:

1.用现成的挖掘工具——八爪鱼(推荐非科班同学使用)

八爪鱼有很多现成的爬取模板可供使用,图形化的页面非常直观,也有很多的视频教程让小白轻松上手,八爪鱼的官方链接:八爪鱼采集器 - 免费网络爬虫软件_网页大数据抓取工具

以下是八爪鱼的界面以及一些比较热门的模板
八爪鱼

2.用python代码(推荐计算机专业同学使用)

GitHub上有非常好用的轮子,聪明的煮波选择借力~

代码网址如下:https://github.com/dataabc/weibo-search

🪄【打不开?请选择科学上网~】

(1)进入上面的网址

点击绿色的codeDOWNLOAD ZIP即可下载压缩包
github

(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,这可能是由于虚拟环境未正确创建或路径不正确导致的。

遇到的情况

  1. 错误信息
    • No pyvenv.cfg file:表示 Python 无法找到虚拟环境的配置文件 pyvenv.cfg
    • 无法连接到控制台进程:可能是因为虚拟环境未正确激活或路径不正确。
  2. 检查虚拟环境
    • 确认虚拟环境是否已正确创建。使用 conda env listpython -m venv 命令检查虚拟环境列表。
    • 确认虚拟环境的路径是否正确。使用 conda info --envsvenv 命令查看虚拟环境的路径。
  3. 激活虚拟环境
    • 尝试激活虚拟环境。使用 conda activate <env_name>source <venv_path>/bin/activate(Linux/macOS)或 <venv_path>\Scripts\activate(Windows)命令激活虚拟环境。
    • 确认激活后命令行提示符是否显示虚拟环境名称,例如 (myenv) C:\Users\13321>
  4. 检查 Python 解释器
    • 确认当前使用的 Python 解释器是否是虚拟环境中的解释器。使用 which python(Linux/macOS)或 where python(Windows)命令查看当前使用的 Python 解释器路径。
  5. 重新创建虚拟环境
    • 如果虚拟环境存在问题,尝试重新创建虚拟环境。使用 conda create -n <env_name> python=3.xpython -m venv <venv_path> 命令创建新的虚拟环境。

最终解决方案

  1. 确认虚拟环境路径
    • 确认虚拟环境的路径是否正确。使用 conda info --envsvenv 命令查看虚拟环境的路径。
  2. 激活虚拟环境
    • 激活虚拟环境。使用 conda activate <env_name><venv_path>\Scripts\activate(Windows)命令激活虚拟环境。
    • 确认激活后命令行提示符是否显示虚拟环境名称,例如 (myenv) C:\Users\13321>
  3. 检查 Python 解释器
    • 确认当前使用的 Python 解释器是否是虚拟环境中的解释器。使用 which python(Linux/macOS)或 where python(Windows)命令查看当前使用的 Python 解释器路径。
  4. 重新创建虚拟环境
    • 如果虚拟环境存在问题,尝试重新创建虚拟环境。使用 conda create -n <env_name> python=3.xpython -m venv <venv_path> 命令创建新的虚拟环境。
    • 重新激活新创建的虚拟环境,确保路径和解释器正确。
  5. 配置 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,颜色很柔和美观:
    在这里插入图片描述

    https://www.notion.so

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)
    
  • 减少单词数量,调整单词大小。

总结

通过以上步骤,相信你可以解决在生成词云图过程中遇到的常见问题。希望这些方法对大家有所帮助!如果你在使用词云图生成时还有其他问题,欢迎继续提问,让我们一起解决~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值