python绘制词云图
本文详细介绍了如何使用Python的WordCloud等库绘制词云图,包括分词、去停用词等基本数据处理以及图片保存等操作。
前言
本文详细介绍了如何使用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") # 生成类别词云
结语
如果大家觉得有帮助,请多多点赞收藏支持一下,谢谢大家。如果遇到什么问题,也非常欢迎大家私信。

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