python通過設(shè)置WordCloud參數(shù)實現(xiàn)定制詞云
添加整型參數(shù)
我們所有的設(shè)置都放在了wcDct中,所以若想用更多的參數(shù)來定制詞云,那么只需在wcDct中添加內(nèi)容,例如下面這些整型參數(shù)
其次,WordCloud中有很多參數(shù)的數(shù)據(jù)類型都是整型,這些適用于Spinbox
參數(shù) | 說明 | 合適的范圍 | 步長 |
---|---|---|---|
width | 詞云寬度 | 100-2000 | 10 |
height | 詞云高度 | 100-2000 | 10 |
min_font_size | 最小文字尺寸 | 1-50 | 1 |
max_font_size | 最大文字尺寸 | 10-1000 | 10 |
font_step | 字體步長 | 1-20 | 1 |
max_words | 最大單詞數(shù) | 10-500 | 10 |
min_word_length | 最短單詞長度 | 0-10 | 1 |
scale | 圖像縮放 | 默認是1 |
下面就是要向wcDct中添加的內(nèi)容。
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"}, "最多詞數(shù)" : { "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"}, }
布爾型參數(shù)
然后是一些布爾類型的參數(shù),適合用Checkbutton
參數(shù) | 說明 | 類型 | 適用組件 |
---|---|---|---|
repeat | 是否重復(fù)單詞 | 默認False | Checkbutton |
include_numbers | 是否包含數(shù)字 | 默認False | |
normalize_plurals | 是否去掉詞尾的s | 默認True |
wcDct = { "單詞重復(fù)" : { "ctrl": ttk.Checkbutton, "paras" : {"width":10}, "default": False, "call" : "repeat"}, "包含數(shù)字" : { "ctrl": ttk.Checkbutton, "paras" : {"width":10}, "default": False, "call" : "include_numbers"}, "去詞尾s" : { "ctrl": ttk.Checkbutton, "paras" : {"width":10}, "default": False, "call" : "normalize_plurals"}, }
背景顏色
最后,還有一個背景顏色對話框
參數(shù) | 說明 | 對話框類型 | 說明 |
---|---|---|---|
background_color | 背景色 | 顏色對話框 | 默認"black" |
wcDct = { "背景顏色" : { "ctrl": DialogButton, "paras" : {"height":5, "widthL":22, "widthR":8, "logtype":"顏色"}, "call" : "background_color", "default" : "balck"}, }
更改之后的界面如下
詞云生成邏輯
有了這些之后,還要修改詞云生成邏輯,即調(diào)用這些參數(shù)所獲得的值,最后根據(jù)上圖中的參數(shù),得到點云如下
源代碼
所有源代碼如下
import tkinter as tk import tkinter.ttk as ttk from tkinter.filedialog import (askopenfilename, askopenfilenames, askdirectory, asksaveasfilename) from tkinter.colorchooser import askcolor from threading import Thread import numpy as np import re import csv import jieba from wordcloud import WordCloud import os class DialogButton(ttk.Frame): def __init__(self, master, height, widthL, widthR, logtype, label=None, text=None, frmDct={}, btnDct={}, enyDct={}, logDct={}): w = widthL + widthR super().__init__(master, height=height, width = w, **frmDct) self.pack(fill=tk.X) self.text = tk.StringVar() if not text else text ttk.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 = logtype self.logDct = logDct def setLabel(self, key, label=None): if label: return label labelDct = { "文件" : "選擇文件", "文件夾" : "選擇路徑", "多文件" : "選擇多個文件", "保存" : "存儲路徑", "顏色" : "選擇顏色", } 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"}, "最多詞數(shù)" : { "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"}, "單詞重復(fù)" : { "ctrl": ttk.Checkbutton, "paras" : {"width":10}, "default": False, "call" : "repeat"}, "包含數(shù)字" : { "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 = None self.initWidgets() def initWidgets(self): frm = ttk.Frame(self) frm.pack(side=tk.LEFT, fill=tk.Y) self.initPara(frm) frm = ttk.LabelFrame(self, text="分詞結(jié)果") 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] # 組件參數(shù) n = v["call"] # 調(diào)用名 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] # 組件參數(shù) n = v["call"] # 調(diào)用名 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 key self.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 key self.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 = ["詞云寬度", "詞云高度", "最小文字", "最大文字", "字體步長", "圖像縮放", "最短詞長", "最多詞數(shù)"] 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 = ["單詞重復(fù)", "包含數(shù)字", "去詞尾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="分詞預(yù)覽", 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()
以上就是python通過設(shè)置WordCloud參數(shù)實現(xiàn)定制詞云的詳細內(nèi)容,更多關(guān)于python詞云的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Django 解決model 反向引用中的related_name問題
這篇文章主要介紹了Django 解決model 反向引用中的related_name問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05windows系統(tǒng)IIS部署Django項目的實踐
采用IIS服務(wù)器部署相比django提供的開發(fā)者服務(wù)器具有更好的并發(fā)訪問能力,性能更加穩(wěn)定,本文主要介紹了windows系統(tǒng)IIS部署Django項目的實踐,具有一定的參考價值,感興趣的可以了解一下2022-03-03使用TensorFlow創(chuàng)建生成式對抗網(wǎng)絡(luò)GAN案例
這篇文章主要為大家介紹了使用TensorFlow創(chuàng)建生成式對抗網(wǎng)絡(luò)GAN案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03pandas dataframe rolling移動計算方式
在Pandas中,rolling()方法用于執(zhí)行移動窗口計算,常用于時間序列數(shù)據(jù)分析,例如,計算某商品的7天或1個月銷售總量,可以通過rolling()輕松實現(xiàn),該方法的關(guān)鍵參數(shù)包括window(窗口大?。?min_periods(最小計算周期)2024-09-09