前言

本文详细介绍了如何使用Python的WordCloud等库绘制词云图,包括分词、去停用词等基本数据处理以及图片保存等操作。

具体操作步骤

一、环境配置与数据准备

1.1 安装依赖库

首先,确保已经安装了所需的库:

pip install pandas scikit-learn wordcloud matplotlib jieba openpyxl
1.2 导入模块

接着,导入我们所需要用到的库:

import pandas as pd  # 导入pandas库用于数据处理
from sklearn.feature_extraction.text import TfidfVectorizer  # 导入TfidfVectorizer用于计算TF-IDF值
from collections import Counter  # 导入Counter用于统计词频
import numpy as np  # 导入numpy库用于数值运算
from wordcloud import WordCloud, ImageColorGenerator  # 导入WordCloud用于生成词云
import matplotlib.pyplot as plt  # 导入matplotlib.pyplot用于绘图
import os  # 导入os库用于文件操作
from PIL import Image, ImageDraw, ImageFont  # 导入PIL库中的模块用于图像处理
import jieba  # 导入jieba库用于中文分词
1.3 设置字体路径

设置字体路径以便在生成词云图时能够正常显示中文:

font_path = 'simhei.ttf'  # 设置字体路径
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置默认字体为SimHei
1.4 定义输出目录

定义输出目录路径,如果该目录不存在,就创建输出目录,便于保存绘制的词云图:

output_dir = 'wordcloud_images'  # 定义输出目录路径
os.makedirs(output_dir, exist_ok=True)  # 创建输出目录,如果目录已存在则忽略

二、数据加载与处理

2.1 读取Excel数据

这里需要将'韩束.xlsx' 修改为自己的文件路径。

input_file = '韩束.xlsx'  # 定义输入文件路径
df = pd.read_excel(input_file)  # 读取Excel文件到DataFrame中
2.2 去重

id是不同评论者的唯一标识,这里我们将id和comment均相同的数据视为重复的评论数据,进行去重操作:

df.drop_duplicates(subset=['id', 'comment'], inplace=True)  # 去除重复的评论
2.3 分词并去停用词

接着我们使用jieba进行中文评论分词,并导入停用词表,对分词后的数据进行去停用词操作,最后将结果用空格连接成一个字符串,并存储在新列 comment_tokenized 中。由于存在一些纯数字或纯字母等的无效评论数据,去停用词后可能评论数据为空,因此还需要过滤掉处理后为空字符串的行。jieba库的三种分词模式分别是精确模式、全模式和搜索引擎模式:

分词模式 特点 适用场景 使用
精确模式 尝试将文本精确地切分成词语,不存在冗余数据。 适合文本分析和挖掘等任务。  jieba.cut(text,cut_all=False)
全模式 将文本中所有可能的词语都分出来,速度非常快,但存在冗余数据。 适用于一些对速度要求比较高的场景。 jieba.cut(text,cut_all=True)
搜索引擎模式 在精确模式的基础上,对长词再次进行切分,以提高召回率。 适合搜索引擎分词。 jieba.cut_for_search(text)
# 读取停用词表
with open('cn_stopwords.txt', 'r', encoding='utf-8') as f:
    stopwords = set(f.read().splitlines())  # 读取停用词并存入集合

# 分词函数
def tokenize(text):
    words = jieba.lcut(text)  # 使用jieba进行分词
    filtered_words = [word for word in words if word not in stopwords]  # 去除停用词
    return ' '.join(filtered_words)  # 将结果用空格连接

# 对评论进行分词处理
df['comment_tokenized'] = df['comment'].apply(tokenize)  # 应用分词函数到每一行评论

# 过滤掉空字符串的行
df = df[df['comment_tokenized'] != '']

三、TF-IDF关键词提取

首先定义一个函数 compute_tfidf 来计算TF-IDF值,然后对处理后的评论数据,通过调用该函数来获取每个词汇的TF-IDF得分总和。接着创建一个包含词汇和TF-IDF得分的数据框,并按TF-IDF得分进行降序排序,提取前300个重要的词汇。(如果希望词云图更加简洁,仅显示最重要的词汇,可以不断缩小‘300’这个数)

def compute_tfidf(data_chunk):
    vectorizer = TfidfVectorizer(max_features=500)  # 初始化TfidfVectorizer对象,最大特征数为500
    tfidf_matrix = vectorizer.fit_transform(data_chunk)  # 计算TF-IDF矩阵
    feature_names = vectorizer.get_feature_names_out()  # 获取特征名称(即词汇)
    sum_tfidf_scores = np.asarray(tfidf_matrix.sum(axis=0)).flatten()  # 计算每个词汇的TF-IDF得分总和
    return feature_names, sum_tfidf_scores  # 返回词汇及其对应的TF-IDF得分总和
# 直接对整个数据集进行TF-IDF计算
feature_names, sum_tfidf_scores = compute_tfidf(df['comment_tokenized'])
feature_df = pd.DataFrame({'Word': feature_names, 'TF-IDF Score': sum_tfidf_scores})  # 创建包含词汇和TF-IDF得分的数据框
feature_df = feature_df.sort_values(by='TF-IDF Score', ascending=False).reset_index(drop=True)  # 按TF-IDF得分降序排序
top_300_features = feature_df.head(300)  # 获取前300个重要词汇
word_freq_dict = dict(zip(top_300_features['Word'], top_300_features['TF-IDF Score']))  # 创建词汇和TF-IDF得分的字典

四、词云图绘制

4.1 定义生成词云图的函数

首先定义一个函数 generate_wordcloud 来生成词云图像,并保存到指定文件中。WordCloud参数及其描述如下:

参数 描述
width 指定词云对象生成图片的宽度,默认400像素
height 指定词云对象生成图片的高度,默认200像素
min_font_size 指定词云中字体的最小字号,默认4号
max_font_size 指定词云中字体的最大字号,根据高度自动调节
font_step 指定词云中字体字号的步进间隔,默认为1
font_path 指定字体文件的路径,默认None
max_words 指定词云显示的最大单词数量,默认200
stop_words 指定词云的排除词列表,即不显示的单词列表
mask 指定词云形状,默认为长方形,需要引用imread()函数
background_color 指定词云图片的背景颜色,默认为黑色
contour_width 指定词云中每个单词轮廓的宽度。
contour_color 指定词云中每个单词轮廓的颜色。
def generate_wordcloud(word_freq_dict, font_path=None, title="评论词云图", filename="overall_wordcloud.png"):
    if font_path is None:
        try:
            font_path = 'simhei.ttf'  # 设置字体路径
            ImageFont.truetype(font_path)  # 检查字体是否存在
        except IOError:
            print("不存在 simhei.ttf 字体")  # 如果找不到字体,则打印提示信息
            font_path = None
    wordcloud = WordCloud(
        font_path=font_path,
        width=800,
        height=400,
        background_color='white',
        contour_width=3,
        contour_color='steelblue'
    ).generate_from_frequencies(word_freq_dict)  # 根据频率生成词云
    plt.figure(figsize=(10, 5))  # 创建一个新的图形
    plt.imshow(wordcloud, interpolation='bilinear')  # 显示词云图像
    plt.title(title)  # 设置图形标题
    plt.axis('off')  # 关闭坐标轴
    plt.savefig(os.path.join(output_dir, filename), bbox_inches='tight')  # 保存图像到文件
    plt.close()  # 关闭图形
4.2 生成整体评论词云图

调用 generate_wordcloud 函数生成整体评论词云图并保存到 wordcloud_images 目录下。

generate_wordcloud(word_freq_dict, title="评论词云图", filename="overall_wordcloud.png")  # 生成整体评论词云
4.3 生成各类别产品评论词云图

遍历所有类别,分别生成每个类别的评论词云图并保存到 wordcloud_images 目录下。首先根据“catagory”列获得所有类别的名称,然后将全部评论按照各类别进行分类合并,接着和整体评论的处理方式相同,对每个类别的评论分别计算各词汇在各类别评论的TF-IDF值,并降序排列,取前300个特征词生成相应的词云图。

# 处理每个类别
categories = df['catagory'].unique()  # 获取所有类别
for category in categories:
    category_comments = ' '.join(df[df['catagory'] == category]['comment_tokenized'])  # 合并同类别的评论
    if category_comments.strip():  # 确保有非空评论
        feature_names, sum_tfidf_scores = compute_tfidf([category_comments])  # 计算该类别的TF-IDF值
        feature_df = pd.DataFrame({'Word': feature_names, 'TF-IDF Score': sum_tfidf_scores})  # 创建包含词汇和TF-IDF得分的数据框
        feature_df = feature_df.sort_values(by='TF-IDF Score', ascending=False).reset_index(drop=True)  # 按TF-IDF得分降序排序
        top_300_features = feature_df.head(300)  # 获取前300个重要词汇
        category_word_freq_dict = dict(zip(top_300_features['Word'], top_300_features['TF-IDF Score']))  # 创建词汇和TF-IDF得分的字典
        generate_wordcloud(category_word_freq_dict, title=f"{category}类别词云图", filename=f"{category}_wordcloud.png")  # 生成类别词云

结语

如果大家觉得有帮助,请多多点赞收藏支持一下,谢谢大家。如果遇到什么问题,也非常欢迎大家私信。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐