python绘制词云图

部署运行你感兴趣的模型镜像

前言

本文详细介绍了如何使用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")  # 生成类别词云

结语

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

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 生成词云图的工具与示例代码 词云图是一种将文本数据中的关键词以视觉化形式展示的方式,通过大小、颜色等属性突出重要词汇。以下是生成词云图的工具和示例代码。 #### 一、Python实现词云图的工具 Python中常用的词云生成库是`wordcloud`[^1]。它能够快速生成美观的词云图,并支持自定义背景、字体样式以及颜色方案等功能。 #### 二、完整示例代码 以下是一个完整的9行Python代码示例,用于生成词云图[^1]: ```python from wordcloud import WordCloud import matplotlib.pyplot as plt # 准备文本数据 text = "Python is a great programming language for data analysis and visualization" # 创建词云对象 wordcloud = WordCloud(font_path="simhei.ttf", background_color="white", max_words=500, width=800, height=400).generate(text) # 显示词云图 plt.figure(figsize=(10, 5)) plt.imshow(wordcloud, interpolation='bilinear') plt.axis("off") plt.show() ``` 在上述代码中: - `font_path="simhei.ttf"`:指定字体文件路径,确保中文显示正常[^3]。 - `background_color="white"`:设置背景颜色为白色。 - `max_words=500`:限定最多显示的单词数量为500个。 - `width=800, height=400`:设置词云图的宽度和高度。 #### 三、注意事项 1. 如果需要处理中文文本,必须指定支持中文的字体文件(如黑体“simhei.ttf”)[^3]。 2. 可以通过`generate_from_frequencies()`方法从词频字典生成词云图[^3]。 3. 使用`matplotlib`库展示词云图时,推荐关闭坐标轴以获得更清晰的效果。 #### 四、在线词云生成工具 除了编程方式,还可以使用在线工具快速生成词云图。例如,优快云博客推荐了多款顶级在线词云生成器,用户可以通过上传文本或URL生成词云图[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值