在弄任何一个数据之前,肯定是要先设计数据库的。这里打算将《冰与火之歌》(以下称《冰火》)的文本数据先存入到数据库中,后续在使用python读取数据来处理。

前期准备

需要工具:
1.peewee
2.sqlite
3.python3.5(当然python2也是可以的)

大致说一下:
1.peewee
peewee是python中的一个轻量级ORM框架。
什么是ORM框架?
不熟悉的同学可以看下面几个peewee的教程:
-peewee说明文档
-Python的ORM框架Peewee使用入门(一)
怎么安装?直接pip install peewee就可以,安装有困难的话可以参考我另一篇博文python中正确安装对应版本的包

2.sqlite
sqlite是一个轻量级的数据库(轻量级这一系列东西很适合做一些小型的数据项目,以后大家可以常用)。起初是我在写C#窗体应用程序的时候发现它的。sqlite很适合用来作嵌入式数据库,和C#中的DataGridView控件简直是绝配,在稍后的博客中我也会提及到用C#配合sqlite+DataGridView开发简单的数据库检索系统,感兴趣的同学可以关注下。
sqlite的语法基本和标准的sql语言相同,具体还有什么差异可以参考SQLite 教程
为什么说轻量级呢?它能够轻量到使用火狐浏览器的插件就可以打开。无需像sql server和mySQL一样配置用户和端口。也无需再安装一个专门的软件来写sqlite的sql。所有的所有,一个火狐浏览器+sqlite manager插件就可以完成(当然谷歌浏览器也是可以的,只是本人不常用谷歌的sqlite插件,对谷歌感兴趣的同学可以自行去查一下)。
火狐浏览器安装sqlite manager插件:打开火狐浏览器→附加组件→右上角的搜索输入:SQLite Manager→安装→重启浏览器。

3.Python3.5
python我就没什么好说的,我用的版本是3.5,2.7的同学可以找一下对应的peewee模块。

数据来源

我需要弄的是《冰火》人物关系图,但是如何从《冰火》中体现出人物的共现呢?我这里将一个章节内出现的所有人物则作为一次共现。因为根据《冰火》小说的特点,每一章都是以一个人物视角来写的,每一章基本都在讲一个主题。如果以每一段作为共现范围的话,那么一个章节下出现的所有角色将会出现很多次共现,而这些共现是无意义的,因为他们都是在同一个主题下出现的。
在网上找了现成的《冰火》txt版本下载,但是发现txt内的数据并不好处理。要么一个卷的所有章节堆到一个txt内,每个章节之间没有特别明显的区分特征,这样就无法用python来对文章章节进行分割;要么就是将文中的每一句作为一行,无法区分段落和章节。思来想去,最标准的格式就是现成的小说在线阅读网址。这样小说的每一段都会用<p></p>给括起来,用大数据领域的话来说,就是赤裸裸的一个结构化数据。只要是结构化的数据,什么都好处理了。所以这里就觉得顺手写一个爬虫,直接从小说在线阅读的网站把《冰火》抓取下来。我找了几个小说网站,最后看准了这家冰与火之歌小说全集
后面的网页分析以及网页抓取,将会呈现在 Scrapy+redis+mongodb分布式爬虫抓取小说《冰与火之歌1-5》

数据库的设计

根据需求,直接设计一张表足够了。表内属性最多包括id(每一条数据id,作为主键)、chapter(数据来源章节)、title(数据来源章节名)、content(章节内容)、characters(用来存储一个章节中出现的所有角色集合,注意是集合)、url(章节来源网站)、created_at(数据产生时间)。

id chapter title content characters url created_at

代码实现

结合peewee,最后实现的代码为:

# -*- coding: utf-8 -*-
# @Date     : 2017-04-07 10:16:53
# @Author   : Alan Lau
# @Language : Python3.5from peewee import *
from datetime import datetimedb = SqliteDatabase(r'A_Song_of_Ice_and_Fire.sqlite')
# 建立名字为A_Song_of_Ice_and_Fire.sqlite的数据库class BaseModel(Model):class Meta:database = db#新建一个novel表
class novel(BaseModel):id = IntegerField(primary_key=True, verbose_name='id')# 数据id,数据类型是IntegerField,对应sqlite中的Integer,作为主键。chapter = CharField(max_length=20, null=True, verbose_name='chapter')# 文本章节,数据类型是CharField,对应sqlite中的CHAR,长度为20,允许空值。title = CharField(max_length=500, null=True, verbose_name='title')# 章节标题,数据类型是CharField,对应sqlite中的CHAR,长度为500(鬼知道一个标题有多长...),允许空值。content = TextField(null=True, verbose_name='content')# 章节内容,数据类型是TextField,对应sqlite中的TEXT,长文本。characters = CharField(max_length=200, null=True,verbose_name='characters')# 章节中出现的演员,数据类型是CharField,对应sqlite中的CHAR,长度为200,允许空值。url = CharField(max_length=200, null=False, verbose_name='url')# 章节的url,方便出错后重爬created_at = DateTimeField(default=datetime.now(), null=True, verbose_name='Get_time')# 产生日期if __name__ == '__main__':
#执行pythontry:novel.create_table()#创建表语句except Exception as err:print(err)

运行一下
最后在代码所在的当前路径下产生
A_Song_of_Ice_and_Fire.sqlite文件

然后用火狐浏览器打开,写一个检索式验证一下:

这里检索式写得不规范,少了个;,大家不要学我….

到现在,一个数据库就设计好了,结合peewee、sqlite、python,是不是非常方便。

python简单实战项目:《冰与火之歌1-5》角色关系图谱构建——数据库设计相关推荐

  1. python简单实战项目:《冰与火之歌1-5》角色关系图谱构建

    前两天<权力的游戏>第七季发布了第二弹预告片,思索的第七季也快要来了,正想着脑子突然一热,要不弄个<权利的游戏>的角色共现图谱吧.故事里面的人物关系复杂程度也是出了名了的,如果 ...

  2. Scrapy+redis+mongodb分布式爬虫抓取小说《冰与火之歌1-5》

    一年前写了python简单实战项目:<冰与火之歌1-5>角色关系图谱构建的数据库设计和数据可视化共现图谱的构建,中间唯独缺了数据的采集,因为想着只是个小爬虫,应该无关痛痒,后面也觉得这个系 ...

  3. python 课后习题:项目二数据分析之《冰与火之歌》全五卷人物关系图

    其实这种人物关系图网上教程一大堆,我也是照着做的.在这里说一下我出错的地方,以及需要注意的一些东西. 注意: a. 代码缩进,我照着网上抄,网上的缩进不清楚然后我抄错了都没发现,结果出现了人名出现次数 ...

  4. 冰与火之歌-五王之战(优达数据分析进阶项目)

    五王之战分析 - 冰与火之歌 简介 五王之战(War of the Five Kings)是著名严肃奇幻小说<冰与火之歌>中的著名内战.这是一场规模空前.波及七大王国的内乱.顾名思义,前后 ...

  5. 基于贝叶斯生存分析的《冰与火之歌》人物死亡率分析

    <冰与火之歌>书迷遍布全球.该小说凭借其丰富的人物设置受到广大书迷青睐.然而,在马丁( Martin )笔下,无论好人.坏人,主角.配角都难逃命运的捉弄.除不计其数的无名小卒外,马丁的世界 ...

  6. Processing 案例 | 用粒子系统谱写冰与火之歌

    文章目录 引言 FireBrush 分析作品 大概流程 父类:Particle 子类:Fire 子类:Smoke IceAndFire 更多拓展 Frozen Brush 愤怒的小鸟 小结 引言 前不 ...

  7. 10个Python爬虫实战项目

    Python爬虫是指使用Python语言编写程序,自动化地从互联网上获取数据并进行处理和分析的技术.Python爬虫是一项复杂而且实用的技术,需要掌握多个方面的基础知识,并具备较强的编程能力和实际操作 ...

  8. iOS 冰与火之歌 - 利用 XPC 过 App 沙盒

    蒸米是阿里巴巴的移动安全工程师,香港中文大学博士,也是发现并命名了XcodeGhost的人.这次他所在的iOS安全小组发现了影响最新版iOS 9.3的0day漏洞.此漏洞杀伤力巨大,在非越狱手机上一个 ...

  9. 冰与火之歌 《权力的游戏》

    2019独角兽企业重金招聘Python工程师标准>>> 冰与火之歌 <权力的游戏> 1. 冰与火之歌 <冰与火之歌>(英语:A Song of Ice and ...

最新文章

  1. GPIO做输出还能作外部中断输入吗?
  2. Java项目经验——程序员成长的关键
  3. 软件的安装(包括yum仓库与源码包的安装)
  4. 第三天【DOM4J Xpath】
  5. html5背景图片上放按钮,html5自定义video标签的海报与播放按钮
  6. linux内核定义的常用信号6,linux复习
  7. JQuery Datatables 数据操作
  8. Python+OpenCV:直方图反向投影(Histogram Backprojection)
  9. 《如何有效阅读一本书-超实用笔记读书法》
  10. 计算机加号公式,怎样在excel表格中显示加号,而不被当成是公式来计算
  11. 【PTA 6-10】输入多个单词,统计以指定字母开头的单词个数
  12. RTP打包G711音频数据发送
  13. 散射回波仿真Matlab,基于散射中心模型的ISAR回波仿真方法
  14. html仿网易云网站,GitHub - Hdoove/music-webapp: 仿网易云webapp
  15. 在网页上嵌入微博--微博秀
  16. 微信小程序--开发者工具
  17. 监控系统-3.1自定义告警
  18. 转载:关于动漫与动画
  19. 十九个指标下的七个国家级城市群的高校科技成果汇总
  20. 一位清华学长的CTO成长之路

热门文章

  1. c和java哪个难_为什么说 C 语言比 Java 难?
  2. 【Android 安全】DEX 加密 ( Proguard 混淆 | 将混淆后的报错信息转为原始报错信息 | retrace.bat 命令执行目录 | 暴露更少信息 )
  3. 在IE9浏览器下面按enter键会提交两次
  4. php 上传apk包到cdn_解决QQ群文件base.apk的问题
  5. python拼多多1分抢手机_拼多多一分抢实在吗?拼多多一元秒杀怎样抢?
  6. 基于Redis实现微信抢红包功能
  7. 什么是隐形降权,如何避免和处理隐形降权 搜索作弊 SKU作弊 放错类目和属性 标题滥用关键词 虚假交易
  8. 网络连接正常但是qq网页都打不开的情况
  9. Selected class file name ‘Employee.java‘ mapped to not java file type ‘Files supported via TextMate
  10. dfs--选择困难症牛客