社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python爱好者社区 • 6 年前 • 668 次点击  

作者:AlanLau    Python爱好者社区专栏作者

简书专栏:https://www.jianshu.com/u/6da6a9668142

csdn博客:https://blog.csdn.net/alanconstantinelau


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


前期准备


需要工具: 


1.peewee
2.sqlite
3.python3.5(当然python2也是可以的)


大致说一下: 


1.peewee 

peewee是python中的一个轻量级ORM框架。 


什么是ORM框架?
不熟悉的同学可以看下面几个peewee的教程:
   -
peewee说明文档:http://peewee.readthedocs.io/en/latest/peewee/quickstart.html#model-definition
   -Python的ORM框架Peewee使用入门(一):https://blog.csdn.net/WuLex/article/details/52565681
怎么安装?直接pip install peewee就可以,安装有困难的话可以参考我另一篇博文python中正确安装对应版本的包:https://blog.csdn.net/alanconstantinelau/article/details/69944743


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来对文章章节进行分割;要么就是将文中的每一句作为一行,无法区分段落和章节。思来想去,最标准的格式就是现成的小说在线阅读网址。这样小说的每一段都会用

给括起来,用大数据领域的话来说,就是赤裸裸的一个结构化数据。只要是结构化的数据,什么都好处理了。所以这里就觉得顺手写一个爬虫,直接从小说在线阅读的网站把《冰火》抓取下来。我找了几个小说网站,最后看准了这家冰与火之歌小说全集:https://www.sbkk88.com/mingzhu/waiguowenxuemingzhu/bingyuhuozhige/

 
后面的网页分析以及网页抓取,将会呈现在 Scrapy+redis+mongodb分布式爬虫抓取小说《冰与火之歌1-5》


数据库的设计


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



代码实现


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


# -*- coding: utf-8 -*- # @Date     : 2017-04-07 10:16:53 # @Author   : Alan Lau # @Language : Python3.5 from peewee import * from datetime import datetime db = 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__': #执行python    try:        novel.create_table()        #创建表语句    except Exception as err:        print(err)


运行一下 


最后在代码所在的当前路径下产生 


A_Song_of_Ice_and_Fire.sqlite文件 




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




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


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

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”开始学习Python课程

关注后在公众号内回复课程即可获取

小编的Python入门视频课程!!!

崔老师爬虫实战案例免费学习视频。

丘老师数据科学入门指导免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

丘老师Python网络爬虫实战免费学习视频。



今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/rDxmViiAIa
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/9420
 
668 次点击