您的位置:首页 > 编程语言 > Python开发

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

2017-04-10 16:38 483 查看
在弄任何一个数据之前,肯定是要先设计数据库的。这里打算将《冰与火之歌》(以下称《冰火》)的文本数据先存入到数据库中,后续在使用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>
给括起来,用大数据领域的话来说,就是赤裸裸的一个结构化数据。只要是结构化的数据,什么都好处理了。所以这里就觉得顺手写一个爬虫,直接从小说在线阅读的网站把《冰火》抓取下来。我找了几个小说网站,最后看准了这家冰与火之歌小说全集

后面的网页分析以及网页抓取,将会呈现在python简单实战项目:《冰与火之歌1-5》角色关系图谱构建——数据挖掘

数据库的设计

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

idchaptertitlecontentcharactersurlcreated_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,是不是非常方便。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐