欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python通過設(shè)置WordCloud參數(shù)實現(xiàn)定制詞云

 更新時間:2023年11月05日 09:53:23   作者:微小冷  
這篇文章主要為大家詳細介紹了python如何通過設(shè)置WordCloud參數(shù)實現(xiàn)定制詞云,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

添加整型參數(shù)

我們所有的設(shè)置都放在了wcDct中,所以若想用更多的參數(shù)來定制詞云,那么只需在wcDct中添加內(nèi)容,例如下面這些整型參數(shù)

其次,WordCloud中有很多參數(shù)的數(shù)據(jù)類型都是整型,這些適用于Spinbox

參數(shù)說明合適的范圍步長
width詞云寬度100-200010
height詞云高度100-200010
min_font_size最小文字尺寸1-501
max_font_size最大文字尺寸10-100010
font_step字體步長1-201
max_words最大單詞數(shù)10-50010
min_word_length最短單詞長度0-101
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ù)單詞默認FalseCheckbutton
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)文章

  • 如何實現(xiàn)Python編寫的圖形界面可以自由拖動

    如何實現(xiàn)Python編寫的圖形界面可以自由拖動

    我們使用python中的tkinter進行編程時,往往需要一種功能就是我們可以隨意拖動這個界面,放置在任何位置,下面我們就來看看Python如何實現(xiàn)這一效果吧
    2024-11-11
  • Django 解決model 反向引用中的related_name問題

    Django 解決model 反向引用中的related_name問題

    這篇文章主要介紹了Django 解決model 反向引用中的related_name問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • Python中給字典排序的四種方法

    Python中給字典排序的四種方法

    我們經(jīng)常在計算機等級考試中遇到詞頻排序的問題,我們一般先通過生成字典的方法,統(tǒng)計詞的頻次,然后給字典排序,那么如何快速地給字典按照鍵值進行排序呢,本文主要介紹了Python中給字典排序的四種方法,感興趣的可以了解一下
    2023-08-08
  • python買賣股票的最佳時機(基于貪心/蠻力算法)

    python買賣股票的最佳時機(基于貪心/蠻力算法)

    這篇文章主要介紹了python買賣股票的最佳時機(基于貪心/蠻力算法),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • windows系統(tǒng)IIS部署Django項目的實踐

    windows系統(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案例

    這篇文章主要為大家介紹了使用TensorFlow創(chuàng)建生成式對抗網(wǎng)絡(luò)GAN案例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • python實現(xiàn)Nao機器人的單目測距

    python實現(xiàn)Nao機器人的單目測距

    這篇文章主要為大家詳細介紹了python實現(xiàn)Nao機器人的單目測距,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python %r和%s區(qū)別代碼實例解析

    Python %r和%s區(qū)別代碼實例解析

    這篇文章主要介紹了Python %r和%s區(qū)別代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • pandas dataframe rolling移動計算方式

    pandas dataframe rolling移動計算方式

    在Pandas中,rolling()方法用于執(zhí)行移動窗口計算,常用于時間序列數(shù)據(jù)分析,例如,計算某商品的7天或1個月銷售總量,可以通過rolling()輕松實現(xiàn),該方法的關(guān)鍵參數(shù)包括window(窗口大?。?min_periods(最小計算周期)
    2024-09-09
  • 常用python爬蟲庫介紹與簡要說明

    常用python爬蟲庫介紹與簡要說明

    本文介紹了一些常用的python爬蟲庫其中包括python網(wǎng)絡(luò)庫,python網(wǎng)絡(luò)爬蟲框架,python HTML解析,python文本處理,python 自然語言處理,python 瀏覽器模擬等各種常用的python庫
    2020-01-01

最新評論