《生活大爆炸》(英文:The Big Bang Theory 简称:TBBT)广受喜爱(据说还可以练听力练口语blabla),去年随着第12季的播出而完结,最近也算是在补。有一天闲聊的时候偶然冒出来一个点子,就是利用词云来将大爆炸台词中的高频词汇可视化一下,也是一个有趣的练习。
简单来说我们的任务分为两部分,第一部分是获取台词数据,第二部分是生成词云和其他NLP分析。
目录
获取数据
数据源
首先我找到的台词数据来自于该网站,这是一位国外网友自己写了台词,并放到了自己用wordpress建的站上,目前更新到了第10季(看修改日期发现最后一个网页是在一年前更新的),有喜欢TBBT并欣赏他的工作的朋友可以去捐赠一下。
选择英文台词的原因是该剧本身台词就是英文为主,我看到的中文翻译是由YYeTs字幕组翻译的,信达雅,笑点也十分接地气,不过毕竟还是不如原文的“高频词”更有意义些。
网页分析
在谷歌浏览器中按F12使用“检查”功能,可以观察我们要爬取的网站的各项元素和它们的信息。
首先我们发现,每一季每一集的台词分别保存在各自的网页中,因此我们需要爬取多个网页,而这些网页的url都可以直接从robots.txt里的sitemap.xml里取即可(我们写爬虫时最好遵循robots.txt中所写的爬取该网站的建议,不过目前这个网站似乎并没有什么限制);
接着分析每个包含独立内容的网页中,该网站不仅包含了台词,就像剧本一样,它还包括了用斜体表示的场景信息和动作信息等,这些信息通常在台词所在标签对应的<em>标签或<i标签>下,而这部分信息我们其实是不需要的,我们可以根据这一特点只提取台词信息。注意所有台词都在<div class="entrytext">标签下,而每集又有所不同,我们发现台词的保存分为两类:
那么最后我们可以先将每集的台词独立保存,到时候只需要把对应部分的拼起来即可组成全部的台词。
编写爬虫
第一步,先利用sitemap.xml获取所有需要爬取的网页的url。这里我们先尝试使用传统的xml库中的ElementTree库来解析xml内容,通常对于一个本地文件,可以用parse方法来解析,而对于一个字符串,则可以用fromstring方法来解析,之后通过循环索引的方式获取深藏在xml中的可爬取url。
import urllib.request
import xml.etree.ElementTree as ET
response = urllib.request.urlopen(sitemap)
xml = response.read()
root = ET.fromstring(xml) # 从parse中读出来的是tree,从fromstring中读出来的是root
urls = [child[0].text for child in root] # 遍历root的子树并提取第一个子节点的文本内容
urls = urls[0:-3] # 最后三个不是剧集的台词页面,而是网站的介绍页面,因此去掉
第二步,分别爬取每一集的网页并获取信息。这一步我们使用lxml库,它和传统的xml中的ElementTree库同样都是用来解析xml文档的&