刮,分析和可视化哈利·波特粉丝小说

当我还是个孩子的时候,我真的很喜欢哈利·波特 。 没关系,您可能正在想半个世界也是如此! 我不认为我的故事是独特的-我长大后用一根魔杖挥舞着筷子,在驶过的汽车上向窗外大喊Expecto Patronum ,与我的朋友们一起打扮成伏地魔的午夜电影放映,并制作魁地奇篮球从地下室的PVC管和呼啦圈中脱颖而出。 但是,如果我不读粉丝小说,就无法完全解释我对这个系列的喜爱程度,而我既阅读又写作。

我和我的朋友在玩魁地奇(Quidditch),2009年。请不要放大。

自从我的粉丝小说时代以来已经有一段时间了,而自上一本《哈利·波特》出版以来已经有一段时间了。 从那时起,我觉得我已经成熟了一些。 我上了大学,攻读工程专业,有人乐意雇用我,现在我经常写代码。 我还开始阅读可以说更复杂的东西,例如《纽约时报》 ,在那里我欣赏了远方的可视化效果。 但是后来我想,嘿,我也编码了-也许我可以像这样进行可视化。

因此,我着手学习d3.js,这是一个JavaScript库,我曾听过有关它的谣言和传说,并且为纽约时报的许多可视化提供了动力。 我还需要一个主题-一个很有趣的图形,未来几天我都不会盯着它的数据。 然后,我听到了我一连串的《哈利波特》随身装备呼唤我,一个前几年为我制作的《哈利波特》木偶戏恳求我。

我在祖父母的卧室里拍摄的照片,2011年,由于我堂兄的photoshop技术而变得不祥

最后,我学习了如何构建网络抓取工具,处理数据以及使用d3.js制作七个图表,目的是展示粉丝小说在一个月内的重要性。

要立即查看所有图表和我的分析,请看一下我在这里的文章。 要仅查看图形及其代码,请查看我的块。 要查看所有代码,包括抓取,操作和可视化,请访问GitHub存储库。 在本文中,我将介绍我所进行的所有过程,并希望为您提供帮助:

  • 七个互动图
  • 数据收集,清理,操作和可视化的演练
  • 学习d3的一些技巧
  • 哈利·波特的怀旧之情
  • 对粉丝小说的欣赏
  • 温暖,神奇的感觉

刮ing

即使我的主要目标是学习d3,我也需要从一些数据开始(毕竟d3代表数据驱动文档!)。 我青少年时期经常光顾的网站是FanFiction.net,因此这似乎是一个不错的起点。 我以前从未构建过Web抓取工具,但是仅通过遵循一些BeautifulSoup教程就可以快速启动并运行它。 我是用Python编写的,这是一种初学者,具有一定的背景知识。总而言之,我花了大约一周的时间才完全抓取560,000个哈利波特粉丝小说的元数据并将其存储到一个184MB JSON文件中。 那个星期大概是这样分解的:

  • 周末花费在FanFiction.net的一两页上来构建和测试刮板
  • 让刮板运行整整两天,然后下班回来,发现在某些异常情况下,FanFiction.net上的HTML格式不正确。 FanFiction.net的服务条款要求您加载的服务器负荷不超过人类的负担,因此我让它每隔五秒抓取一个索引页(25层),然后继续进行下一页。
  • 让刮板运行一整天,这次倒退了。 这样,我不必检查何时到达最后一页(现在最后一页始终是第1页),这样我就不会错过在我的刮板运行时发布的故事。 下班回来后发现一个故事没有作者ID,为此做了一个抓捕声明,然后再次运行了抓取器,将睡眠时间降低到2秒。
  • 让刮板运行整整两天,生成了所需的JSON文件!

该JSON文件包含有关所有故事的元数据。 这是FanFiction.net上的《哈利·波特》粉丝小说的索引页:

FanFiction.net上的样本索引页面

我保存了这些内容摘要中的所有可用数据。 最终,我得到的数据是:

  • 标题
  • 作者
  • 评分(K,T,M等,以反映《 Fic》的目标受众的成熟程度)
  • 语言
  • 类型
  • 字数
  • 评论数
  • 收藏数量
  • 跟随数
  • 最近更新的时间戳
  • 发布时间戳
  • 角色标签

最让我感到惊讶和兴奋的是,《哈利·波特》迷小说社区仍然非常活跃。 即使在测试刮板时,我也发现数据在变化-人们每小时大约在更新或发布新故事!

清洁和操作

现在,我所有的数据都存储在一个相当大的JSON文件中,我意识到在投入可视化之前还需要采取另外的步骤。 如果我希望人们查看我的图表并有一个合理的经验,那么就不能期望他们的客户端每次都下载将近200MB的JSON文件,然后等待我的JavaScript仅解析每个图表所需的内容。 我开始使用Python和pandas库来筛选出每个图形所需的数据。 然后,当然,我需要知道每个图形的含义。 在这方面有很多来回操作-我将操纵数据,将其可视化,意识到结果图无用,返回并操纵数据,再次使其可视化,然后重复。 最后,我将大型JSON文件转换为的数据文件如下所示:

  • 特定日期发布的有关特定角色的粉丝小说数量的CSV文件
  • 粉丝小说中人物被标记次数的计数
  • 标题中使用的字数
  • 同时出现矩阵,用于同时出现两个字符
  • 流行字符之间的链接和节点的JSON

共现矩阵的熊猫数据框

可视化

最后,可视化! 我查找了学习d3的方法,最终发现最适合我的是:

  • 阅读Scott Murray的d3教程-这个家伙很有趣! 一切都非常清楚地解释了。 我有大量的HTML / CSS / JS背景,但我认为即使对于背景很少的人也很不错。 另外,请务必阅读他关于过渡的演讲。
  • 尝试制作一些您真正感兴趣的条形图或散点图。Scott涵盖了条形图,看到您关心的数据图非常有帮助。
  • 进行一些愚蠢的过渡。 我没有理由为我制作的第一张图可以更改颜色以匹配不同的房屋(格兰芬多为红色/金色,拉文克劳为蓝色/青铜色),只是我想尝试一下,它将使您熟悉输入/ update / exit范例
  • 阅读并慢慢地走过一些街区,尤其是创作者本人。

我进行的第一个可视化是散布在某一天发布的有关某个人物的同人小说的散点图。 网站上仍然存在第一本粉丝小说,我想看看是什么事件使人们写了粉丝小说,并且要做到这一点,我需要收集与哈利·波特有关的历史上的重要事件,例如每本书出版的时间,发行的每部电影,当JK罗琳(JK Rowling)发布公告等时,我都开始尝试为每个角色加载所有发布日期,但是这仍然太大了,导致用户稍等片刻。

第一次尝试散点图-加载时间慢,缩放/转换时间慢,难以看清的事件

我从出版日到出版周结束,然后筛选出我认为很有趣的字符。 我还将最初与当天写的小说数量相对应的雷电事件移到了更高的位置,从而更加明显。 最初,我自己绘制了SVG闪电形状。 然后,我决定将书籍出版活动的日期更改为书籍图标,将电影发行的日期更改为电影卷轴,两者均使用了FontAwesome库-该库也具有闪电形状!

最终,该图如下所示:

1999-2017年间有关哈利·波特角色的粉丝小说数量。 鼠标悬停在HP7 part 2电影发行时的电影真实图标上。

该图使用户可以将鼠标悬停在事件上,并查看它们是否对应于峰值。 这些峰值大多数都可以预测,每个电影/书籍发行日期之后都会出现峰值。 如果我们切换到不同的角色,我们经常会看到不同的峰值-例如,小天狼星在第5本书之后就有一个,而斯内普也很奇怪,在电影中扮演他的演员艾伦·里克曼去世之后。

筛选使用Snape标签的fics时放大2016年的峰值

现在我们开始看到小说与现实之间的界线模糊-可以理解的是,天狼星的粉丝小说在小天狼星在书中去世后飙升,但是对于斯内普的粉丝小说来说,在现实生活中的演员去世后上升是不同的。 也许它显示了艾伦·里克曼(Alan Rickman)的表演能力,可以彻底模糊他和他扮演的角色之间的界限-也许它可以显示歌迷小说背后的潜在治愈力-转变为迷恋者并将悲伤转化为艺术的能力。

我想认为以后的图表比较整洁。 这是哈利·波特(Harry Potter)最初的七本书中前50个最受关注的角色中的性别分布之一:

JK罗琳著作中前50名最受关注的哈利波特角色的性别分布

对象不变性有一个过渡,当我们查看在粉丝小说中标记角色的频率时,可让您看到角色的受欢迎程度上下波动。 这是该过渡的最终产品:

粉丝小说中鼠标悬停在莉莉·波特上的前50个标记最多的角色的性别分布

将鼠标悬停在一个条形上,让我们看看该字符从上一张图如何变为该图。 在这种情况下,莉莉·波特(Lily Potter)从不在50个最受关注的角色中脱颖而出,成为HP粉丝小说中有关角色的第7个最受关注的人物。 当我们从经典到幻想小说时,我们还发现女性角色的数量(以金条表示)明显增加。 多数读/写同人小说的人很可能会认出是女性,所以也许这只是写您所知道的情况,但也许我们也看到同人小说填补了经典中的空白。 尽管有一些坚强的女性角色,但《 哈利·波特》还是一个男性主导的故事。 我们在这里看到,粉丝小说可以展现主流媒体所没有听到的声音。

这使我进入了关于斜线小说的下一张图表。 斜线小说或将两个相同性别的角色配对在一起的小说在粉丝小说社区中享有一定声誉。 同性恋角色和女性角色一样,在主流小说中的代表性也不足,但在狂热小说中却很受欢迎。 由于仅使用元数据,并且没有太多自然语言处理背景,所以我决定为同名的佳能关系以及同志和最喜欢的粉丝关系制作一个粉丝小说标题的词云。

粉丝小说标题的词云被标记为关于罗恩和赫敏-鼠标悬停在“韦斯莱”上

粉丝小说标题的词云被标记为与小天狼星和卢平老鼠悬停在“巧克力”上

在此图中,将鼠标悬停在一个单词上,可以看到三个随机选择的标题,其中包含该单词。 如果比较这些图,您会发现它们看起来非常相似。 每个角色名称以及他们的朋友都有一个大字(对于Romione是“ Harry”和“ Potter”,对于Wolfstar是“ Marauders”),对于“ Christmas”(ABC可能与此有关) )。 当然,两者之间是有区别的-沃尔夫斯塔的影迷小说似乎经常有“巧克力”和“月亮”两个字眼,是指卢平曾为哈利提供过一次巧克力,而他是狼人,但两张图片中最大的字眼是“爱”。 毕竟,爱就是爱,无论您是同龄人中最聪明的女巫,还是被判入狱十三年,都可以变成狗。

同现矩阵-鼠标悬停在Harry x Draco上

我制作了这个共现矩阵,以形象地展现粉丝小说中角色之间的相互关系。 较暗的细胞表示更多同时出现。 矩阵的局限性在于它可以向我们显示的内容。 尽管较暗的图块似乎表明存在更深的关系,但仔细检查后发现,较暗的图块往往属于较次要的角色,这些角色在佳能中没有得到足够的发展,因此大多与一个角色相关(例如,Astoria Greengrass和Draco Malfoy,James和莉莉(Lily),罗斯·韦斯莱(Rose Weasley)和天蝎座马尔福(Scorpius Malfoy)(如果包括“ 诅咒的孩子” )。 有趣的是,这似乎也适用于罗恩·赫敏,尽管两者都被认为是非常主要的角色。 罗恩(Ron)的人气也落在了先前的条形图中-也许粉丝将他视为一个相对边缘的人物?

最后一个图是实际的图,其中包含节点和链接以及所有内容!

角色关系图-鼠标悬停在Harry上

此图显示了前15个最受欢迎的字符及其前5个同时出现的情况。 有些角色比其他角色更相关-例如,哈利非常相关,而查理·韦斯莱(Charlie Weasley)(位于左侧)只是在图中,因为他是Nymphadora Tonks的前五位关系之一。 该图很自然地被划分为集团-掠夺者一代在左上角,下一代在右下角,Harry在中间。

中间附近的灰色圆圈特别有趣-在哈利·波特系列的男女主角哈利和赫敏之后,原始角色是最相互联系的角色。 粉丝创建了自己的角色,以便与从Marauder时代到下一代,再到小汤姆·里德尔(Tom Riddle Jr)的粉丝们的各个角落融合在一起。通过创作原创角色,作者进行了同情演练-在这种情况下自我插入小说,他们想知道如何处理哈利·波特宇宙中的情况,对于与作者分开的角色,他们想知道这种人如何适应。例如,通过将生活充实为经典中的小人物,读者可以与作者进行对话。

粉丝小说的力量

总体而言,我踏上了学习如何制作整洁的可视化图像的旅程。 我当然学到了东西! 仍然有大量的知识要学习d3以及如何使d3可视化。 我想一个好的可视化工具可以让您同时探索,发现和教导一些东西。 我不确定从结果图中会发现或学到什么,但是我想我是通过说粉丝小说填补了通常留为空白的空间来总结我的发现的。

当作者发表故事时会发生什么? 故事向经常被这些故事改变的读者讲。 他们可能会联系作者并让他们知道,但除此之外,故事的影响常常会消失。 在《哈利·波特》中,我们长大了一个故事,该故事讲述了遵循JK罗琳的信仰的宽容和爱的主题。 小说的独特之处在于它的个人主义-您看不到一个人创作的轰动一时的电影,也很少看到同一位艺术家创作,创作和演唱的歌曲。

尽管JK Rowling可以分享一些主题,但没有空间讨论这些主题的呈现方式,无论是与粉丝还是与共同创作者。 因此,尽管哈利·波特(Harry Potter)拥有一些坚强的女性角色,一些有色人种,并且在同性恋角色这一事实之后被揭示出来,但JK罗琳(JK Rowling)最终仅是一个拥有直白白人女性经验的人。 本着让已被喜爱的故事变得更好和更具代表性的精神,粉丝们插入了自己的经历,这样,也许我们实现的故事比原始故事更好,或者至少比人类更具代表性。 对我来说,那是很神奇的。