整合Tkinter GUI界面的古诗词词云生成

news2024/11/20 15:22:35

         Python语言提供的wordcloud词云功能,使文本数据的可视化,简单而美丽。但网上的大多数词云生成功能,多半没有可交互的GUI界面,使用起来稍觉不便。笔者结合网上的中文词云功能,以唐诗三百首,宋词三百首,宋诗三百首和元曲三百首为数据源,把展示的词云整合到Python语言的Tkinter GUI界面中,可以随时在唐诗宋词元曲间切换词云的数据来源,也可选择某一个作者的作品生成词云,为古诗词的文本分析,提供了方便的可视化工具。

           如下是应用的界面,缺省显示唐诗三百首的词云:

            切换作品,选择宋词三百首,点击生成词云:

            从词云可以明显看出,唐诗和宋词的风格不一,主要的语词也不尽相同,但也有一定的相同之处,比如月,比如人,都是比较重要的词语。

         也可以切换不同的作者,查看生成的词云。唐诗三百首,选李白:

       李白喜欢月亮,经常邀月同饮;李白也自许甚高,所有我字也比较突出。

       看看杜甫:

       

       虽然也经常有月入诗,但已经没有李白那么突出了;而杜甫心忧天下,浑然忘我,词云中看不到我字。

        上面演示了功能, 下面讲一下代码如何实现的。从网上找到唐诗三百首,宋词三百首,宋诗三百首及元曲三百首的文本,然后读入到Python的list中,list中的元素为自定义PoetryWork类:

class PoetryWork(object):
    def __init__(self, num, title, author, content):
        self.num = num
        self.title = title
        self.author = author
        self.content = content
    def get_num(self):
        return self.num
    
    def get_author(self):
        return self.author
    
    def get_title(self):
        return self.title
    
    def get_content(self):
        return self.content

如下为加载唐诗三百首的代码:

#加载唐诗三百首
def load_tang_shi():
    tang_poet_list = {}
    num = ''
    title = ''
    author = ''
    content = []
    pattern = r'\d{3}'
    with open('唐诗三百首.txt', 'r', encoding= 'utf-8') as f:
        for line in f.readlines():
            if line:
                if re.match(pattern, line):
                    #内容不空
                    if content:
                        tang_poetry_list.append(PoetryWork(num, title, author, content))
                    pos = line.index(':')
                    num = line[:3]
                    author = line[3:pos]
                    if author in tang_poet_list:
                        tang_poet_list[author] += 1
                    else:
                        tang_poet_list[author] = 1
                        
                    title = line[pos+1:]
                    content = []
                    #print('num:{},author:{},title:{}'.format(num, author, title))
                else:
                    if line.strip():
                        content.append(line.strip())
                    
    tang_poetry_list.append(PoetryWork(num, title, author, content))    
    tang_poet_list = dict(sorted(tang_poet_list.items(),key=lambda x:x[1], reverse=True))
    poet_list = [x for x in tang_poet_list.keys()]  
    poet_list.insert(0,'all')
    
    return poet_list

       在加载过程中对唐诗按作者进行了统计,最后按作品数量倒序输出返回作者列表,填充界面上作者的下拉框。

       加载宋词宋诗和元曲的代码大体类似。

       通常的词云展示都是用Matplotlib的控件方法,那样的化就没法整合到Tkinter的GUI界面中了,也不方便与用户进行交互。笔者参考网上代码,采用matplotlib的FigureCanvasTkAgg canvas画布功能,把生成的云图嵌入。

         首先是声明matplotlib绘图的Figure和canvas画布对象:

curRow = 2
fig = Figure(figsize=(5, 4), dpi=100)
canvas = FigureCanvasTkAgg(fig, master=win)  # A tk.DrawingArea.
canvas.get_tk_widget().pack(side=tkinter.BOTTOM, fill=tkinter.BOTH, expand=1)

        然后在生成词云后,把词云嵌入进去:

def generateCloud(*args):
    """清除原有图表,生成新的图表"""
    global fig,canvas
    fig.clear()

    ax = fig.add_subplot(111)
    content = []
    cur_author = poetList.get()
    if workList.get() == '唐诗三百首':
        for work in tang_poetry_list:
            if cur_author == 'all' or cur_author == work.get_author():
                content.extend(work.get_content())
    elif workList.get() == '宋诗三百首':
        for work in song_poetry_list:
            if cur_author == 'all' or cur_author == work.get_author():
                content.extend(work.get_content())
    elif workList.get() == '宋词三百首':
        for work in song_poem_list:
            if cur_author == 'all' or cur_author == work.get_author():
                content.extend(work.get_content())
    elif workList.get() == '元曲三百首':
        for work in yuan_verse_list:
            if cur_author == 'all' or cur_author == work.get_author():
                content.extend(work.get_content())   
    else: #佛诗三百首
        for work in buddhist_poetry_list:
            if cur_author == 'all' or cur_author == work.get_author():
                content.extend(work.get_content())  
                
    res = jieba.lcut(" ".join(content))  # 中文分词
    text = " ".join(res)  # 用空格连接所有的词
    mask = np.array(Image.open("chinamap.png"))  # 指定词云图效果
    # 创建词云对象
    wc = WordCloud(width=800, height=600, mask=mask).generate(text)
    ax.imshow(wc) # 显示词云图
    ax.axis("off")
 
    wc.to_file("{}_{}_wordcloud.png".format(workList.get(), cur_author))  # 保存成图片
    
    canvas.draw()

重点是这两行代码:

   # 创建词云对象
    wc = WordCloud(width=800, height=600, mask=mask).generate(text)
    ax.imshow(wc) # 显示词云图

最后是canvas.draw().

要显示中文词云,还需要解决中文字体的问题。按网上的方法,可以在生成词云时,加入参数:font_path="simhei.ttf"。我这里使用的Miniconda3,加入字体路径报错,改成绝对路径还是报错。就采用了另一种方法,直接修改词云源码wordcloud.py里面的缺省字体设置:(全局搜wordcloud.py文件):

FONT_PATH = os.environ.get('FONT_PATH', os.path.join(FILE, 'DroidSansMono.ttf'))

将系统的缺省英文字体DroidSansMono.tff修改为别的中文字体即可。

我按照网上的建议先是改成simhei.ttf,乱码依旧。后来改成msyh.ttc微软雅黑字体,就好了。但是simhei.ttf这种字体在我的电脑上是正常安装了的,不知道为啥wordcloud找不着。

本文所有代码及资源文件都已上传github:GitHub - yangdanbo/PoetryCloud

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拟合算法(模型+代码)

拟合的结果是得到一个确定的曲线 最小二乘法的几何解释: argmin 存在参数k,b使括号里的值最小 第一种有绝对值,不易求导(求导在求最小值),计算较为复杂;所以我们往往使用第二种定义&#xff0…

什么软件可以录屏?这3款宝藏录屏软件,码住收藏

当我们处理剪辑视频时,我们需要使用到很多素材。有些素材我们可以直接从电脑网上进行下载。但有些素材我们在网上无法进行下载,这个时候就需要使用录屏软件进行录屏。什么软件可以录屏?今天小编向您分享3个宝藏录屏软件,赶紧码住收…

jmeter基础使用方法

文章目录一 配置环境变量二 Jmeter默认语言设置三 启动线程组的创建发送http请求数据报告一 配置环境变量 设置JMETER_HOME,及jemeter解压目录。 设置CLASSPATH,此处分别配置ApacheJMeter_core.jar和jorphan.jar所在位置。 关于环境变量配置多个值,在多个参数中间…

动态规划——状态压缩dp

文章目录概述状态压缩使用条件状压dp位运算棋盘(基于连通性)类问题概述例题蒙德里安的梦想小国王玉米田炮兵阵地集合类问题概述例题最短Hamilton路径愤怒的小鸟总结概述 状态压缩 状态压缩就是使用某种方法,简明扼要地以最小代价来表示某种…

MySQL 进阶篇2.0 存储过程 触发器 锁 InnoDB引擎

45.存储过程-介绍 46.存储过程-基本语法 -- 查看 select * from information_sc

Python中import语句用法详解

一. 什么是模块(module)? 在实际应用中,有时程序所要实现功能比较复杂,代码量也很大。若把所有的代码都存储在一个文件中,则不利于代码的复用和维护。一种更好的方式是将实现不同功能的代码分拆到多个文件…

案例丨多元业态管理服务厂商如何走通数字化转型之路

对于多元业态管理服务厂商来说,不同业态客户的使用习惯不一样,从而导致服务过程中的服务有所区别,是这类服务厂商数字化转型的核心需求。下面就以全国领先的阳光智博为例,看下他们是怎样数字化转型的。 一、企业介绍 阳光智博服务…

ASEMI整流二极管A7二极管和M7二极管能代换吗

编辑-Z A7二极管和M7二极管不仅外观封装很像,各项参数也是非常接近的,那么A7二极管和M7二极管能代换吗?我们先来看看他们的详细参数对比: A7二极管参数: 型号:A7二极管 封装:SOD-123 最大重…

Docker- 7.1、跨主机网络-macvlan

一、macvlan介绍 macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址而实现虚拟多块网卡,即多个 interface,每个 interface 可以配置自己的IP。macvlan 本质上是一种网卡虚拟化技术。macvlan 的最大优点是性…

教你这样找到Mac“其他”文件并删除它

当我们通过「关于本机」>「存储空间」查看硬盘的空间占用情况时。系统会将存储空间根据不同文件类别所占的空间大小显示在条状图上,大部分类型看文字都比较好理解,但对于“其他”这一类很多小伙伴都感觉很困惑,会产生一些问题如&#xff1…

如何在PPT中嵌入交互式图表?LightningChart助力炫酷展示

我们在PPT演示文稿中嵌入图表很容易,但嵌入交互式图表似乎就没听说过了,接下来我们就一起来看看通过交互式图表在PPT中展示病人心跳的效果: PPT中展示病人心跳下方是一个实时地图在PPT中的展现实例 LightningChart2以上在PPT中展示实时交互的…

Nacos服务注册发现、配置管理

Nacos服务注册发现 引入依赖 <dependencyManagement><dependencies><!-- nacos管理依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>…

T-SQL程序练习03

目录 一、利用 &#x1d446;&#x1d452;&#x1d44e;&#x1d460;&#x1d45c;&#x1d45b; 表&#xff0c;参照结果&#xff0c;写一个存储过程&#x1d446;&#x1d452;&#x1d44e;&#x1d460;&#x1d45c;&#x1d45b;&#x1d43f;&#x1d44e;&#x1d4…

【机器学习】ID3_C4.5_CART算法总结与对比

问题 ID3、C4.5、CART算法总结与对比 前言 ID3、C4.5、CART算法是三种不同的决策树算法&#xff0c;区别主要在最优划分属性的选择上&#xff0c;下面把之前在随机森林中汇总过的复制过来&#xff0c;然后再总结下三者的不同。 三种算法所用的最优属性选择方法详述 信息增…

知识图谱系统课程笔记(二)——知识抽取与挖掘

知识图谱系统课程笔记&#xff08;二&#xff09;——知识抽取与挖掘 文章目录知识图谱系统课程笔记&#xff08;二&#xff09;——知识抽取与挖掘OWL、RDF与RDFS关系知识抽取任务定义和相关比赛知识抽取技术知识获取关键技术与难点知识抽取的子任务实体抽取命名实体识别非结构…

【微服务架构实战】第2篇之Spring Cloud Gateway介绍

我们的项目采用 Spring Cloud Gateway gateway 的版本为&#xff1a;2.2.8.RELEASE 简介&#xff1a; Spring Cloud Gateway&#xff08;2.2.8.RELEASE&#xff09; 是 Spring 公司基于 Spring 5.0&#xff0c; Spring Boot 2.0 和 Project Reactor 等技术开发的网关&#xf…

Linux系统运行时参数命令--网络IO性能监控

目录 5 网络IO性能监控 5.1 性能指标 5.2 网络信息 5.2.1 套接字信息 5.2.2 协议栈统计信息-netstat命令 5.2.3 网络吞吐-sar命令 5.2.4 连通性和延时 5.3 其他常用的网络相关命令 telnet nc mtr连通性测试 nslookup traceroute iptraf强大的网络监控 tcpdump- …

(二十五)Vue之mixin混入/合

文章目录mixin局部混入全局混入Vue学习目录 上一篇&#xff1a;&#xff08;二十四&#xff09;Vue之props配置项 下一篇&#xff1a;&#xff08;二十六&#xff09;Vue之插件 mixin 在有些业务逻辑中&#xff0c;发现在多个组件的功能业务逻辑一样&#xff0c;可以把多个…

秋招荆棘之路

找工作期间&#xff0c;在牛客网上面看到很多前辈的面经和经验总结&#xff0c;给我面试带来了很多的帮助&#xff0c;本着互助原则&#xff0c;我也总结下自己秋招的经验&#xff0c;算是一种反馈了&#xff0c;给即将毕业的学弟学妹问一些经验。 1.1 背景 首先介绍下我的背景…

Project 2: CS61BYoG

Project 2主要分为两个部分&#xff1a;phase 1&#xff08;World Generation&#xff09;和 phase 2&#xff08;Interactivity&#xff09;。 最难的个人认为是phase 1中的生成随机地图的算法。这里也主要总结以下phase1。 自己一开始在这个位置卡了一天&#xff0c;一开始做…