Python微实践 - 诗意书香,宋风雅韵

news2024/12/24 9:06:30

诗意书香,宋风雅韵,宋代的文人们或婉约,或豪放,为后世留下了不朽的文学遗产 —— 宋词。宋词本质上是用于合乐的歌词,词人在填词时用的曲调名即为词牌。各位读者在中学时期一定对“水调歌头”、“念奴娇”这些词牌名耳熟能详。根据统计,存世的宋词当中出现的词牌名约有1400余个。那么,哪些词牌名最受词人追捧?这种枯燥重复的统计工作,正是计算机所擅长的。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

在随书源代码的CH6目录下,有个名为songci.json的文件,该文件以JSON保存了21050首存世宋词。关于何为JSON格式,以及如何存取JSON格式文件,我们在第8章中讨论。

在Visual Studio Code中打开文件songci.json,可见如下内容:

[
  ...  #此处有大量节略
  {
    "author": "晏殊", 
    "paragraphs": [
      "一曲新词酒一杯。", "去年天气旧亭台。", "夕阳西下几时回。", 
      "无可奈何花落去,似曾相识燕归来。", "小园香径独徘徊。"
    ], 
    "rhythmic": "浣溪沙"
  },
  {
    "author": "李清照", 
    "paragraphs": [
      "常记溪亭日暮。", "沈醉不知归路。", "兴尽晚回舟,误入藕花深处。", 
      "争渡。", "争渡。", "惊起一滩鸥鹭。"
    ], 
    "rhythmic": "如梦令"
  }
  ...   #此处大量节略
]

songci.json中的文本内容如果按Python语法,可以理解为一个列表,该列表包含21050个字典。每个字典包含一首宋词,其由至少三个键值对构成,其中”author”对应作者姓名,”paragraphs”对应宋词正文,”rhythmic”则对应词牌名。

#songrhythm.py
f = open("songci.json","rt",encoding="utf-8")
ci = eval(f.read())
f.close()

rhythmic = {}
for x in ci:
    r = x["rhythmic"]
    rhythmic[r] = rhythmic.get(r,0) + 1

from wordcloud import WordCloud
wc = WordCloud( font_path="PuHuiTi.ttf",
                width = 1500, height = 1000,
                background_color='white', colormap="Paired" )
wc.generate_from_frequencies(rhythmic)

from matplotlib import pyplot as plt 
plt.imshow(wc)
plt.axis("off")
plt.subplots_adjust(0,0,1.0,1.0,0,0)
plt.show()

#本程序中的宋词数据库引用自开源项目Chinese-poetry
#受限于版权,本演示程序使用了免费的开源字体

🚩第2 ~ 4行:打开当前工作路径下的文件songci.json,将其中的内容按字符串形式读出,并借由eval()函数进行转换,并将转换结果赋值给ci。关于文件读写的详细方法,我们在第8章里讨论。根据songci.json的文件内容可知,上述代码执行后,ci应为一个列表,其中包含21050个字典。

🚩第6 ~ 9行:从宋词列表ci统计各词牌名的出现次数,结果存储于rhythmic字典中。第7行的for循环逐一遍历列表ci中的子字典x,其中的值对象x[“rhythmic”]即为词牌名r。对于每个遇到的词牌名r,均将其在rhythmic字典中的出现次数加1。请读者留意rhythmic.get(r,0)的应用,当某个词牌名,比如”点绛唇”第一次被for循环发现时,其在rhythmic字典中尚不存在,get()函数的应用可以避免程序出错并返回指定的默认值0。

🚩第11 ~ 15行:使用第三方库wordcloud生成词云。Wordcloud第三方库的安装方法请参见1.6.3节。

🚩第12行:WordCloud是由第三方库wordcloud所定义的类型名,其同名函数WordCloud()用于生成一个词云对象。关键字参数font_path指明了生成词云时所用的字体文件。对于Windows操作系统而言,这些字体文件可以在C:/Windows/Fonts目录中找到。为方便读者,作者复制了开源的阿里巴巴普惠体字体文件PUHUITI.ttf,并放置在了随书代码的CH6子目录下。

🚩第14行:关键字参数background_color用于指定词云的背景色,colormap则指定了颜色映射表。本行代码中用到的颜色映射表”Paired”是由matplotlib定义的。

🚩第15行:词云对象wc的generate_from_frequencies()成员函数进行已有的词频统计结果生成词云。对本例而言,rhythmic字典提供了相应的词频统计结果。那些出现次数多的词牌名将在词云中被突出显示。

🚩第17 ~ 21行:在matplotlib里绘制图云并显示出来。

运行上述程序songrhythm.py,将得到如图所示的词云。从中可以看出,在宋代,最受追捧的词牌名是“浣溪沙”,然后是“水调歌头”和“鹧鸪天”。
  在这里插入图片描述
🥇操作技巧

在运行songrhythm.py时,读者一定要确保文件songrhythm.py、songci.json、PuHuiTi.ttf均位于当前工作路径之下。否则,程序会因为无法找到需要的文件而运行出错。关于当前工作路径的解释,请参见1.5.2节。

将前述程序略作修改,便可以将统计对象由词牌名改为作者。我们也根据存世作品的数量绘制了宋代词人的词云,如图6-x所示。相应代码文件为songpoet.py,可在随书代码的CH6目录下找到。如图所见,宋代词人存世作品最多的是辛弃疾,然后是苏轼和刘辰翁。
在这里插入图片描述

#songpoet.py
f = open("songci.json","rt",encoding="utf-8")
ci = eval(f.read())
f.close()

authors = {}
for x in ci:
    r = x["author"]
    authors[r] = authors.get(r,0) + 1

from wordcloud import WordCloud
wc = WordCloud( font_path="PuHuiTi.ttf",
                width = 1500, height = 1000,
                background_color='white', colormap="Paired" )
authors.pop("无名氏")
wc.generate_from_frequencies(authors)

from matplotlib import pyplot as plt 
plt.imshow(wc)
plt.axis("off")
plt.subplots_adjust(0,0,1.0,1.0,0,0)
plt.show()

#本程序中的宋词数据库引用自开源项目Chinese-poetry
#受限于版权,本演示程序使用了免费的开源字体

为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

简洁的C及C++
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
Python编程基础及应用
由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

Python编程基础及应用

Python编程基础及应用实验教程
在这里插入图片描述

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

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

相关文章

mybatis-plus 实现自动填充

文章目录 1、自定义实现类 MyMetaObjectHandler2、在entity中标记需要自动填充的属性3、FieldFill中有哪些字段 1、自定义实现类 MyMetaObjectHandler import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apach…

【Python】PyCharm中调用另一个文件的函数或类

🎉欢迎来到Python专栏~PyCharm中调用另一个文件的函数或类 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:Python学习专栏 文章作者技术和水平有限,如果文中出现错误&…

SOKIT软件的使用

1.模拟客户端向服务器发送报文 客户端---->TCP连接---->填写数据----->点击“发送” 2.模拟服务器接受报文 服务器---->设置IP地址与端口---->点击TCP侦听 就可以往该地址发送报文信息了

需求分析案例:全局错误码设计

本文介绍了我在一些业务系统中遇到的错误提示问题,以及进行需求分析和设计实现的过程,欢迎进行交流和指点,一起进步。 1、需求起源 作为程序员,或多或少,都经历过如下场景: 场景1: 产品经理&a…

Stable Diffusion 用2D图片制作3D动态壁纸

如果想让我们的2D图片动起来可以使用stable-diffusion-webui-depthmap-script插件在SD中进行加工让图片动起来。 这是一个可以从单个图像创建深度图,现在也可以生成3D立体图像对的插件,无论是并排还是浮雕。生成的结果可在3D或全息设备(如VR耳机或Looking Glass显示器)上查…

LabVIEW和Web Service交互方式?LabVIE本地项目如何发布到互联网上让外网访问

LabVIEW全称Laboratory Virtual Instrument Engineering Workbench, 是一种图形化编程语言(通常称为G语言),即实验室虚拟仪器集成环境。LabVIEW 经过多年的持续创新,已经从单纯的仪器控制软件发展成为面向设计、测量和控制的综合性图形化开发…

【设计模式】循序渐进的理解观察者模式Spring事件机制的运用

文章目录 1. 概述2.循序渐进的理解观察者模式2.1 观察者模式概念引入2.2.观察者接口抽象2.3 被观察者接口抽象2.4 观察者模式的通用类图2.5.观察者模式的通用代码实现 3.Spring中的事件运用3.1.Spring事件中的几个角色介绍3.2.代码实现 4.总结 1. 概述 观察者模式(…

RabbitMQ高阶使用

1. 问题 2. 延时任务 2.1 什么是延时任务 在当前时间往后延迟多少时间执行的任务 2.1.1 和定时任务区别 定时任务有明确的触发时间,延时任务没有定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期定时任务一般执行的…

生命周期函数和wxs脚本

生命周期函数和wxs脚本 1. 生命周期函数1.1. 应用的生命周期函数1.2. 页面的生命周期函数 2. wxs脚本2.1. wxs与JavaScript的关系2.2. wxs内嵌脚本2.3. wxs外联脚本2.4. tips 1. 生命周期函数 1.1. 应用的生命周期函数 应用的生命周期函数:指小程序从启动 -> 运…

【每日算法】【226. 翻转二叉树】

☀️博客主页:CSDN博客主页 💨本文由 我是小狼君 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝&…

熔断与降级的那些事

什么熔断 熔断(Circuit Breaker)是一种用于限制系统请求的机制,其目的是防止系统在发生故障或异常情况下继续执行无效的调用,从而避免雪崩效应和进一步的系统损害。 熔断器通常用于分布式系统中的微服务架构中,它负责…

taro3 微信小程序 createIntersectionObserver 监听无效

项目: taro3 vue3 官方文档 版本:3.x Taro.createIntersectionObserver(component, options) 创建并返回一个 IntersectionObserver 对象实例。在自定义组件或包含自定义组件的页面中,应使用 this.createIntersectionObserver([options]) …

FSMC外设—扩展外部SRAM

目录 FSMC—扩展外部SRAM 前言 SRAM SRAM控制原理 SRAM芯片外观 SRAM芯片的内部功能框架 SRAM信号线 SRAM的存储矩阵 地址译码器、列I/O及I/O数据电路 控制电路 SRAM的读写流程 FSMC FSMC简介 FSMC框图剖析 通讯引脚 存储器控制器 时钟控制逻辑 FSMC的地址映…

【USRP X410】LabVIEW参考架构软件,用于使用Ettus USRP X410对无线系统进行原型验证

LabVIEW参考架构软件,用于使用Ettus USRP X410对无线系统进行原型验证 设备 1 MHz to 7.2 GHz,400 MHz带宽,GPS驯服OCXO,USRP软件无线电设备 - Ettus USRP X410集成硬件和软件,可帮助您制作高性能无线系统的原型&…

探索非洲专线物流的新时代_国际物流供应链管理平台_箱讯科技

随着全球化的发展,非洲作为一个充满机遇和挑战的大陆,吸引着越来越多的企业和投资者。然而,由于非洲的地理复杂性和基础设施不完善,物流问题一直是制约非洲发展的瓶颈之一。为了解决这一问题,非洲专线物流应运而生。本…

分布式数据库HBase,它到底是怎么组成的?

原文链接:http://www.ibearzmblog.com/#/technology/info?id3f432a2451f5f9cb9a14d6e756036b67 前言 大数据的核心问题无非就是存储和计算这两个。Hadoop中的HDFS解决了数据存储的问题,而HBase就是在HDFS上构建,因此Hbase既能解决大数据存…

【广州华锐互动】AR远程巡检系统在设备维修保养中的作用

随着科技的不断发展,AR(增强现实)远程巡检系统在设备检修中发挥着越来越重要的作用。这种系统可以将AR技术与远程通信技术相结合,实现对设备检修过程的实时监控和远程指导,提高设备检修的效率和质量。 首先,AR远程巡检系统可以帮助…

004.PADS VX2.4常用快捷键及无模命令

1.常用快捷键: F2 布线(Layout) F3 布线(Router) F4 切换layer F6 选中一个导线按f6选中整个网络 TAB 旋转 CtrlA select All 全选 CtrlB sheet 切换到整线sheet可以的视图状态 CtrlC copy 复制选定对象(可以是多选或选一范围): 也可以在按住Ctrl同时拖动选定对象…

微信小程序音频播放失败:TypeError: Cannot read property ‘duration‘ of undefined

报错截图 最下面这个this.setData()报错可不用理会,是this取值的问题 解决 需要播放和暂停功能时,需要把audio以及他的src放在Page外面。不能缺少 audioCtx.onPlay() 和 audioCtx.onError()两个方法,且需要放在play()方法之前如果在wx.crea…

解决/usr/bin/ld: cannot find -l****解决

运行程序时出现了以下错误 在这里说明一下出现/usr/bin/ld: cannot find -l****其实都是出现了类似的问题,只是各自的文件不同 其中****即表示函式库文件名称,如上例的:libstdc.so、libluuid.so 其命名规则是:lib库名(即xxx).so …