python十角星_使用 Python 绘制《星战》词云

2023-11-14

作者介绍

Rafael Schultze-Kraft

“前神经科学家,数据挖掘及机器学习的狂热爱好者,Python 的狂热粉丝”

使用 Python 绘制《星战》词云

当前我们在 Jupyter Notebook 中推进的是一个有趣的小项目,它的目标是将星球大战中的角色可视化为词云 —— 也就是说,从星战系列 1-6 部中的角色台词出发,找到最能刻画他们的人物特征的词语。

因此,我爬取了星战系列 1-6 部的电影剧本,提取出星战中每个角色的台词内容,并经过进一步的加工处理,对每一个人物角色进行词云可视化。

本文介绍了一些基本的数据科学概念,演示了一些 Python 库的使用,包括了爬虫库(requests 和 beautifulSoup)、自然语言处理库(NLTK、string 和 re)、词云库(Andreas Muller 的 wordcloud),以及可视化库(matplotlib)。

电影剧本的数据来源是 IMSDb(该数据库仅可用于教育目的)。

你能在我的 GitHub(https://github.com/neocortex/mining-star-wars) 上找到本文的所有代码。其实,我早在 2016 年的 EuroPython 大会上分享过此项目实例。

让我们开始着手做吧!

(下面的第一条代码纯粹是为了避免在 notebook 输出时出现警告内容,影响美观)

导入必备模块

首先,我们需要导入一些后文中一定会用到的库。正如前文所说,为了爬取包含电影剧本的 HTML 页面,我会结合使用 requests 和 BeautifulSoup,requests 用来发起 HTTP 请求,而 BeautifulSoup 用来解析 HTML 页面,并提取出我们想要的内容。另外,我们还需要导入一些辅助性的库(比如 collections),用来处理字符的库(re、string 和 nltk),用来画图的 matplotlib 库,以及用来生成词云的 wordcloud 库。

数据来源

正如前文中提到的,我会把 IMDSb (http://www.imsdb.com/ )作为我们的数据源。下面我将建立一个字典,用来存储星战系列电影名称及其对应的数据库链接。

抓取数据

星战系列之四 —— 新希望

我会按照电影上映的日期来进行爬取,因此我首先爬取星战系列中的第四部。我们只需要简单地构造一个包含目标链接的 GET 请求,就可以得到电影剧本了。得到的响应内容则会被转换为一个 BeautifulSoup 对象。

HTML 页面源码混合了文本、标签、JavaScript 脚本等内容。幸运的是,BeautifulSoup 能帮助我们解析这些 HTML 页面,从而取得我们想要的文本信息。 因此,为了得到电影中每个人物的台词,我们需要查看 HTML 的结构,看看怎样才能提取出我们所需要的内容。下图是星战第四部剧本的部分 HTML 页面截图。

在快速查看 HTML 源码后,我发现,嵌入了人物名称(比如 THREEPIO)的 标签下紧跟着的便是对应人物的台词内容。然而,我发现,人物对话发生的位置场景描述(比如,INT. REBEL BLOCKADE RUNNER)也以同样的结构被放在了 HTML 源码中。两者的区别在于,包含人物名称的 标签缩进得更多(实际上确切来说,缩进了 37 个空格)。因此,我采用的爬取方式是遍历 soup 中的所有 标签,并且检查该 标签是否至少缩进了 37 个空格(否则该 标签下的文本内容应该是位置场景描述),若是的话,我们便只需要提取出该 标签的闭合标签后紧跟的文本内容,就能得到人物台词了。

最后,我遍历了对话的每一行(直至遇到空行),由于以 “(” 开头的句子是描述性的内容,和对话中的人物台词无关,所以我还需要过滤掉它们。

听起来好像有点复杂,但实际上真的挺简单的。代码如下:

爬取出来的结果是以字典格式存储的,形如,{角色名称:台词}。这能让我们得到星战四中台词数排名前十的人物角色:

下面给出字典中一个角色(Darth Vader)台词的示例:

目前一切都进展得很顺利!让我们接下来看看星战五的情况:

星战系列之五 —— 帝国反击战

系列之五的爬取和上面的爬取方法基本一致,唯一的区别在于,位置场景描述和人物角色对话处的 标签的缩进数,与第四部中的不一样。在第五部中,没有用空格缩进,而是用 tab 来缩进的。除此之外,对话的提取方法和上文是完全一致的。

第五部中台词数排名前十的人物角色是:

让我们再来看看星战系列之六的情况。

星战系列之六 —— 绝地归来

在《绝地归来》中,提取对话的方式和之前几部的有些不一样。同样地, 标签之间既包含了角色对话,也包含了对位置场景的描述。然而,区分两者的方式发生了变化:位置场景描述的前面多了一个数字(对话格式依然保持不变)。

因此,我们可以简单地遍历所有 标签,检查其中嵌套的文本内容是否始于数字,如果不是始于数字,则表明该内容是角色名称,那么接下来的步骤和前面几部的是一样的。

星战系列之一 —— 幽灵的威胁

星战一的文本提取方法与之前的方法不同。通过查看 HTML 源码,我们发现了剧本内容被写入了

 标签中。因此,第一步就是把这些内容提取出来。

我们需要遍历上面提取出来的

 节点的所有孩子节点,才能提取出对话内容。通过识别双换行符 \n\n 来拆分文本,我们可以得到这些孩子节点中的文本所包含的每个段落。

另外,角色名称后面跟着一个冒号表示这是一段对话,因此,如果我们利用冒号对文本段落再次进行拆分,若分裂出来的只有一个部分,则我们可以认为该段落不属于对话。最后,为了确保当前行是一段对话,我们还需要检查拆分出来的第一部分是否是大写的(即角色名称),并且移除括号里的文本。

星战系列之二 —— 克隆人的进攻

《克隆人的进攻》的对话提取方法和星战五的方法相似。我再次遍历所有 标签,并确保文本缩进长度等于 4。基于此,对于 标签的闭合标签后的内容的每一行,我还检查了其缩进数是否正好为 3,这些判断确保了该行的确属于对话内容(而不是其他剧本内容)。 注:这些提取特点都能通过查看 HTML 源码得知。

星战系列之三 —— 西斯的复仇

已经到了最后一部啦!在查看 HTML 源码后,对话文本的提取在这里开始变得相当简单:我们简单地遍历

标签下的每一行(使用双换行符 \n\n 来拆分文本)—— 如果该行包含一个冒号,并且拆分出来的第一部分是大写的,则当前行即为对话文本...以上便是我们所需要完成的步骤。

合并分析

我们已经得到了从每部剧集中提取出来的对话内容,接下来,我们会将这些对话内容整合到单个字典中。老实说,我们可以从一开始就使用单个字典来存储这些剧集中的对话内容。我没有这样做的原因在于,考虑到有人可能想要分析这些剧集之间的关系。

最后,我们列出了对话中台词数排名前 100 的角色名称:

细心的读者可能会发现,实际上属于同一角色的台词条目,却被划分给了“多个”角色,比如,“BEN” 和 “BEN'S VOICE”,以及 “PADM\xc9” 和 “PADME”。因此,接下来,我定义了一个函数,将这些台词条目合并给同一个角色。并且我决定将系列一至系列三中的 OBI-WAN,和系列四至系列六中的 BEN 当成两个独立的角色。

同样地,通过对各角色在所有剧集中的台词总数进行排序,我们能得到排名前 20 的角色:

进一步的文本预处理

为了对文本进行进一步的预处理,以及生成词云,我选取了下面存在感比较强的角色:

停止词

下一步我们需要做的是,移除提取出来的文本中的停止词。为了达到目的,我使用三个不同的停止词词源:其中两个是我用谷歌搜索到的英文停止词词源,剩下的那个是 Python 的 NLTK 库(http://www.nltk.org/)自带的停止词词库。

清洗文本

文本的清洗步骤如下:移除标点符号

给角色名称添加标点符号(例如,“r2 d2” 应该被识别为 “r2-d2”)

移除特殊的字符,比如 tab 和换行符

移除停止词,并把文本拆分成单词列表

让我们看看经清洗后的文本长什么样子(以 Darth Vader 为例):

词云

是时候生成词云了! 为了达到目的,对于 cleaned 字典中的每个角色而言,我们需要先计算其对应的每个单词的词频(使用 collections库中的 Counter),然后将结果输入到 wordcloud 库中(这就和用单词、频率列表来实例化 WordCloud 类一样简单 —— 事实上,你还可以使用纯文本)。我们接下来会使用 matplotlib 库来展现词云。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python十角星_使用 Python 绘制《星战》词云 的相关文章

  • cv2.error: OpenCV(4.6.0) /io/opencv/modules/imgcodecs/src/grfmt_exr.cpp:103: error

    问题描述 cv2 error OpenCV 4 6 0 io opencv modules imgcodecs src grfmt exr cpp 103 error 213 The function feature is not impl
  • 数据库服务器配置参数修改,数据库服务器参数配置

    数据库服务器参数配置 内容精选 换一换 云搜索服务 Cloud Search Service 为用户提供结构化 非结构化文本的多条件检索 统计 报表 本章节介绍如何通过CDM将本地Elasticsearch整库迁移到云搜索服务中 流程如下
  • 如何在GitHub的repository中建立文件夹

    GitHub的repository无法直接建立文件夹 需要曲线建立 第一步 创建新的repository 若已有repository可直接将其打开 第二步 在repository界面右上角选择创建新文件 create new files 不
  • 费曼技巧学习笔记

    博主狂言 技巧正文 技巧的详细步骤 技巧步骤一 技巧步骤二 技巧步骤三 技巧的提纲总结 费曼技巧可以解决的问题 费曼技巧的另一种描述四步学习法 步骤一 步骤二 步骤三 步骤四 博主读后感 博主狂言 初识费曼技巧 甚是熟悉 博主自认有那么一点
  • 基于Springboot实现Kafka消费数据

    本文介绍使用Kafka监听和订阅两种不同方式进行数据消费 1 配置文件 spring kafka bootstrap servers 192 168 1 16 9092 消费者 consumer group id alarmService
  • MySQL check table/optimize table/analyze table/REPAIR TABLE

    check table 检查InnoDB和MyIsam是否有错误 检查表或者视图是否存在错误 对 MyISAM 和 InnoDB 存储引擎的表有作用 对于 MyISAM 存储引擎的表进行表检查 也会同时更新关键字统计数据 CHECK TAB
  • 《ios零基础教程》-- ”Mac OS X的介绍”和一些“基础语法” 2014-3-18总结

    一 学前须知 讲的ios和c语言的一些发展历史 作为了解即可 二 Mac OS X简单介绍 讲的是对苹果电脑的一些操作和基础了解 感觉蛮有用的 以前都是用的windows 突然用这种高富帅装备 还真不习惯 装个软件都费劲 看了这个之后 对m
  • 1 Centos7安装(jdk8)Tomcat9并设置为开机启动

    一 安装过程 cd usr local src wget http mirrors hust edu cn apache tomcat tomcat 9 v9 0 12 bin apache tomcat 9 0 12 tar gz 可以下
  • 面试余额宝Java技术岗(1-4面题目):GC+spring+二叉树+Dubbo+线上调优+​​​​数据库索引+mq

    余额宝一面 JVM 内存分哪几个区 每个区的作用是什么 JVM有哪些回收算法 对应的收集器有哪些 GC 的两种判定方法 CMS 收集器与 G1 收集器的特点 hashmap源码问题 HashMap HashMap如何保证线程安全 Concu
  • Aix6.1下安装SWFTools

    该文章参考http tech sxinfo net jctj article do curMenu 14 childMenu 16 articleId 388 再结合我在实际上在Aix6 1上的安装经验来编写 相关文件的下载 ftp ftp
  • Linux 同步工具rsync 文件目录同步,增量备份的手段之一

    一 rsync介绍 rsync是linux系统下的数据镜像备份工具 使用快速增量备份工具Remote Sync可以远程同步 支持本地复制 或者与其他SSH rsync主机同步 它的特性如下 可以镜像保存整个目录树和文件系统 可以很容易做到保
  • 工具类库系列(十四)-FileData

    第十四个工具类 FileData 用于文本文件读取 保存 以及在内存中修改文本文件内容 读取 ifstream 保存 ofstream 修改内容 以string类型 获取 设置 文本文件内容 最大支持文件大小1M 上代码 FileData
  • 【多线程】线程安全、锁的同步和异步

    一 基本概念 线程安全 当多个线程访问某一个类 对象或方法 时 这个类始终都能表现出正确的行为 那么这个类 对象或方法 就是线程安全的 非线程安全 非线程主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改 值不同步的情况
  • cmake:foreach、endforeach

    foreach 为列表中的每个值计算一组命令 foreach
  • python 数据可视化- 地图

    import json from pyecharts charts import Map from pyecharts options import 读取数据文件 f open D 桌面 python 资料 可视化案例数据 地图数据 疫情
  • JWT安全

    文章目录 JWT是什么 为什么要使用JWT JWT的数据结构 JWT的工作过程 JWT是什么 JSON Web Token JWT 是一个开放标准 RFC 7519 它定义了一种紧凑的 自包含的方式 用于作为JSON对象在各方之间安全地传输
  • Markdown 常用语法汇总

    前言 Markdown 作为一种标记语言 本质上与HTML等无异 都是通过特定的语法 再经过渲染 才能呈现出最终效果 因为程序对 Markdown 语法的支持程度不同 故部分程序中可能无法使用一些较新的语法规则 本文将其常用的语法进行了汇总
  • k8s基础-kubectl node-shell 登录节点

    通过kubectl node shell可以直接登录任意节点主机 weops root node201 helm curl LO https github com kvaps kubectl node shell raw master ku
  • 抖音小程序分享 onShareAppMessage 例子

    onShareAppMessage function res let that this return desc title title 必须以 开头 path pages news detail id that data id 软件目录

随机推荐

  • word参考文献格式设置(国标下载)

    国标GBT7114免费下载查看第二步 1 设置国标GB格式 Word顶端 的 EndNote X7 选项卡 Bibliography 区域 Style 选择 Chinese Std GBT7714 Author Year 或 Chinese
  • matlab求传递函数在某个频率点的增益_了解一阶高通滤波器传递函数

    简要回顾一下 通过对S域电路的分析 可以得到低通滤波器的输入输出特性表达式 电路的VOUT VIN表达式是滤波器的传递函数 如果将该表达式与标准化形式进行比较 可以快速确定两个关键参数 即截止频率和最大增益 传递函数可以写成分子多项式除以分
  • CSS实现圣杯布局(双飞翼布局)的四种方式

    calc 函数 calc 函数用于动态计算长度值 需要注意的是 运算符前后都需要保留一个空格 例如 width calc 100 10px 任何长度值 都可以使用calc 函数进行计算 calc 函数支持 运算 calc 函数使用 标准的数
  • Elasticsearch的路由(Routing)特性

    Elasticsearch路由机制介绍 Elasticsearch的路由机制与其分片机制有着直接的关系 Elasticsearch的路由机制即是通过哈希算法 将具有相同哈希值的文档放置到同一个主分片中 这个和通过哈希算法来进行负载均衡几乎是
  • Edge官方鼠标手势

    前言 日期 2023年8月 Edge浏览器目前已自带官方的鼠标手势功能 若要使用首先将浏览器更新至最新版 下文介绍使用方法 官方鼠标手势 前提 更新Edge至最新版 并关闭其它鼠标手势扩展 开启鼠标手势 打开Edge浏览器的设置 找到外观
  • springBoot 集成knife4j

    1 导入依赖
  • 小白头一回装CentOS 7系统,遇到的相关问题解决方案

    我是按照这个链接的百度经验进行安装的 U盘安装win8 win7 centos7双系统 http jingyan baidu com article 1709ad80b28cf74634c4f0d5 html 不过在安装过程中遇到一些问题
  • 多示例学习python_python遥感图像裁剪成深度学习样本_支持多波段

    前言 如果将图像直接输入到深度学习网络中 会导致内存溢出 因此需要将图像裁剪成图像块输入到网络中 裁剪方法包括规则格网裁剪和滑动窗口裁剪以及随机裁剪 规则格网裁剪 滑动窗口裁剪 随机裁剪 正文 规则格网裁剪属于重复率为0的滑动窗口裁剪 滑动
  • 变分贝叶斯(Variational Bayes)

    此文公式图片不全 详见博客 http www blog huajh7 com variational bayes 关键字 平均场理论 变分法 贝叶斯推断 EM算法 KL散度 变分估计 变分消息传递 引言 从贝叶斯推断说起 Question
  • C语言图形颜色编程

    1 颜色 法一 定义改变文字的颜色 int color int num num为每一种颜色所代表的数字 范围是0 15 SetConsoleTextAttribute是设置控制台窗口字体颜色和背景色的函数 GetStdHandle是获得输入
  • 全链路自动化测试

    背景 从 SOA 架构到现在大行其道的微服务架构 系统越拆越小 整体架构的复杂度也是直线上升 我们一直老生常谈的微服务架构下的技术难点及解决方案也日渐成熟 包括典型的数据一致性 系统调用带来的一致性问题 还是跨节点跨机房复制带来的一致性问题
  • 区块链赋能供应链金融

    点击观看大咖分享 小微企业 融资难 的诸多痛点 供应链金融的起源或者说初衷 是为了解决产业链上大量的小微企业 融资难 的诸多痛点 对于小微企业 它们在经营 发展的过程中是存在很多问题和困难的 比如小微企业信用状况差 金融资产获取困难 信息非
  • Springboot2.X 集成 Sharding-JDBC3.X

    之前的项目中集成了springboot2 x dangdang sharding jdbc 1 5 4 1 pom依赖
  • Error running tomcat7 Address localhost:1099 is already in use 错误解决

    在IDEA上运行web项目时报错 Error running 项目名 Address localhost 1099 is already in useTOC 第一步 按照Windows R键 输入cmd命令运行 第二步 按下回车键后进入界面
  • Unity按钮/button样式切换(非代码)

    Unity按钮 button样式切换 非代码 演示 创建一个Button 修改其的transition属性为Sprite Swap Source Image为默认情况下的button图片样式 Highlighted Sprite为鼠标进入b
  • 【NodeJS】nodejs

    1 安装指定版本 6 14是具体的版本号 npm install npm 6 14 g 2 安装最新版本 npm install g npm
  • 菜鸟仓库

    菜鸟仓库是一个很大很神奇的地方 各种琳琅满目的商品整整齐齐地摆放在一排排货架上 通常一种品类的商品会放置在货架的某一个格子中 格子设有统一的编号 方便工人们挑选 有一天沐哲取菜鸟仓库参观 无意中发现第1个货架格子编码为1 第2 3个分别为1
  • 机器学习决策树模型MATLAB

    主函数 clc clear all 西瓜数据集 data 青绿 蜷缩 浊响 清晰 凹陷 硬滑 是 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 是 乌黑 蜷缩 浊响 清晰 凹陷 硬滑 是 青绿 蜷缩 沉闷 清晰 凹陷 硬滑 是 浅白 蜷缩 浊响 清晰
  • JAVA (11) date

    一 Date类 定义 java util Date 表示日期和时间的类 类 Date 表示特定的瞬间 精确到毫秒 毫秒 千分之一秒 1000毫秒 1秒 该类的时间原点 1970年1月1日 00 00 00 1 构造 实例代码 Date类的空
  • python十角星_使用 Python 绘制《星战》词云

    作者介绍 Rafael Schultze Kraft 前神经科学家 数据挖掘及机器学习的狂热爱好者 Python 的狂热粉丝 使用 Python 绘制 星战 词云 当前我们在 Jupyter Notebook 中推进的是一个有趣的小项目 它