用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对象的前提下使用这些属性和方法。