Python-基于PyQt5,wordcloud,pillow,numpy,os,sys的智能词云生成器

devtools/2025/2/3 10:09:00/

前言:日常生活中,我们有时后就会遇见这样的情形:我们需要将给定的数据进行可视化处理,同时保证呈现比较良好的量化效果。这时候我们可能就会用到词云图。词云图(Word cloud)又称文字云,是一种文本数据的图片视觉表达方式,一般是由词汇组成类似云的图形,用于展示大量文本数据。词云这个概念首先是由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登提出的,通常用于描述网站上的关键字元数据(标签),或可视化自由格式文本。“词云”就是通过形成“关键词云层”或“关键词渲染”,对网络文本中出现频率较高的“关键词”的视觉上的突出,每个词的重要性以字体大小或颜色显示。今天,我们就一起来学习如何利用Python制作一个简单的智能词云生成器。

编程思路:本次编程我们将会调用到调用到wordcloud,PyQt5,pillow(PIL),numpy,sys,os等库。其中,wordcloud是本次编程的主体,它可以指定词云的形状,颜色,字体,背景等,帮助我们轻松地生成美观、直观的词云。PyQt5被用于创建一个图形用户界面,包括按钮、文本框、标签、布局管理器等组件,以及处理用户交互和事件,它将在词云生成的功能与用户界面相结合方面会很有用。pillowPython的一个很重要的图像处理库,它被用于读取我们选择好的词云的形状图片,并将其转换为numpy数组,以便在生成词云时使用。numpy则负责进行数据处理(包括我们输入的文本以及传入的图片等信息)。sys和os将会帮助我们与Python解释器(PyCharm)进行交互,以及控制程序的执行,并对系统文件进行相关操作。

第一步:导入库

标准库:sys,os。

第三方库:PyQt5,pillow(PIL),wordcloud,numpy

python">#导入必要库
import sys
import os
import numpy as np
from PIL import Image
from wordcloud import WordCloud
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt

第二步:创建功能类

我们用PyQt5库创建了一个功能丰富的GUI类(词云生成器类),允许用户选择形状图片、输入文本内容、选择字体文件、生成词云并保存生成的词云图片。在词云生成器类这个类中,我们创建了总共7个函数(初始化函数,UI初始化函数,系统图片文件夹获取函数,词云形状图片加载函数,字体文件选择函数,词云生成核心逻辑函数和词云图片保存函数),它们将执行各自的功能,共同完成生成词云图的工作。

python">#词云生成器类
class WordCloudGenerator(QWidget):#初始化函数def __init__(self):super().__init__()self.mask_image = Noneself.font_path = Noneself.temp_path = self.get_pictures_path()self.initUI()#UI初始化函数def initUI(self):# 主布局main_layout = QHBoxLayout()# 左侧面板left_panel = QVBoxLayout()self.image_btn = QPushButton('选择形状图片', self)self.image_btn.clicked.connect(self.load_image)self.image_preview = QLabel('图片预览区域')self.image_preview.setFixedSize(300, 300)self.image_preview.setFrameShape(QFrame.Box)self.image_preview.setAlignment(Qt.AlignCenter)self.text_edit = QTextEdit()self.text_edit.setPlaceholderText("在此输入文本内容...")self.font_btn = QPushButton('选择字体文件(中文字体需要)', self)self.font_btn.clicked.connect(self.select_font)self.generate_btn = QPushButton('生成词云', self)self.generate_btn.clicked.connect(self.generate_wordcloud)self.save_btn = QPushButton('保存词云', self)self.save_btn.clicked.connect(self.save_wordcloud)# 添加左侧组件left_panel.addWidget(self.image_btn)left_panel.addWidget(self.image_preview)left_panel.addWidget(QLabel('输入文本:'))left_panel.addWidget(self.text_edit)left_panel.addWidget(self.font_btn)left_panel.addWidget(self.generate_btn)left_panel.addWidget(self.save_btn)# 右侧面板right_panel = QVBoxLayout()self.result_preview = QLabel('词云预览区域')self.result_preview.setFixedSize(400, 400)self.result_preview.setFrameShape(QFrame.Box)self.result_preview.setAlignment(Qt.AlignCenter)# 添加右侧组件right_panel.addWidget(QLabel('词云图预览:'))right_panel.addWidget(self.result_preview)# 组合主布局main_layout.addLayout(left_panel, 40)main_layout.addLayout(right_panel, 60)self.setLayout(main_layout)# 窗口设置self.setWindowTitle('智能词云生成器')self.setWindowIcon(QIcon('icon.png'))  # 可选图标self.resize(800, 600)self.show()def get_pictures_path(self):"""获取系统图片文件夹路径"""if os.name == 'nt':return os.path.join(os.environ['USERPROFILE'], 'Pictures')else:return os.path.expanduser('~/Pictures')def load_image(self):"""加载形状图片"""path, _ = QFileDialog.getOpenFileName(self, '选择形状图片', '', '图像文件 (*.jpg *.jpeg *.png *.bmp)')if path:self.mask_image = np.array(Image.open(path))pixmap = QPixmap(path).scaled(300, 300, Qt.KeepAspectRatio)self.image_preview.setPixmap(pixmap)def select_font(self):"""选择字体文件"""path, _ = QFileDialog.getOpenFileName(self, '选择字体文件', '', '字体文件 (*.ttf *.otf)')if path:self.font_path = pathdef generate_wordcloud(self):"""生成词云核心逻辑"""text = self.text_edit.toPlainText()if not text.strip():QMessageBox.warning(self, '内容缺失', '请输入需要生成词云的文本内容!')returnif self.mask_image is None:QMessageBox.warning(self, '形状未选', '请先选择词云形状图片!')returntry:# 配置词云参数wc = WordCloud(background_color='white',mask=self.mask_image,font_path=self.font_path,max_words=200,width=800,height=600)wc.generate(text)# 保存临时文件temp_file = os.path.join(self.temp_path, "wordcloud_temp.png")wc.to_file(temp_file)# 显示预览pixmap = QPixmap(temp_file).scaled(400, 400, Qt.KeepAspectRatio)self.result_preview.setPixmap(pixmap)except Exception as e:QMessageBox.critical(self, '生成错误', f'词云生成失败: {str(e)}')def save_wordcloud(self):"""保存词云图片"""if not self.result_preview.pixmap():QMessageBox.warning(self, '无内容', '请先生成词云!')returndefault_path = os.path.join(self.temp_path, "我的词云.png")path, _ = QFileDialog.getSaveFileName(self,'保存词云',default_path,'PNG图像 (*.png);;JPEG图像 (*.jpg);;所有文件 (*)')if path:# 保持原始分辨率保存Image.open(os.path.join(self.temp_path, "wordcloud_temp.png")).save(path)QMessageBox.information(self, '保存成功', f'词云已保存至:\n{path}')

第三步:创建驱动单元

接着我们创建一段程序,它是Python程序的入口点,我们将利用它来驱动以上词云生成器类并执行相关系统程序。

python">#驱动程序单元
if __name__ == '__main__':app = QApplication(sys.argv)window = WordCloudGenerator()sys.exit(app.exec_())

第四步:完整代码展示

python">#导入必要库
import sys
import os
import numpy as np
from PIL import Image
from wordcloud import WordCloud
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt#词云生成器类
class WordCloudGenerator(QWidget):#初始化函数def __init__(self):super().__init__()self.mask_image = Noneself.font_path = Noneself.temp_path = self.get_pictures_path()self.initUI()#UI初始化函数def initUI(self):# 主布局main_layout = QHBoxLayout()# 左侧面板left_panel = QVBoxLayout()self.image_btn = QPushButton('选择形状图片', self)self.image_btn.clicked.connect(self.load_image)self.image_preview = QLabel('图片预览区域')self.image_preview.setFixedSize(300, 300)self.image_preview.setFrameShape(QFrame.Box)self.image_preview.setAlignment(Qt.AlignCenter)self.text_edit = QTextEdit()self.text_edit.setPlaceholderText("在此输入文本内容...")self.font_btn = QPushButton('选择字体文件(中文字体需要)', self)self.font_btn.clicked.connect(self.select_font)self.generate_btn = QPushButton('生成词云', self)self.generate_btn.clicked.connect(self.generate_wordcloud)self.save_btn = QPushButton('保存词云', self)self.save_btn.clicked.connect(self.save_wordcloud)# 添加左侧组件left_panel.addWidget(self.image_btn)left_panel.addWidget(self.image_preview)left_panel.addWidget(QLabel('输入文本:'))left_panel.addWidget(self.text_edit)left_panel.addWidget(self.font_btn)left_panel.addWidget(self.generate_btn)left_panel.addWidget(self.save_btn)# 右侧面板right_panel = QVBoxLayout()self.result_preview = QLabel('词云预览区域')self.result_preview.setFixedSize(400, 400)self.result_preview.setFrameShape(QFrame.Box)self.result_preview.setAlignment(Qt.AlignCenter)# 添加右侧组件right_panel.addWidget(QLabel('词云图预览:'))right_panel.addWidget(self.result_preview)# 组合主布局main_layout.addLayout(left_panel, 40)main_layout.addLayout(right_panel, 60)self.setLayout(main_layout)# 窗口设置self.setWindowTitle('智能词云生成器')self.setWindowIcon(QIcon('icon.png'))  # 可选图标self.resize(800, 600)self.show()def get_pictures_path(self):"""获取系统图片文件夹路径"""if os.name == 'nt':return os.path.join(os.environ['USERPROFILE'], 'Pictures')else:return os.path.expanduser('~/Pictures')def load_image(self):"""加载形状图片"""path, _ = QFileDialog.getOpenFileName(self, '选择形状图片', '', '图像文件 (*.jpg *.jpeg *.png *.bmp)')if path:self.mask_image = np.array(Image.open(path))pixmap = QPixmap(path).scaled(300, 300, Qt.KeepAspectRatio)self.image_preview.setPixmap(pixmap)def select_font(self):"""选择字体文件"""path, _ = QFileDialog.getOpenFileName(self, '选择字体文件', '', '字体文件 (*.ttf *.otf)')if path:self.font_path = pathdef generate_wordcloud(self):"""生成词云核心逻辑"""text = self.text_edit.toPlainText()if not text.strip():QMessageBox.warning(self, '内容缺失', '请输入需要生成词云的文本内容!')returnif self.mask_image is None:QMessageBox.warning(self, '形状未选', '请先选择词云形状图片!')returntry:# 配置词云参数wc = WordCloud(background_color='white',mask=self.mask_image,font_path=self.font_path,max_words=200,width=800,height=600)wc.generate(text)# 保存临时文件temp_file = os.path.join(self.temp_path, "wordcloud_temp.png")wc.to_file(temp_file)# 显示预览pixmap = QPixmap(temp_file).scaled(400, 400, Qt.KeepAspectRatio)self.result_preview.setPixmap(pixmap)except Exception as e:QMessageBox.critical(self, '生成错误', f'词云生成失败: {str(e)}')def save_wordcloud(self):"""保存词云图片"""if not self.result_preview.pixmap():QMessageBox.warning(self, '无内容', '请先生成词云!')returndefault_path = os.path.join(self.temp_path, "我的词云.png")path, _ = QFileDialog.getSaveFileName(self,'保存词云',default_path,'PNG图像 (*.png);;JPEG图像 (*.jpg);;所有文件 (*)')if path:# 保持原始分辨率保存Image.open(os.path.join(self.temp_path, "wordcloud_temp.png")).save(path)QMessageBox.information(self, '保存成功', f'词云已保存至:\n{path}')#驱动程序单元
if __name__ == '__main__':app = QApplication(sys.argv)window = WordCloudGenerator()sys.exit(app.exec_())

第五步:运行效果展示

第六步:操作指南

点击"选择形状图片",选择你想生成的词云图的形状(注意:图片最好分辨率高,以白色为背景为好,这样生成的词云图清晰美观),接着在"输入文本"下面的输入框中输入你想要生成的词云图的内容,接着点击下方的"选择字体文件(中文字体需要)"(注意:如果你输入的是中文文本的话需要你自行准备相关的中文字体文件,TTF或OTF都行;如果是英文字符的话不用)。再点击下方"生成词云",你就可以在窗口右方看到生成的预览词云图(如果不满意,可以再次点击"生成词云"重新生成词云)。如果满意生成的词云,可以点击下方"保存词云",填写你的词云图片文件名,并选择文件类型(当然,你也可以默认该操作),点击保存,系统会弹出一个信息框,提醒你图片的保存位置,记住这个位置,点击保存。返回计算机系统,按照位置搜索即可找到你生成的词云图。

第七步:注意事项

- 形状图片(建议使用透明背景PNG图片)
- 中文字体文件(如需处理中文内容)

- 首次运行时会在系统图片文件夹创建临时文件
- 保存时可自由修改文件名,但默认保存在系统图片目录
- 程序会自动处理文件夹不存在的情况(系统一般自带Pictures目录)

(我是闪云-微星,感谢你的点赞/关注)

 


http://www.ppmy.cn/devtools/155687.html

相关文章

【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点

学习PyQt的必要性 PyQt是开发跨平台GUI应用的强大工具,适合需要构建复杂、高性能界面的开发者。无论是职业发展还是项目需求,学习PyQt都具有重要意义。 1. 跨平台GUI开发 跨平台支持:PyQt基于Qt框架,支持Windows、macOS、Linux…

第27篇:Python开发进阶:python多线程与多进程编程

第27篇:多线程与多进程编程 目录 并发编程概述 什么是并发编程多线程与多进程的区别 多线程编程 线程的基本概念创建和管理线程线程同步与锁 多进程编程 进程的基本概念创建和管理进程进程间通信 线程与进程的比较全局解释器锁(GIL) GIL的影…

对比DeepSeek、ChatGPT和Kimi的学术写作撰写引言能力

引言 引言部分引入研究主题,明确研究背景、问题陈述,并提出研究的目的和重要性,最后,概述研究方法和论文结构。 下面我们使用DeepSeek、ChatGPT4以及Kimi辅助引言撰写。 提示词: 你现在是一名[计算机理论专家]&#…

2025.2.1总结

今天又过了一天,过得确实太快了,走了一天的 亲戚。 过年对于小孩子是好事,对于成年人就不一样了。在外混得好的还好说,混得不好的过年真的是心累。这消息也太灵通了,怎么一个个都知道我已经出来上班了。今天不知道是第…

使用 PaddlePaddle 实现逻辑回归:从训练到模型保存与加载

在机器学习中,逻辑回归是一种经典的分类算法,广泛应用于二分类问题。今天,我们将通过一个简单的例子,使用 PaddlePaddle 框架实现逻辑回归模型,并展示如何保存和加载模型,以便进行后续的预测。 1. 简介 逻…

排查定位jar包大文件

解压 JAR 包: mkdir jar_contents unzip your-jar-file.jar -d jar_contents统计各文件大小: du -ah jar_contents | sort -rh | head -n 20这会列出 JAR 包中最大的文件或目录,方便你定位大文件。 方法 2:使用 jar 工具查看文件…

使用eNSP配置GRE VPN实验

实验拓扑 实验需求 1.按照图示配置IP地址 2.在R1和R3上配置默认路由使公网区域互通 3.在R1和R3上配置GRE VPN,使两端私网能够互相访问,Tunne1口IP地址如图 4.在R1和R3上配置RIPv2来传递两端私网路由 实验步骤 GRE VPN配置方法: 发送端&#x…

【Rust】18.2. 可辩驳性:模式是否会无法匹配

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 18.2.1. 模式的两种形式 模式有两种形式: 可辩驳的(可失败的&…