微博文本挖掘并生成词云图(亲身经历~超级小白教程)

在参与正大杯市场调研大赛的准备过程中,我被分配到了文本挖掘及后续可视化的工作任务,其中就包括爬取微博博文内容数据、以及将内容可视化(生成云图)接下来我将以生成词云图为目标,介绍实现方法以及煮波的一些心路历程。

一、微博数据爬取(另外介绍)

二、生成词云图

从微博爬取的数据会以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,颜色很柔和美观:

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

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值