CSDN热榜分析4:生成词云图

news/2024/10/17 23:21:27/

文章目录

    • 函数封装
    • UI设计
    • 输出词云

热榜分析系列: CSDN热榜分析🔥 UI界面🔥 领域热榜

函数封装

词云图的绘制功能早在最开始做热榜分析的时候就已经实现了,但需要依赖matplotlib来画图,而并没有直接导出功能,而且所有代码写在脚本里,并没有封装成函数。

首先用jieba分词,并把所有长度大于2的单词输出。

import jieba
# 通过jieba
def getWords(blogs):text = ','.join([b[1] for b in blogs])words = jieba.lcut(text)w2 = [w for w in words if len(w)>1] # 取出长度大于1的词return [w for w in w2 if w not in STOP_LIST]

其中STOP_LIST是停用词列表,被做成了全局变量

STOP_LIST = ['项目', '使用', '实现', '模型', '数据', '系统', '平台', '原理', '自学', '博客', '推荐', '实践', '实战', '技术', '基于', '如何', '什么']

单词导出后,则使用WordCloud进行词云绘制。函数如下,其中to_file可以把词云图导出为图像。

from wordcloud import WordCloud
def saveCloud(words, path, width=800, height=450, font=None)if not font : font = r"C:\Windows\Fonts\simhei.ttf"cloud = WordCloud(width=width, height=height, font_path=font)cloud.generate(" ".join(words))cloud.to_file(path)

UI设计

由于词云图在保存时预留了较多的个性化选项,包括宽高之类的,所以词云绘制功能需要多加一些,故而更改setFrmHeat的布局代码如下

def setFrmHeat(self, frmHeat):# 省略。。。pack = dict(side=tk.LEFT, padx=3)ttk.Separator(frmHeat,orient=tk.VERTICAL).pack(fill=tk.Y, **pack)ttk.Button(frmHeat, width=8, text="导出词云",command = self.btnExportCloud).pack(**pack)ttk.Label(frmHeat, text="  尺寸").pack(**pack)pSpinbox = dict(from_=100, to=2000, width=5, increment=10)self.sbCloudWidth = ttk.Spinbox(frmHeat, **pSpinbox)self.sbCloudWidth.pack(**pack)self.sbCloudWidth.set(800)ttk.Label(frmHeat, text="✖").pack(**pack)self.sbCloudHeight = ttk.Spinbox(frmHeat, **pSpinbox)self.sbCloudHeight.pack(**pack)self.sbCloudHeight.set(450)ttk.Button(frmHeat, width=8, text="设置字体",command = self.btnSetCloudFont).pack(**pack)def btnExportCloud(self):passdef btnSetCloudFont(self):self.cloudFont = askopenfilename(filetypes=[("字体文件", ".font")])

其中self.cloudFont是一个类成员,默认值是None,布局结果如下

在这里插入图片描述

btnExportCloud就是导出词云的用户逻辑,接下来就来实现它

输出词云

考虑到需要输入不同类型的词云,所以先创建一个成员方法,用于输出一种类型的词云,方法如下,其实就是简单地调用getWords和saveCloud函数,并给出反馈信息

def btnExportOneCloud(self, name, wsLst, path, w, h, font):words = getWords(wsLst)saveCloud(words, pJoin(path, f"{name}.png"), w, h, font)self.addLogs(f"{name}词云已输出")return words

我们至少要输出三种词云,首先是总榜的词云,然后是领域热榜的词云,最后还要把所有词云的单词作为一个整榜输出。这也就意味着需要调用三次btnExportOneCloud函数:总榜列表调用一次;领域热榜字典,需要在循环中调用一次;最后所有词汇再调用一次。

所以btnExportCloud需要设置一个存储所有单词的列表,每次词云输出后,都要将对应的词汇导入到这个列表中。最终其写法如下

def btnExportCloud(self):path = askdirectory()if path=="":self.infoCSDN.set(f"您未选择文件夹")return            self.infoCSDN.set(f"词云图将存储在文件夹{path}中")allWords = []w = int(self.sbCloudWidth.get())h = int(self.sbCloudHeight.get())font = self.cloudFont# 总榜导出总榜if self.heatBlogs != []:words = self.btnExportOneCloud("总榜", self.heatBlogs, path, w, h, font)allWords.extend(words)if self.subHeats == {}:return  # 如果没有领域热榜,那么总榜就是全榜,所以直接退出for k,v in self.subHeats.items():words = self.btnExportOneCloud(k, v, path, w, h, font)allWords.extend(words)saveCloud(allWords, pJoin(path, f"全榜.png"), w, h, font)self.addLogs(f"全榜词云已输出")

这个函数分为四个部分,第一部分是读取词云参数,包括存放文件夹、词云尺寸以及字体,并且创建列表allWords,用于存放所有词汇。

第二部分输出总榜词云。

第三部分循环subHeats,正式循环之前,判断一下是否为空,如果没有领域热榜,那么总榜就是全榜,所以直接退出。

最后输出全部榜单,由于已经得到了allWords,所以不必调用btnExportOneCloud,直接用外部函数saveCloud来保存词云。

最后的词云输出如下

在这里插入图片描述


http://www.ppmy.cn/news/1185674.html

相关文章

CSS宽度100%和宽度100vw之间有什么不同?

vw和vh分别代表视口宽度和视口高度。 使用width: 100vw代替的区别在于width: 100%,虽然100%将使元素适合所有可用空间,但视口宽度具有特定的度量,在这种情况下,可用屏幕的宽度 。 如果设置样式body { margin: 0 },则1…

qt-C++笔记之带有倒计数显示的按钮,计时期间按钮锁定

qt-C笔记之带有倒计数显示的按钮&#xff0c;计时期间按钮锁定 code review! 文章目录 qt-C笔记之带有倒计数显示的按钮&#xff0c;计时期间按钮锁定1.运行2.main.cc3.main.pro 1.运行 2.main.cc 代码 #include <QApplication> #include <QPushButton> #includ…

webGL编程指南 第五章 MultiAttributeSize_interleaved.js

我会持续更新关于wegl的编程指南中的代码。 当前的代码不会使用书中的缩写&#xff0c;每一步都是会展开写。希望能给后来学习的一些帮助 git代码地址 &#xff1a;空 在上一章节中我们使用的是2个buffer&#xff0c;向着色器中传递数据&#xff0c;本章节中我们学习使用一个…

voice 和token 互相转

voice 和token 互相转 解释代码解释 这段代码实现了一个将音频数据转换为 token 列表,并将 token 列表转换回音频的转换过程。以下是代码的主要步骤: 导入所需的库,包括 paddle、numpy、tqdm 和 glob。 定义一个名为 read_and_gen_token 的函数,该函数接受一个音频文件名作…

网上的流量卡与实际不符,可能是这三种原因导致的!

很多朋友反映&#xff0c;自己在网上买的流量卡套餐内流量与实际情况不符&#xff0c;其实&#xff0c;这是一种比较常见的现象&#xff0c;今天&#xff0c;关于其中的原因&#xff0c;小编给大家介绍一下。 ​ 如果买的流量卡套餐内流量与实际不符&#xff0c;无非有三种原因…

AI助力隧道等洞体类场景下水泥基建缺陷检测,基于DeeplabV3Plus开发构建洞体场景下壁体建筑缺陷分割系统

随着智能化硬件的加持&#xff0c;越来越多的场景开始有AI的助力&#xff0c;诸如&#xff1a;道路自动巡检养护、隧道巡检、铁路质检等等&#xff0c;引入AI技术可以大幅降低人工工作量&#xff0c;提升质检的工作效率&#xff0c;在前面的文章中我们已经落地实践开发洞体类场…

Baklib Max 新产品上线,全面助力企业数字化体验

2023年9月28日&#xff0c;数字内容云平台Baklib Max正式上线。作为一款旨在统一管理企业数字媒体资产的平台&#xff0c;Baklib Max通过网站、知识库、社区、Chat等多种形式多场景应用展示&#xff0c;全面实现对企业数字资产、媒体内容、知识沉淀的统一管理应用&#xff0c;帮…

echarts修改图例legend样式:正方形、矩形、圆形、圆角

ECharts 提供的标记类型有 ‘circle’, ‘rect’, ‘roundRect’, ‘triangle’, ‘diamond’, ‘pin’, ‘arrow’, ‘none’ legend: {icon: circle }参考文章 echarts 图例修改legend中icon的形状及大小