新星计划|python自制一款词云生成器,一键解锁你要的所有姿势

前言
在很多的大型峰会的PPT上,我们都能看到词云的身影。到底它为啥这么受欢迎呢?
从功能上说,它的可视化效果好,可以过滤无用的文本、渲染频率高的关键字,通过字体大小对比就能区分词频。在我们分析调性的时候,例如标题、内容、留言,“词云”能起到很好的辅助作用。
其次从颜值上说,一张漂亮的词云图,能让你的PPT增色不少,也让看的人一目了然。
之前网上也有很多案例,几行代码进行简单的参数修改就可以画出一张简单的词云图来。不过很多都没有停用词和自定义关键词等等概念,做出来的效果也差强人意。今天我们就把词云的功能集合封装起来,做成一个小工具分享给大家吧。
首先我们先来看看制作的效果:
新星计划|python自制一款词云生成器,一键解锁你要的所有姿势
文章图片

下面,我们介绍开始这个小工具的制作过程。
1. 核心功能设计
简单来说,我们希望这个词云生成器在绘制词云图的时候可以自定义删除不想要的词、显示一些特殊汉字组合词(自定义关键词),同时词云的形状和字体能自定义等等。
拆解需求,大致梳理出核心功能如下:

  • 确定待绘制词云的文本,三种情况(必填,否则会提示需要先选择待绘制文本)
    • 通过选定文本文件(txt文件)
    • 通过手动输入或复制粘贴文本
    • 以上两种方式均采取的时候会自动合并文本内容
  • 确定停用词(停用词就是词云图中不会出现的词,选填)
    • 通过选定文本文件(txt文件,每行一个停用词)
    • 通过手动输入停用词(词之间用“/”分开)
    • 以上两种方式均采取的时候会自动合停用词
  • 确定自定义关键词(关键词就是希望出现在词云图中的词,由于本工具采用jieba库,某些汉字组合词不一定是常规的词组,需要手动添加)
    • 通过手动输入停用词(词之间用“/”分开)
  • 可选择词云字体
    • 我电脑是windows环境,主要用于中文字符的词云绘制,所以小工具里只选择了常见的5种字体供选择
  • 可选择背景图
    • 词云绘制时候形状背景图这里设定的是选定背景图文件即可
    • 对图片要求是白色底+深色形状轮廓
  • 词云绘制
    • 点击按钮执行绘制程序
基本功能点确定后,我们开始进行GUI设计。
2. GUI设计与实现
基于功能点,我们可以先在草稿本上进行简单的UE布局设计,然后再通过GUI开发库进行设计,这里依旧采用的是pysimplegui,主要是简单方便。
基于UI设计,我们编码如下:
# 布局设置 layout = [[sg.Text('选择待绘制文件:',font=("微软雅黑", 12)),sg.InputText('可以不选', key='file',size=(60,1),font=("微软雅黑", 10),enable_events=True) ,sg.FileBrowse('打开',file_types=(("Text Files", "*.txt"),),size=(10,1),font=("微软雅黑", 11))], [sg.Text('选择停用词文件:',font=("微软雅黑", 12)),sg.InputText('也可以不选',key='stop_file',size=(60,1),font=("微软雅黑", 10),enable_events=True) ,sg.FileBrowse('打开',file_types=(("Text Files", "*.txt"),),size=(10,1),font=("微软雅黑", 11))], [sg.Text('输入待绘制的文本(可以直接复制文本到本地,不需求选择文本文件):',justification='center')], [sg.Multiline(size=(92, 8),font=("微软雅黑", 10),key='text')], [sg.Text('自\n定\n义\n词',font=("微软雅黑", 12)),sg.Multiline(tooltip='词与词之间用“/”分开',size=(40, 5),font=("微软雅黑", 10),key='add_words'), sg.Text('停\n用\n词',font=("微软雅黑", 12)),sg.Multiline(tooltip='词与词之间用“/”分开',size=(40, 5),font=("微软雅黑", 10),key='add_stopwords')], [sg.Text('词云字体:',font=("微软雅黑", 12)),sg.Combo(['微软雅黑','宋体','仿宋','隶书','Times New Roman'],font=("微软雅黑", 10), default_value='https://www.it610.com/article/微软雅黑',size=(15, 5),key='fonts'), sg.Text('背景图:',font=("微软雅黑", 12)),sg.InputText('也可以不选,选则只能选取.png图片',key='bg_file',size=(40,1),font=("微软雅黑", 10)) ,sg.FileBrowse('打开',file_types=(("Text Files", "*.png"),),size=(10,1),font=("微软雅黑", 11))], [sg.Text('程序操作记录:',justification='center')], [sg.Output(size=(92, 8),font=("微软雅黑", 10))], [sg.Text('操作说明:',font=("微软雅黑", 12))], [sg.Text('①如果是从文本文件进行绘制,则需要先选择待绘制文件\n②如果是一段文本需要进行绘制,将文本复制到待绘制文本框',font=("微软雅黑", 10)), sg.Text('',font=("微软雅黑", 12),size=(10, 1)), sg.Button('开始绘制',font=("微软雅黑", 12),button_color ='Orange'), sg.Button('关闭程序',font=("微软雅黑", 12),button_color ='red')], ]

其包含的控件如下:
  • Text 文本
  • InputText 输入文本框
  • FileBrowse 文件浏览
  • Multiline 多行文本框
  • Combo 下拉框
  • Output 程序输出显示框
  • Button 按钮
除了主界面之外,我们在绘制完词云图之后希望能直接弹窗展示,因此也需要一个用于浏览图片的界面与功能,这部分整体放在后续功能实现模块讲解。
3. 功能实现
我们明确功能点以及有了GUI布局后,就开始实现功能逻辑。
3.1 词云绘制功能 关于词云绘制我们调用的也是stylecloud库,编写一个词云绘制的函数,按照核心功能需求,这个函数接收的参数分别是:
  • 待绘制词云的文本内容data
  • 自定义关键词addWords
  • 停用词stopWords
  • 背景图bg
  • 字体font_path
代码如下:
def ciYun(data,addWords,stopWords,bg,font_path):print('正在作图...') comment_data = https://www.it610.com/article/datafor addWord in addWords: jieba.add_word(addWord)comment_after_split = jieba.cut(str(comment_data), cut_all=False) words =' '.join(comment_after_split)# 词云停用词 stopwords = STOPWORDS.copy() for stopWord in stopWords: stopwords.add(stopWord)# 就下面代码,即可获取满足类型要求的参数 stylecloud.gen_stylecloud( text=words, size = 700, palette='tableau.BlueRed_6', # 设置配色方案 icon_name='fas fa-cloud',# thumbs-up custom_stopwords = stopwords, bg = bg, font_path=font_path,# 词云图 字体(中文需要设定为本机有的中文字体) )print('词云已生成~') pic_path = os.getcwd() print(f'词云图文件已保存在 {pic_path}')

接下来我们要继续编写GUI的交互逻辑。
3.2 GUI交互逻辑 我们在前面有提到,对于绘制好的词云图,希望可以弹出自动预览,这里实现这个功能,采用的是pysimplegui的Image控件,传递参数是图片的地址pic_path
# 词云图预览 def image_view(pic_path): layout = [[sg.Image(pic_path, key="image",background_color='white',size=(700, 700))] ] window = sg.Window("词云图预览--Dragon少年 ",layout) while True: event, values = window.read() if event in (None,'关闭'): break window.close()

然后我们再对主界面的交互逻辑进行实现:
# 创建窗口 window = sg.Window('词云制作工具--Dragon少年', layout,font=("微软雅黑", 12),default_element_size=(50,1))# 事件循环 while True: event, values = window.read() if event in (None, '关闭程序'): breakif event == '开始绘制': fileName = values['file']# 待绘制词云文本文件 stop_fileName = values['stop_file']# 停用词文本文件 text = values['text']# 待绘制词云文本(自己复制粘贴的内容) add_words = values['add_words']# 自定义关键词 add_stopwords = values['add_stopwords']# 补充的停用词 bg_fileName = values['bg_file']# 词云背景图文件 fonts = values['fonts']# 词云字体 font_path = fonts_dict[fonts] # 判断文本文件存在与否 if os.path.exists(fileName): with open(fileName, "r", encoding='utf-8') as f:#打开文件 data = https://www.it610.com/article/f.read()#读取文件 else: data ='' # 判断文本文件存在与否(其实可以不用pandas,打包还会更小) if os.path.exists(stop_fileName): stoptxt = pd.read_table(stop_fileName,encoding='utf-8',header=None) stoptxt.drop_duplicates(inplace=True) stopWords = stoptxt[0].to_list() else: stopWords = [] # 判断背景图存在与否 if os.path.exists(bg_fileName): bg=np.array(Image.open(bg_fileName)) else: bg = ''# 组合待绘制文本、停用词和自定义关键词 data = https://www.it610.com/article/data + text stopwords = add_stopwords.rstrip().split('/') stopWords.extend(stopwords) addWords = add_words.rstrip().split('/')if len(data)>1: ciYun(data,addWords,stopWords,bg,font_path) pic_path = os.getcwd()+"\stylecloud.png" image_view(pic_path) else: print('待绘制词云文本未选择')window.close()

【新星计划|python自制一款词云生成器,一键解锁你要的所有姿势】由于在选择字体的时候,我们提供的是名称下拉框,所以这里需要创建一个字体名称与文件名的字典表,根据我们选定的字体组,这里创建的字典如下:
# 字体字典 fonts_dict ={'仿宋':'simfang.ttf', '微软雅黑':'msyh.ttc', '宋体':'simsun.ttc', '隶书':'SIMLI.TTF', 'Times New Roman':'times.ttf', }

至此,自制的词云生成器小工具就编码完成啦。
新星计划|python自制一款词云生成器,一键解锁你要的所有姿势
文章图片

下面,我用从B站上爬取的觉醒年代解析视频弹幕绘制词云图:
新星计划|python自制一款词云生成器,一键解锁你要的所有姿势
文章图片

好了,今天就到这里,明天我们继续努力!
新星计划|python自制一款词云生成器,一键解锁你要的所有姿势
文章图片

若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
Dragon少年 | 文
如果本篇博客有任何错误,请批评指教,不胜感激 !

    推荐阅读