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

整合Tkinter GUI界面的古诗词词云生成相关推荐

  1. 基于python和线上网站wordart的词云生成

    词云生成 前言 一.词云是什么? 二.使用步骤 1.使用jieba提取关键词 2.进入网站 3.导入关键词 4.导入字体 5.生成词云 6.词云调整 总结 前言 随着人工智能的不断发展,python这 ...

  2. 词云生成库WordCloud详解(一):概述、ImageColorGenerator类

    当前wordcloud版本:1.81 项目地址:https://github.com/amueller/word_cloud API.案例地址:https://amueller.github.io/w ...

  3. python词云生成的图片为空白图片

    原因: 因为plt.show()写在保存图片语句之前 解决方案: 1.注释掉plt.show()语句 2.将plt.show()语句放到保存图片语句之后 如图所示: 附录完整的词云生成代码 impor ...

  4. java词云生成,kumo项目详解

    0. 前言 需要在后端生成一个词云图给小程序. 使用kumo项目实现. 1. demo 首先新建maven项目,prom.xml中加入以下依赖.加完之后记得reload. 要确保自己电脑或者服务器安装 ...

  5. java词云生成Kumo

    1,先前在网上寻找Java词云生成包kumo 在gitthub上导入 1)核心包 <dependency><groupId>com.kennycason</groupId ...

  6. 接单日记(三)文本处理之词云生成

    文章目录 接单日记(三)文本处理之词云生成 一. 实验目的 二. 实验内容 三. 程序及结果 1. 运行程序 2. 运行结果 接单日记(三)文本处理之词云生成 此为一个实验报告,故遵守实验报告的格式. ...

  7. Python编程:实现词云生成(附详细源码)

    Python编程:实现词云生成(附详细源码) 词云是一种数据可视化的方式,它可以用来展示某个主题下的主要关键词汇.在Python中,我们可以使用 wordcloud 库来实现词云的生成.本文将带您一步 ...

  8. 基于python的词云生成-中文词云(指定词云形状)

    基于python的词云生成(二) 1.简介    本文是在基于python的词云生成(一)的基础上,进一步对云词进行编写,本文还使用了jieba分词对中文进行分词处理,以做出更好的效果.    jie ...

  9. 生活大爆炸(TBBT): 台词爬取、词云生成与NLP分析

    <生活大爆炸>(英文:The Big Bang Theory 简称:TBBT)广受喜爱(据说还可以练听力练口语blabla),去年随着第12季的播出而完结,最近也算是在补.有一天闲聊的时候 ...

最新文章

  1. 外媒:高通指控苹果窃取其芯片机密信息!
  2. linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
  3. vue 源码学习(一) 目录结构和构建过程简介
  4. python获取重定向url_python中检测url重定向到的地址的例子
  5. 计算机课程中lnA怎么打,《计算机基础》考试模拟题(含答案)
  6. Linux命令备忘实例——排序和基本统计命令
  7. 论文阅读笔记:《Contextual String Embeddings for Sequence Labeling》
  8. 【原创】1985-2021年《中国城市统计年鉴》900+全变量地级市面板数据 Python编程整理直接可用的城市面板数据
  9. 宠物商店管理系统php,宠物店管理系统
  10. Java 十大常用框架
  11. WordPress外贸建站多语言翻译插件推荐
  12. 《黑客帝国 THE MATRIX》——当你生活在代码的虚拟世界中
  13. 根据报告数据,2021 年 Q1,全球小说 App 推广榜 Top20 里面,有 11 个 App 来自中国厂商。最新版本已经上线
  14. 内核辅助函数系列 001 --- __ffs(unsigned long word):第一个非 0 位
  15. 百度网站优化和360网站优化的排名算法异同之处
  16. 这可是全网EVE安装最完整,最详细的图解,没有之一【安装图解】
  17. python黑科技:Python大佬用20行代码带你打造一个微信聊天机器人,真神了~
  18. 数商云医药医疗行业B2B平台:如何赋能企业数字化转型,破局传统医药通路难题
  19. Python绘制RTKLIB的POS文件中的XYZ误差曲线及计算RMSE
  20. 跨境电商“洋码头”,真正的对手是谁?

热门文章

  1. 机器人离线编程软件AUTOMAPPPS与DELMIA对比
  2. 实例QT程序 —— QTableWidget 表格行的上下移动
  3. python classmethod 的cls_python的cls,self,classmethod,staticmethod
  4. 响应式页面-bootstrap分辨率
  5. Large-Scale Long-Tailed Recognition in an Open World
  6. linux uboot nfs启动,嵌入式uboot,内核启动通过nfs挂载根文件系统
  7. 《Linux/UNIX OpenLDAP实战指南》——2.9 OpenLDAP控制策略
  8. android自定义u形线,Android实战之自定义View折线图
  9. mysql 定义变量会提升效率么_小议mysql变量及其优化
  10. JavaScript——异步编程