用C++做数据分析 - 唐代诗人的朋友圈-拷贝漫画漫画

“李杜文章在,光焰万丈长”,唐诗无疑是中国古代文学最灿烂的篇章之一。现代人发表论文,会互相引用,喝酒吃饭,也经常会谈及谁谁谁是我哥们。作为当时最重要的文学形式,唐代的诗人也经常会在诗文中提及自己的好朋友。杜甫比李白小十一岁,二者相识于杜甫父亲杜闲家中,彼时正是李白因触怒权贵放归山林之时。两人一见,杜秒变小迷弟。杜在《与李十二白同寻范十隐居》中描绘了两人的亲密关系:”余亦东蒙客,怜君如兄弟。醉眠秋共被,携手日同行”。不仅如此,在两人各奔东西后,杜甫压抑不住对李白的思念,写了多首提及李白的诗。例如《梦李白》中云:”三夜频梦君,情亲见君意”。能连续三个晚上做梦都梦到李白,可见交情不浅。

通过分析全唐诗中各位诗人之间的“引用”关系,可以描绘出当时诗坛的大致朋友圈图景:谁跟谁熟?谁是圈子里的带头大哥?全唐诗有4万多首,人工一首一首地筛查费时费力,这种重复的统计性质的工作正是计算机最擅长的。

本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。

1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频

2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军, 高等教育出版社

3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

23. 数据分析 - 唐代诗人的朋友圈

同类相比,同声相应,固天理也。——庄子

本章的代码和数据整合在一个名为C23_PoetsNetwork的文件夹中。注意,本章节所依赖的全唐诗文本以及《中国历代人物传记资料库》使用了繁体中文,所以读者在运行代码查询时,如果使用简体中文输入诗人姓名,结果将与预期不符。

本章内容受开源项目poetry_analyzer的启发。为方便读者理解,作者整理了相关数据并重写了代码。

本章的代码实现依赖于Qt平台的专有特性,只能通过Qt Creator集成开发环境来编写和构建。

23.1 创建程序框架

请读者按照22.1及22.3节所介绍的方法,在Qt Creator中创建一个名为PoetsNetwork的项目,该项目的主窗口如图23-1所示,作者在该图上人工标注了各关键部件的名称。表23-1列出了该项目创建过程中的一些注意事项,以及其主窗口中部分部件的用途。

图23-1 唐代诗人的朋友圈主窗口

图23-2则展示MainWidget主窗口的对象结构以及窗口组件之间的布局关系。如图所示,主窗口自身呈现竖向布局,其内包含4个横向布局以及textBrowser。为了构造出期望的界面效果,读者可能需要:(1) 调整布局的layoutSpacing(布局间隔);(2) 修改按钮、单行输入框的minimumSize(最小尺寸)。此外,在图23-2中,我们还看到了类型为Spacer的部件,这种类型的部件仅用于占据布局空间,其在最终的结果页面上不会有任何显示,它可以把别的部件“挤”到期望的位置。

图23-2 MainWidget主窗口的对象结构23.2 数据整理与准备23.2.1 sqlite数据库

为了便于统计分析以及向读者简单介绍数据库的入门知识和C++访问数据库的方法,本章使用sqlite数据库来存储相关数据。

对于结构化的数据,如个人的身份信息、银行的交易流水、图书馆的借还记录等,通常都存储在数据库系统中。数据库系统通常运行在一个服务器或者由多个服务器构成的集群中,软件使用者的计算机或者终端直接或者间接地透过TCP/IP访问数据库、查询或存储数据。大型的数据库系统软件有阿里蚂蚁金服的OceanBase、华为的GaussDB、开源的MySql以及私有的Oracle。

本章使用的sqlite是一个超级mini版的数据库系统,它本质上是一个运行于软件内部的C语言包。在本章的代码中,数据库的存储文件为C22_PoetsNetwork/data子目录下的data.db。

为了便于查询数据库中的数据,请读者按照二维码链接所提供的方法,下载并安装一个名为SQLiteStudio的软件,SQLiteStudio是遵从GPL协议的开源软件,它可以帮助我们创建、编辑和查询sqlite数据库。作者安装时,其版本号为3.3.3。

如图23-3所示,运行SQLiteStudio,选择Database/Add a database(数据库/添加一个数据库)菜单项,将得到如图23-4所示的对话框。在该对话框中,将数据类型选择为SQLite 3,点击浏览按钮(

)定位到项目目录中已存在的data.db文件,此时,name(名称)被自动调整为data,点击“测试连接”,在测试通过后点击“OK”按钮即可打开本实践的数据库文件(data.db)。

图23-3 添加数据库

图23-4 选择data.db

数据库文件打开后,名为data数据库将显示在软件的左侧列表中,如图23-5所示。双击data数据库将其逐步展开,可以看到该数据库有4个表格,名称分别是altname(别名)、peom(诗)、poet(诗人)和reference(引用)。

选择peom表,可以看到表格中的数据,共有42948行,每一行存储了一首唐诗。这些数据来自于“全唐诗”,可以看到,排在最前面的是唐太宗李世民的诗。

图23-5 peom表格中的数据

数据库中的表(Table)都是二维的,每一行称为一条记录(Record), 在poem表中,一条记录存储一首唐诗。每一行又可以分为多列(Column),在数据库中,列也称为字段(Field)。peom表的结构如表23-2所示。

text是sqlite数据库中使用的字符串类型名,读者可以认为它就是Qt中的QString字符串类型。

23.2.2 数据库连接

应用程序与数据库之间的关系通常是客户机/服务器模式,读者可以把数据库想象成一个服务器,而应用程序则是客户机,数据库服务器通过网络向客户机提供数据存储和查询服务。当然,对于sqlite这种嵌入式数据库而言,数据库服务器并不真正存在,通信也不依赖于网络。

为了访问数据库,需要建立数据库连接。按照上述二维码链接提供的方法,创建一个名为DBHelper的类并加入到项目PoetsNetwork中。

其中,头文件dbhelper.h的代码如下:

类DBHelper是一个所谓的“帮助类”,其数据成员和方法都是静态的,这意味着我们可以在不实例化DBHelper对象的前提下使用这些属性和方法。

深爱着妹妹的哥哥,还有他们之间那猜不透的心。
2017-11-17
为了实现成为厨师的梦想来到首尔的海源!而他还有另个一梦想,就是想好好享受一把在老家无法享受的自由生活.一整理好房子他就迫不及待的去了梨泰院的酒吧喝了个满醉差点就被坏人拐走了…而救下他的人刚好是个他喜欢的类型的帅哥.海源跟他度过了一个美妙的夜晚但是对方一结束就一言不发的走了.后来发现这个人居然就是自家楼上网红餐厅’佛罗里达饭店’的厨师长?
2023-05-19
最近在SNS上爆火的模特“崔峰”,自出生后就拥有了帅气的外貌,不知不觉成为顶流的他某天在自己的SNS上上传了招聘保姆的启事。不久后,一个男人说要做保姆来找到了他。 这个男人的真面目,竟然是7年前消失得无影无踪的,自己的好友兼初恋“江都和”?! 以为已经死了的都和,突然登场而感到背叛的崔峰以成为保姆的条件而向他提出了隐秘的提议...
2023-05-20
亚龙,一位高大健壮的美男老师,心中藏着一个不为人知的秘密。动不动就bo起的他,还是个M!在洗手间自w时被自己的学生新韩发现,从此两人就缔结起了双边契约关系。
2023-05-20
收到备取通知的当天,备取5的正妹主动联络我,说只要我把递补名额让给她,她就愿意当我炮友…?
2019-07-25
正值血气方刚的维廷,是乡下富人家的独生子。某天,维廷的爸爸突然带了年轻女人回来,要维廷叫她「小妈」!!而小妈不只把维廷迷得神魂颠倒,还开始带着维廷慢慢跨越道德界线...
2021-06-03
振行被初恋背叛后来到济州岛治疗情伤,却在民宿遇到了预想不到的姻缘,进而连肉体也获得解放…
2019-08-16
十五年来的好友关係 却在一夕间变了质 该用什么关係看待她呢..
2015-05-13
体格很大却蠢笨又胆小的老虎,在偷听到人类之间的对话后,误以为‘柿饼’是很可怕的怪物。在黑暗中遇到小偷的他,以为小偷就是传说中的‘柿饼’,吓得晕厥过去了。而那个发现了稀有的老虎兽人的狡猾小偷,幻想着通过‘虎身买卖’一获千金!
2023-05-19
某个国家的Alpha三王子阿黛尔偶然救下了戴着项圈的Omega由依.看到了项圈上刻印着的风俗店的名字还有充满了伤疤的身体阿黛尔决定将由依藏到自己的家里.但是因为由依的发情期他也失去了理智本能般的和由依成为了伴侣.由依虽然害怕这个像野兽一样渴望他身体的阿黛尔,但是也一天天感受到了称自己为他的‘命运’的阿黛尔对他的温暖…曾用悲观的视角认为世界是冰冷的由依在阿黛尔的影响下融化了自己的身心…但是活在两个不同世界的人能够成为真正的伴侣吗.
2023-05-19