导航:首页 > 编程语言 > 用python编一个故事

用python编一个故事

发布时间:2023-07-05 06:24:34

python爬虫之九阴真经

用Python 探索 金庸笔下的江湖!

带你用python看小说, 娱乐 学习两不误。

涉及的知识点有:

本文从传统匹配逻辑分析过渡到机器学习的词向量,全方位进行文本分析,值得学习,干货满满。( 文末点击阅读原文 )

以前金庸小说的网站有很多,但大部分已经无法访问,但由于很多金庸迷的存在,新站也是源源不断出现。我近期通过网络找到的一个还可以访问的金庸小说网址是: ==

不过我已经准备好已经采集完成的数据,大家可以直接下载数据,跳过本章的内容。

数据源下载地址:https://gitcode.net/as604049322/blog_data

下面首先获取这15部作品的名称、创作年份和对应的链接。从开发者工具可以看到每行的a标签很多,我们需要的节点的特征在于后续临近节点紧接着一个创作日期的字符串:

那么我们就可以通过遍历所有的a标签并判断其后续一个临近节点的内容是否符合日期格式,最终完整下载代码为:

可以按照创作日期排序查看:

名称创作时间网址 书剑恩仇录1955年/shujianenchoulu/ 碧血剑1956年/bixuejian/ 射雕英雄传1957—1959年/shediaoyingxiongzhuan/ 神雕侠侣1959—1961年/shendiaoxialv/ 雪山飞狐1959年/xueshanfeihu/ 飞狐外传1960—1961年/feihuwaizhuan/ 白马啸西风1961年/maxiaoxifeng/ 倚天屠龙记1961年/yitiantulongji/ 鸳鸯刀1961年/yuanyang/ 天龙八部1963—1966年/tianlongbabu/ 连城诀1963年/lianchengjue/ 侠客行1965年/xiakexing/ 笑傲江湖1967年/xiaoaojianghu/ 鹿鼎记1969—1972年/ludingji/ 越女剑1970年/yuenvjian/

下面看看章节页节点的分布情况,以《雪山飞狐》为例:

同时可以看到部分小说的节点出现了倒序的情况,我们需要在识别出倒序时将其正序,完整代码:

测试一下:

可以看到章节已经顺利的正序排列。

小说每一章的详细页最后一行的数据我们不需要:

下载每章内容的代码:

然后我们就可以批量下载全部小说了:

为了更好分析金庸小说,我们还需要采集金庸小说的人物、武功和门派,个人并没有找到还可以访问相关数据的网站,于是自行收集整理了相关数据:

相关数据都以如下格式存储,例如金庸小说的人物:

武功:

数据源下载地址:https://gitcode.net/as604049322/blog_data

定义一个加载小说的方法:

首先我们加载人物数据:

可以预览一下天龙八部中的人物:

下面我们寻找一下每部小说的主角,统计每个人物的出场次数,显然次数越多主角光环越强,下面我们看看每部小说,出现次数最多的前十个人物:

上述结果用文本展示了每部小说的前5个主角,但是不够直观,下面我用pyecharts的树图展示一下:

显然,《神雕侠侣》中的杨过和小龙女,《天龙八部》中的萧(乔)峰,段誉,虚竹,《射雕英雄传》的郭靖和黄蓉,《倚天屠龙记》的张无忌和赵敏 都是主角光环最强的角色。

使用上述相同的方法,分析各种武功的出现频次,首先加载武功数据:

定义计数方法:

每部小说频次前5的武功可视化:

门派分析


加载数据并获取每部小说前10的门派:

可视化:

还可以测试一下树形图:

综合统计


下面我们编写一个函数,输入一部小说名,可以输出其最高频的主角、武功和门派:

例如查看天龙八部:

词云图分析


可以先添加所有的人物、武功和门派作为自定义词汇:

这里我们仅提取词长度不小于4的成语、俗语和短语进行分析,以天龙八部这部小说为例:

修改上述代码,查看《射雕英雄传》:

神雕侠侣:

主角相关剧情词云


我们知道《神雕侠侣》这部小说最重要的主角是杨过和小龙女,我们可能会对于杨过和小龙女之间所发生的故事很感兴趣。如果通过程序快速了解呢?

我们考虑把《神雕侠侣》这部小说每一段中出现杨过及小龙女的段落进行jieba分词并制作词云。

同样我们只看4个字以上的词:

这里的每一个词都能联想到发生在杨过和小龙女背后的一个故事。

同样的思路看看郭靖和黄蓉:

最后我们看看天龙八部的三兄弟相关的词云:

关系图分析


金庸小说15部小说中预计出现了1400个以上的角色,下面我们将遍历小说的每一段,在一段中出现的任意两个角色,都计数1。最终我们取出现频次最高的前200个关系对进行可视化。

完整代码如下:

这次我们生成了HTML文件是为了更方便的查看结果,前200个人物的关系情况如下:

门派关系分析


按照相同的方法分析所有小说的门派关系:

Word2Vec分析


Word2Vec 是一款将词表征为实数值向量的高效工具,接下来,我们将使用它来处理这些小说。

gensim 包提供了一个 Python 版的实现。

之前我有使用 gensim 包进行了相似文本的匹配,有兴趣可查阅:《批量模糊匹配的三种方法》

首先我要将所有小说的段落分词后添加到组织到一起(前面的程序可以重启):

接下面我们使用Word2Vec训练模型:

我这边模型训练耗时15秒,若训练耗时较长可以把训练好的模型存到本地:

以后可以直接从本地磁盘读取模型:

有了模型,我们可以进行一些简单而有趣的测试。

首先看与乔(萧)峰相似的角色:

再看看与阿朱相似的角色:

除了角色,我们还可以看看门派:

还可以看看与降龙十八掌相似的武功秘籍:

在 Word2Vec 的模型里,有过“中国-北京=法国-巴黎”的例子,我们看看"段誉"和"段公子"类似于乔峰和什么的关系呢?

类似的还有:

查看韦小宝相关的关系:

门派武功之间的关系:

之前我们使用 Word2Vec 将每个词映射到了一个向量空间,因此,我们可以利用这个向量表示的空间,对这些词进行聚类分析。

首先取出所有角色对应的向量空间:

聚类算法有很多,这里我们使用基本的Kmeans算法进行聚类,如果只分成3类,那么很明显地可以将众人分成主角,配角,跑龙套的三类:

我们可以根据每个类别的角色数量的相对大小,判断该类别的角色是属于主角,配角还是跑龙套。

下面我们过滤掉众龙套角色之后,重新聚合成四类:

每次运行结果都不一样,大家可以调整类别数量继续测试。从结果可以看到,反派更倾向于被聚合到一起,非正常姓名的人物更倾向于被聚合在一起,主角更倾向于被聚合在一起。

现在我们采用层级聚类的方式,查看人物间的层次关系,这里同样龙套角色不再参与聚类。

层级聚类调用 scipy.cluster.hierarchy 中层级聚类的包,在此之前先解决matplotlib中文乱码问题:

接下来调用代码为:

然后我们可以得到金庸小说宇宙的人物层次关系地图,结果较长仅展示一部分结果:

当然所有小说混合产生的平行宇宙中,人物关系变得有些混乱,读者有兴趣可以拿单本小说作层次分析,就可以得到较为准确的人物层次关系。

对各种武功作与人物层次聚类相同的操作:

结果较长,仅展示部分结果:

可以看到,比较少的黄色部分明显是主角比较厉害的武功,而绿色比较多的部分基本都是配角的武功。

最后我们对门派进行层次聚类:

比较少的这一类,基本都是在某几部小说中出现的主要门派,而大多数门派都是打酱油的。

本文从金庸小说数据的采集,到普通的频次分析、剧情分析、关系分析,再到使用词向量空间分析相似关系,最后使用scipy进行所有小说的各种层次聚类。

⑵ 当下热度最高的编程语言Python究竟是怎样诞生的

Python诞生与发展

Python作为当下大火的一门编程语言,深受众多程序员的喜爱,而追溯其发展始末还得从上世纪说起。Python是Guido Van Rossum (荷兰人吉多·范罗苏姆)于1989年开发推出。而开发这一编程语言背后还有个不为人知的小故事。1989年圣诞节期间,在阿姆斯特丹的吉多深感无聊与苦闷,作为一名资深的编程爱好者他决定开发一个新的脚本解释程序,作为编程界惯用的ABC语言的一种继承。

Python因其奉行极简主义,易于读写受众多人青睐。更令人称道的是Python作为一种开源软件不用花一分钱就能够实现编辑,同时Python兼容多平台,学习强度相对于其他编程语言而言是普遍公认的简单,在实际生活的各个领域均得到了广泛的应用。

⑶ 使用 Python 和 Pygame 模块构建一个游戏框架

在我的 这系列的第一篇文章 中, 我已经讲解如何使用 Python 创建一个简单的、基于文本的骰子 游戏 。这次,我将展示如何使用 Python 模块 Pygame 来创建一个图形化 游戏 。它将需要几篇文章才能来得到一个确实做成一些东西的 游戏 ,但是到这系列的结尾,你将更好地理解如何查找和学习新的 Python 模块和如何从其基础上构建一个应用程序。

在开始前,你必须安装 Pygame 。

有几种方法来安装 Python 模块,但是最通用的两个是:

两个方法都工作的很好,并且每一个都有它自己的一套优势。如果你是在 Linux 或 BSD 上开发,可以利用你的发行版的软件存储库来自动和及时地更新。

然而,使用 Python 的内置软件包管理器可以给予你控制更新模块时间的能力。而且,它不是特定于操作系统的,这意味着,即使当你不是在你常用的开发机器上时,你也可以使用它。pip 的其它的优势是允许本地安装模块,如果你没有正在使用的计算机的管理权限,这是有用的。

如果 Python 和 Python3 都安装在你的系统上,你想使用的命令很可能是 pip3,它用来区分 Python 2.x 的 pip 的命令。如果你不确定,先尝试 pip3。

pip 命令有些像大多数 Linux 软件包管理器一样工作。你可以使用 search 搜索 Python 模块,然后使用 install 安装它们。如果你没有你正在使用的计算机的管理权限来安装软件,你可以使用 --user 选项来仅仅安装模块到你的家目录。

Pygame 是一个 Python 模块,这意味着它仅仅是一套可以使用在你的 Python 程序中的库。换句话说,它不是一个像 IDLE 或 Ninja-IDE 一样可以让你启动的程序。

一个电子 游戏 需要一个背景设定:故事发生的地点。在 Python 中,有两种不同的方法来创建你的故事背景:

你的背景仅是一张图片或一种颜色。你的电子 游戏 人物不能与在背景中的东西相互作用,因此,不要在后面放置一些太重要的东西。它仅仅是设置装饰。

要开始一个新的 Pygame 工程,先在计算机上创建一个文件夹。 游戏 的全部文件被放在这个目录中。在你的工程文件夹内部保持所需要的所有的文件来运行 游戏 是极其重要的。

一个 Python 脚本以文件类型、你的姓名,和你想使用的许可证开始。使用一个开放源码许可证,以便你的朋友可以改善你的 游戏 并与你一起分享他们的更改:

然后,你告诉 Python 你想使用的模块。一些模块是常见的 Python 库,当然,你想包括一个你刚刚安装的 Pygame 模块。

由于你将用这个脚本文件做很多工作,在文件中分成段落是有帮助的,以便你知道在哪里放代码。你可以使用块注释来做这些,这些注释仅在看你的源文件代码时是可见的。在你的代码中创建三个块。

接下来,为你的 游戏 设置窗口大小。注意,不是每一个人都有大计算机屏幕,所以,最好使用一个适合大多数人的计算机的屏幕大小。

这里有一个方法来切换全屏模式,很多现代电子 游戏 都会这样做,但是,由于你刚刚开始,简单起见仅设置一个大小即可。

在脚本中使用 Pygame 引擎前,你需要一些基本的设置。你必须设置帧频,启动它的内部时钟,然后开始 (init)Pygame 。

现在你可以设置你的背景。

在你继续前,打开一个图形应用程序,为你的 游戏 世界创建一个背景。在你的工程目录中的 images 文件夹内部保存它为 stage.png 。

这里有一些你可以使用的自由图形应用程序。

你的图像不必很复杂,你可以以后回去更改它。一旦有了它,在你文件的 Setup 部分添加这些代码:

如果你仅仅用一种颜色来填充你的 游戏 的背景,你需要做的就是:

你也必须定义颜色以使用。在你的 Setup 部分,使用红、绿、蓝 (RGB) 的值来创建一些颜色的定义。

至此,你理论上可以启动你的 游戏 了。问题是,它可能仅持续了一毫秒。

为证明这一点,保存你的文件为 your-name_game.py(用你真实的名称替换 your-name)。然后启动你的 游戏 。

如果你正在使用 IDLE,通过选择来自 “Run” 菜单的 “Run Mole” 来运行你的 游戏 。

如果你正在使用 Ninja,在左侧按钮条中单击 “Run file” 按钮。

你也可以直接从一个 Unix 终端或一个 Windows 命令提示符中运行一个 Python 脚本。

如果你正在使用 Windows,使用这命令:

启动它,不过不要期望很多,因为你的 游戏 现在仅仅持续几毫秒。你可以在下一部分中修复它。

除非另有说明,一个 Python 脚本运行一次并仅一次。近来计算机的运行速度是非常快的,所以你的 Python 脚本运行时间会少于 1 秒钟。

为强制你的 游戏 来处于足够长的打开和活跃状态来让人看到它(更不要说玩它),使用一个 while 循环。为使你的 游戏 保存打开,你可以设置一个变量为一些值,然后告诉一个 while 循环只要变量保持未更改则一直保存循环。

这经常被称为一个“主循环”,你可以使用术语 main 作为你的变量。在你的 Setup 部分的任意位置添加代码:

在主循环期间,使用 Pygame 关键字来检查键盘上的按键是否已经被按下或释放。添加这些代码到你的主循环部分:

也是在你的循环中,刷新你世界的背景。

如果你使用一个图片作为背景:

如果你使用一种颜色作为背景:

最后,告诉 Pygame 来重新刷新屏幕上的所有内容,并推进 游戏 的内部时钟。

保存你的文件,再次运行它来查看你曾经创建的最无趣的 游戏 。

退出 游戏 ,在你的键盘上按 q 键。

在这系列的 下一篇文章 中,我将向你演示,如何加强你当前空空如也的 游戏 世界,所以,继续学习并创建一些将要使用的图形!

via: https://opensource.com/article/17/12/game-framework-python

作者: Seth Kenlon 选题: lujun9972 译者: robsean 校对: wxy

⑷ python能做什么

python的用途:

Python的优势有必要作为第一步去了解,Python作为面向对象的脚本语言,优势就是数据处理和挖掘,这也注定了它和AI、互联网技术的紧密联系。

网络爬虫。顾名思义,从互联网上爬取信息的脚本,主要由urllib、requests等库编写,实用性很强,小编就曾写过爬取5w数据量的爬虫。在大数据风靡的时代,爬虫绝对是新秀。

人工智能。AI使Python一战成名,AI的实现可以通过tensorflow库。神经网络的核心在于激活函数、损失函数和数据,数据可以通过爬虫获得。训练时大量的数据运算又是Python的show time。

(4)用python编一个故事扩展阅读:

Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT技术,或者用使用C/C++语言改写这部分程序。可用的JIT技术是PyPy。

Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。

Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。

⑸ 少儿编程都学的啥啊,对于三岁的孩子来说难不难

首先来说Scratch。
Scratch是一款可以制作游戏、动画、工具的图形编程。简单地说,Scratch能够通过有限的命令、代码块,输出各种、甚至无限的可能,一旦掌握了Scratch,孩子们就能自由自在地挥洒它们无限的创意,享受创造的乐趣。而且Scratch编程的操作自主性非常高,不像学科辅导,需要通过老师一题一题的教导来完成的。在Scratch编程学习的过程中,老师更多承担的是辅助的角色,通过引导式教学不断启发孩子的思维,充分释放孩子们的想象力和创造力。
Scratch是一种用解构和重构世界的数字化工具,学习Scratch对孩子的思维模式的完善有很大帮助。未来AI的发展,会让很多职业消失,孩子们需要掌握用数字化的思维去理解这个世界,这样才能和AI交流,控制AI来辅助自己高效的处理事务,而不是被替代。
接下来我们再来说说Python。
少儿编程的教学难点在于用儿童理解的语言向孩子们传达编程内容。Python简单易入门的特点,对于孩子们来说十分友好。比起C语言、C++来说,Python更容易被孩子们接受,而且更具亲和力,容错率也更低。基于上述特性,Python非常利于孩子们良好的学习编码习惯的养成。
值得一提的是,Python有更多的拓展素材,更多的拓展素材意味着孩子们可以利用Python做更多的事,完成更多的高级任务,实现完整应用程序所需的各种功能。等到小朋友们逐渐具备少儿编程这种计算编程能力之后,他们自主学习的能力和理解能力将会得到极大的提高。

⑹ 有个python的程序看不懂,如下是代码,求高手解析

说黑客的哥哥牛逼了,阴谋论专家吗,zip只是压缩序列,你这故事讲的,这一看people.append(full_name)---添加名字,我没判断错的话应该是一个存,找名字的简单程序。。不知道哪儿看不懂,也不知道你的基础是怎么样,我就标注详细一点吧,首先格式调整一下,函数和循环不空格子多难读
def init(data):
data['first']={}
data['second']={}
data['last']={} #init(data)应该很好理解吧,生成一个空值的字典。#
def lookup(data,lable,name):
return data[lable].get(name) #应该是字典里的标签(frist或second等)下获取一个含有name的名字返回 #
def store(data,full_name):
names=full_name.split() #把名字分片 比如‘你奶奶’变 '你','奶','奶' #
lables='first','second','last' #给zip做铺垫的#
if len(full_name)==2 : names.insert(1,'') #冒号中间还是要空几个格子,不然看晕眼,求长度等于2,说明如果是两个字的名字,在1的位置插入一个空格,你奶 就变成了你 '空格 ' 奶 ,这样所有的名字都统一适用了init的三个标签#
for lable,name in zip(lables,names): # 新变量名,把压缩成元组的键值对解包然后一个个放到下面people里的lookup参数中去循环#
people=lookup(data,lable,name) #设定了一个people名,套用函数lookup(前面解释过了),判断这个输入的full_name中每一个lable(first,se。。)下的name是不是存在#
if people: #如果存在就会返回一个值,非0和None即为True #
people.append(full_name) #在末尾追加全名,比如已经有了data['first']={['你' : ['你 奶 奶']},那么你输入一个 你爷爷,由于'你'是存在的,所以会变成data['first']={['你' : ['你 奶 奶' , '你 爷 爷']} #
else:
data[lable][name]=[full_name]
#如果输入的是 我爷爷 ,即first下不存在wo ,那么返回值就是None,执行else ,即是在指定标签下加入一个新的name键进去,然后赋值全名,以前面的data为例,用拼音吧,打中文切换太累,就会变成data['first']={['ni' : ['ni nai nai' , 'ni ye ye'],'wo':['wo ye ye']}
然后你就可以调用函数来store名字进去和lookup名字出来了,这样讲够具体吗

阅读全文

与用python编一个故事相关的资料

热点内容
安卓手机电话簿怎么导出到苹果手机 浏览:763
php实现投票 浏览:333
手机爆力解压加密视频文件 浏览:932
东方财富app怎么看北上资金图解 浏览:418
邢昭林程序员那么可爱拍现场 浏览:169
安卓什么应用可以免费看电视剧 浏览:504
合适pdf 浏览:293
app监测睡眠怎么选择 浏览:642
老人家用什么安卓手机好 浏览:955
解压包能不能送女朋友 浏览:701
好看发卡网源码 浏览:51
水平集算法matlab 浏览:769
局域网如何用ftp服务器配置 浏览:76
程序员惯性思考模式 浏览:443
如何在个税app上查身份证号 浏览:7
电视家app安装在电视上怎么安 浏览:890
怎么将pdf格式转化为图片格式 浏览:639
服务器拔掉raid卡怎么装系统 浏览:234
区域对称加密算法 浏览:247
数字转汉字php 浏览:735