Python词云生成工具3:定制更多参数

文章目录

    • 添加整型参数
    • 布尔型参数
    • 背景颜色
    • 词云生成逻辑
    • 源代码

  • Python打造一个词云软件
  • 显示分词结果

添加整型参数

我们所有的设置都放在了wcDct中,所以若想用更多的参数来定制词云,那么只需在wcDct中添加内容,例如下面这些整型参数

其次,WordCloud中有很多参数的数据类型都是整型,这些适用于Spinbox

参数说明合适的范围步长
width词云宽度100-200010
height词云高度100-200010
min_font_size最小文字尺寸1-501
max_font_size最大文字尺寸10-100010
font_step字体步长1-201
max_words最大单词数10-50010
min_word_length最短单词长度0-101
scale图像缩放默认是1

下面就是要向wcDct中添加的内容。

wcDct = {"最小文字" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":1, "to":50, "increment":1},"default":4,"call" : "min_font_size"},"最大文字" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":10, "to":1e3, "increment":10},"default":400,"call" : "max_font_size"},"字体步长" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":1, "to":20, "increment":1},"default":10,"call" : "font_step"},"最短词长" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":0, "to":10, "increment":1},"default":1,"call" : "min_word_length"},"最多词数" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":10, "to":500, "increment":10},"default":200,"call" : "max_words"},"图像缩放" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":0.5, "to":5, "increment":0.1},"default":1,"call" : "scale"},
}

布尔型参数

然后是一些布尔类型的参数,适合用Checkbutton

参数说明类型适用组件
repeat是否重复单词默认FalseCheckbutton
include_numbers是否包含数字默认False
normalize_plurals是否去掉词尾的s默认True
wcDct = {"单词重复" : {"ctrl": ttk.Checkbutton, "paras" : {"width":10},"default": False,"call" : "repeat"},"包含数字" : {"ctrl": ttk.Checkbutton, "paras" : {"width":10},"default": False,"call" : "include_numbers"},"去词尾s" : {"ctrl": ttk.Checkbutton, "paras" : {"width":10},"default": False,"call" : "normalize_plurals"},
}

背景颜色

最后,还有一个背景颜色对话框

参数说明对话框类型说明
background_color背景色颜色对话框默认"black"
wcDct = {"背景颜色" : {"ctrl": DialogButton,"paras" : {"height":5, "widthL":22, "widthR":8, "logtype":"颜色"},"call" : "background_color","default" : "balck"},
}

更改之后的界面如下

在这里插入图片描述

词云生成逻辑

有了这些之后,还要修改词云生成逻辑,即调用这些参数所获得的值,最后根据上图中的参数,得到点云如下

在这里插入图片描述

源代码

所有源代码如下

import tkinter as tk 
import tkinter.ttk as ttk
from tkinter.filedialog import (askopenfilename,askopenfilenames, askdirectory, asksaveasfilename)
from tkinter.colorchooser import askcolorfrom threading import Threadimport numpy as np
import re
import csv
import jieba
from wordcloud import WordCloudimport osclass DialogButton(ttk.Frame):def __init__(self, master, height, widthL, widthR, logtype, label=None, text=None, frmDct={}, btnDct={}, enyDct={}, logDct={}):w = widthL + widthRsuper().__init__(master, height=height, width = w, **frmDct)self.pack(fill=tk.X)self.text = tk.StringVar() if not text else textttk.Entry(self, width=widthL, textvariable=self.text, **enyDct).pack(side=tk.LEFT, fill = tk.X, padx=5)ttk.Button(self, width=widthR, text=self.setLabel(logtype, label),command = self.Click, **btnDct).pack(side=tk.RIGHT)self.logtype = logtypeself.logDct = logDctdef setLabel(self, key, label=None):if label:return labellabelDct = {"文件"   : "选择文件","文件夹" : "选择路径","多文件" : "选择多个文件","保存" : "存储路径","颜色"   : "选择颜色",}return labelDct[key]def Click(self):typeDct = {"文件"  : askopenfilename,"文件夹": askdirectory,"多文件": askopenfilenames,"保存"  : asksaveasfilename,"颜色"  : askcolor,}text = typeDct[self.logtype](**self.logDct)if self.logtype == "颜色":text = text[1]self.text.set(text)def get(self):return self.text.get()def set(self, txt):self.text.set(txt)wcDct = {"词云宽度" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":100, "to":2000, "increment":10},"default":800,"call" : "width"},"词云高度" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":100, "to":2000, "increment":10},"default":450,"call" : "height"},"图像缩放" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":0.5, "to":10, "increment":0.1},"default":1,"call" : "scale"},"最小文字" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":1, "to":50, "increment":1},"default":4,"call" : "min_font_size"},"最大文字" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":10, "to":1e3, "increment":10},"default":400,"call" : "max_font_size"},"字体步长" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":1, "to":20, "increment":1},"default":10,"call" : "font_step"},"最短词长" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":0, "to":10, "increment":1},"default":1,"call" : "min_word_length"},"最多词数" : {"ctrl": ttk.Spinbox, "paras" : {"width":10, "from_":10, "to":500, "increment":10},"default":200,"call" : "max_words"},"字体路径" : {"ctrl": DialogButton,"paras" : {"height":5, "widthL":22, "widthR":8, "logtype":"文件"},"call" : "font_path","default" : r"C:\Windows\Fonts\simhei.ttf"},"输入路径" : {"ctrl": DialogButton, "paras" : {"width":25},"paras" : {"height":5, "widthL":22, "widthR":8, "logtype":"文件"},},"输出路径" : {"ctrl": DialogButton, "paras" : {"width":25},"paras" : {"height":5, "widthL":22, "widthR":8, "logtype":"保存"},},"背景颜色" : {"ctrl": DialogButton,"paras" : {"height":5, "widthL":22, "widthR":8, "logtype":"颜色"},"call" : "background_color","default" : "balck"},"单词重复" : {"ctrl": ttk.Checkbutton, "paras" : {"width":10},"default": False,"call" : "repeat"},"包含数字" : {"ctrl": ttk.Checkbutton, "paras" : {"width":10},"default": False,"call" : "include_numbers"},"去词尾s" : {"ctrl": ttk.Checkbutton, "paras" : {"width":10},"default": False,"call" : "normalize_plurals"},
}class DrawWords(ttk.Frame):def __init__(self, master, **options):super().__init__(master, **options)self.pack()self.words = Noneself.initWidgets()def initWidgets(self):frm = ttk.Frame(self)frm.pack(side=tk.LEFT, fill=tk.Y)self.initPara(frm)frm = ttk.LabelFrame(self, text="分词结果")frm.pack(fill=tk.BOTH, expand=True)self.txtSplit = tk.Text(frm)self.txtSplit.pack(side=tk.LEFT, fill=tk.BOTH, padx=5, pady=5, expand=True)self.addScroll(frm, self.txtSplit)def addScroll(self, frm, txt):scroll = ttk.Scrollbar(frm)scroll.pack(side=tk.RIGHT,fill=tk.Y)txt.config(yscrollcommand=scroll.set)scroll.config(command=txt.yview)def setOneCheck(self, frm, key):v = wcDct[key]      # 组件参数n = v["call"]       # 调用名self.vars[n] = tk.BooleanVar()self.vars[n].set(v["default"])self.checks[n] = v["ctrl"](frm, text=key,variable=self.vars[n], **v["paras"])self.checks[n].pack(side=tk.LEFT)def setOneSpinBox(self, frm, key):ttk.Label(frm, width=8, text=key).pack(side=tk.LEFT)v = wcDct[key]      # 组件参数n = v["call"]       # 调用名self.spins[n] = v["ctrl"](frm, **v["paras"])self.spins[n].set(v["default"])self.spins[n].pack(side=tk.LEFT)def setOneDiaButton(self, frmPara, key):frm = ttk.Frame(frmPara)frm.pack(side=tk.TOP, fill=tk.X)ttk.Label(frm, width=8, text=key).pack(side=tk.LEFT)v = wcDct[key]n = v["call"] if 'call' in v else keyself.paths[n] = v["ctrl"](frm, **v['paras'])self.paths[n].pack(side=tk.LEFT)if 'default' in v:self.paths[n].set(v['default'])def setOneColButton(self, frm, key):frm = ttk.Frame(frmPara)frm.pack(side=tk.TOP, fill=tk.X)ttk.Label(frm, width=8, text=key).pack(side=tk.LEFT)v = wcDct[key]n = v["call"] if 'call' in v else keyself.paths[n] = v["ctrl"](frm, **v['paras'])self.paths[n].pack(side=tk.LEFT)if 'default' in v:self.paths[n].set(v['default'])def initPara(self, frmPara):self.spins = {}self.checks = {}self.vars = {}keys = ["词云宽度", "词云高度", "最小文字", "最大文字", "字体步长", "图像缩放", "最短词长", "最多词数"]for i,key in enumerate(keys):if i%2==0:frm = ttk.Frame(frmPara)frm.pack(side=tk.TOP, fill=tk.X, pady=2)self.setOneSpinBox(frm, key)keys = ["单词重复", "包含数字", "去词尾s"]for i,key in enumerate(keys):if i%4==0:frm = ttk.Frame(frmPara)frm.pack(side=tk.TOP, fill=tk.X, pady=2)self.setOneCheck(frm, key)self.paths = {}for key in ["背景颜色", "输入路径", "输出路径", "字体路径"]:self.setOneDiaButton(frmPara, key)frm = ttk.Frame(frmPara)frm.pack(side=tk.TOP, fill=tk.X)ttk.Button(frm, text="分词预览", command=self.splitWords).pack(side=tk.LEFT)ttk.Button(frm, text="分词保存", command=self.saveWords).pack(side=tk.LEFT)ttk.Button(frm, text="输出词云", command=self.genWordCloud).pack(side=tk.LEFT)def splitWords(self):p = self.paths["输入路径"].get()with open(p, encoding='utf8') as f:text = f.read()words = jieba.lcut(text)self.words = [w for w in words if len(w)>1] # 取出长度大于1的词self.setSplit("\n".join(self.words))def saveWords(self):path = asksaveasfilename()with open(path) as f:f.write(self.txtSplit.get(1.0, 'end'))def genWordCloud(self):dct = {}keys = ['width', 'height', 'font_path', 'scale','min_font_size', 'max_font_size', 'font_step', 'max_words', 'min_word_length', 'background_color','repeat', 'include_numbers', 'normalize_plurals']for key in keys:if key in self.spins:dct[key] = int(self.spins[key].get())if key in self.paths:dct[key] = self.paths[key].get()if key in self.checks:dct[key] = self.vars[key].get()=='1'  print(dct)try:cloud = WordCloud(**dct)except Exception as e:print(e)txt = self.txtSplit.get(1.0, "end")txt = " ".join(txt.split("\n"))cloud.generate(txt)p = self.paths["输出路径"].get()if not (p.endswith('.png') or p.endswith('.svg')):p = p+".png"cloud.to_file(p)def setSplit(self, txt):self.txtSplit.delete(1.0, "end")self.txtSplit.insert("end", txt)self.txtSplit.see("end")if __name__ == "__main__":root = tk.Tk()DrawWords(root).pack(side=tk.TOP, fill=tk.BOTH)root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/159583.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小米手机刷EU版ROM教程

第一件事 拿到手机第一件事是登录账号,然后开启开发者模式,设置中搜索:手机解锁状态 绑定解锁账号,等168小时候才能解锁 提前下载软件包 官方解锁工具 官方Fastboot工具 recovery包:twrp ROM包 其他: EU rom论坛页…

最新 IntelliJ IDEA 旗舰版和社区版下载安装教程(图解)

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

玻色量子“天工量子大脑”亮相中关村论坛,大放异彩

2023年5月25日至30日,2023中关村论坛(科博会)在北京盛大召开。中关村论坛(科博会)是面向全球科技创新交流合作的国家级平台行业盛会,由科技部、国家发展改革委、工业和信息化部、国务院国资委、中国科学院、…

3D模型格式转换工具HOOPS Exchange:如何将3D PDF转换为STEP格式?

3D CAD数据在制造、工程和设计等各个领域都扮演着重要的角色。为了促进不同软件应用程序之间的协作和互操作性,它通常以不同的格式进行交换。 HOOPS Exchange是一个强大的软件开发工具包,提供了处理和将3D CAD数据从一种格式转换为另一种格式的解决方案…

pinia简单使用

新命令-创建vue3项目 vue create 方式使用脚手架创建项目,vue cli处理, vue3后新的脚手架工具create-vue 使用npm init vuelatest 命令创建即可。 在pinia中,将使用的组合式函数识别为状态管理内容 自动将ref 识别为stste,computed 相当于 ge…

概念解析 | 神经网络中的位置编码(Positional Encoding)

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Positional Encoding 神经网络中的位置编码(Positional Encoding) A Gentle Introduction to Positional Encoding in Transformer Models, Part 1 1.背景介绍 在自然语言处理任…

在Qt中解决opencv的putText函数无法绘制中文的一种解决方法

文章目录 1.问题2.查阅资料3.解决办法 1.问题 在opencv中,假如直接使用putText绘制中文,会在图像上出现问号,如下图所示: 2.查阅资料 查了一些资料,说想要解决这个问题,需要用到freetype库或者用opencv…

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析

【2023年MathorCup高校数学建模挑战赛-大数据竞赛】赛道A:基于计算机视觉的坑洼道路检测和识别 python 代码解析 1 题目 坑洼道路检测和识别是一种计算机视觉任务,旨在通过数字图像(通常是地表坑洼图像)识别出存在坑洼的道路。这…

代码随想录算法训练营第四十三天丨 动态规划part06

518.零钱兑换II 思路 这是一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。 对完全背包还不了解的同学,可以看这篇:动态规划:关于完全背包,你该了解这些!(opens new window)…

C/C++与圆相关的计算 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C与圆相关的计算 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C与圆相关的计算 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 给出圆的半径,求圆的直径、周长…

Linux常用命令——chattr命令

在线Linux命令查询工具 chattr 用来改变文件属性 补充说明 chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式: 语法 chattr(选项)选项 a:让文件或目录仅供附加用途&#xff…

JAVA提取嵌套夹带文件之Apache Tika

目录结构 前言tika简介Tika支持的文件格式MAVEN依赖JAVA程序JAVA测试程序测试文件测试结果部分文件提取失败参考连接 前言 Apache Tika提取文件整理如下,如有特定的文件需要提取可以先参照【部分文件提取失败】章节对照,以免浪费您的宝贵时间&#xff0c…