大数据文摘出品

作者:王烨

文摘菌记得小时候看《哈利·波特》小说的时候,最难记住的就是那些音译的名字,又长又多,最后只能关注那几个主要人物,跟着主要剧情一路过去,当个爽文看完了。

这就导致一些边缘人物根本没关注到,也错过了J·K·罗琳埋下的许多小伏笔。

比如卢娜与韦斯莱其实是邻居关系,这个在《火焰杯》中众人出发去世界杯时有伏笔,但是很少有人第一遍看的时候能注意到。

大概是为了从一开始就厘清人物关系,Medium上一位博主Tomaz Bratanic开发了一个小项目,用Selenium结合SpaCy来创建一个Neo4j哈利·波特人物图谱,把《哈利·波特》第一部中所有的人物都纳入一张网络中,人物关系一目了然。

从图谱中我们似乎可以看到,三人小分队中,哈利和赫敏的直接连接很少,这两人出现时基本罗恩都在,而罗恩和赫敏二人却连接很多,这让人不禁联想,难道从第一部开始,J·K·罗琳就安排好了罗恩和赫敏的姻缘了?

制作一个这样的图谱需要5步,动手试试?

八卦的事情我们先放在一边,还是先来看看Tomaz Bratanic是如何制作这一图谱的。

总体来说,整个过程被分为了5步:

  • 爬取“哈利波特迷”网站数据

  • 书籍文本预处理

  • 基于 SpaCy 规则匹配的实体识别

  • 推断字符之间的关系

  • 将结果存储到 Neo4j 图形数据库中

作者将整个过程记录了一个Google Colab notebook,方便大家动手试试,链接如下:

https://github.com/tomasonjo/blogs/blob/master/harry_potter/HarryPotterNLP.ipynb

第一步,爬取“哈利波特迷”网站数据

“哈利波特迷”网站页面包含了第一本书中的人物列表,其中还包括了各个人物最初出现在哪一章,这可以帮助进一步消除字符的歧义,因此第一步就是去爬取“哈利波特迷”网站数据。

作者选择使用Selenium进行Web页面抓取,然后形成一个字符列表,其中包含人物最先出现的章节的信息,此外,每个角色都有一个网页,上面有关于角色的详细介绍。

例如,从赫敏·格兰杰的页面你可以观察到一个结构化的表格,其中包含了更多的信息,作者使用别名部分的实体提取然后添加其他字符细节,如家族和血型来丰富最后的人物图谱。

第二步,书籍文本预处理

由于文本中人物往往散布于文本的不同位置,其中涉及到的人物通常可以有多种不同的表达方式,例如某个语义关系中的实体可能是以代词形式(比如he和she)出现的,为了更准确且没有遗漏地从文本中抽取相关信息,必须要对文章中的指代现象进行消解。

在寻找合适的指代消解(Co-reference Resolution)模型时,作者考虑了NeuralCoref和AllenNLP,这两个模型都能提供指代消解功能。

但是在试用AllenNLP模型输入整个章节时,作者的内存不够,把一个章节分割成一个句子列表又运行得非常慢,所以作者最后还是使用了NeuralCoref,NeuralCoref很轻松地处理了整个章节,并且工作得更快。

准备好了文本,是时候从文本中提取提到的字符了。

第三步,基于SpaCy规则匹配的实体识别

作者一开始试了几个不同的命名实体识别(Named Entity Recognition,NER)模型,SpaCy、HuggingFace、Flair,甚至是 Stanford NLP。

但是这些模型都不能很好地满足我的要求。因此,作者决定使用SpaCy基于规则的模式匹配特性,而不是自己训练模型。

根据第一步从网站上搜集的数据,现在已经知道我们需要在寻找哪些角色,下面只需要找到一种方法,在文本中尽可能完美地匹配他们。

首先必须为每个字符定义文本模式。这需要添加全名作为我们正在寻找的模式,然后我们使用空格将名称分开,并创建一个模式,将这个,名字中的每个单词分开。举个例子,如果我们定义了matcher模式,我们最终会得到3个不同的文本模式来表示给定的字符:

  • 全名: 阿不思·邓不利多(Albus Dumbledore)

  • 名: 阿不思(Albus)

  • 姓: 邓布利多(Dumbledore)

当然,还会有许多特例,比如“天狼星布莱克”(Sirius Black),为了不将所有“黑色”(Black)和人物搞混,作者定义只有当“布莱克”是标题格式的,才会假设“小天狼星布莱克”被引用。

另外,还需要考虑当只提到姓时,如何匹配到正确的人,比如这句话,“Weasley, get over here!”,这里面的Weasley可能指向罗恩的任何一个兄弟姐妹,这时必须为实体消歧提出一个通用的解决方案。

第四步,推断字符之间的关系

解决了实体识别问题,其实就已经完成了整个工作中最难的部分。

推断角色之间的关系则非常简单,首先,需要定义相互作用的距离阈值或两个字符之间的关系。

作者将距离阈值定义为14,也就是说,如果两个字符在14个单词的距离内共同出现,那么我们假设它们一定是相互作用的。

此外,作者还合并了一些实体以避免扭曲结果,比如“哈利今天过得很愉快。他下午去找邓布利多谈话了。”

如果简单分析这句话,会让“哈利”和“邓布利多”发生两次互动,因此需要按照引用单个实体的相同字符的顺序合并实体,来解决重复统计的问题。

第五步,将结果存储到Neo4j图形数据库中

提取了字符之间的交互网络后,剩下的唯一工作就是将结果存储到图形数据库中。

导入查询非常简单,因为这里处理的是单向网络,如果使用的 是作者准备的Colab Notebook,那么创建一个免费的Neo4j Sandbox 或者免费的Aura数据库实例来存储结果将是最简单的。

最后,可视化结果,我们就能得到最终的人物关系图谱。

灵感来自《权利的游戏》人物图谱,下一步要分析哈利·波特宇宙

在文章中,作者表示,这一项目的灵感来源于此前Andrew Beveridge建立的《权利的游戏》人物图谱。

相比于《哈利·波特》,《权力的游戏》拥有更多的人物和剧情,生成的网络也更加复杂。

除了对整个1-8季进行分析,Andrew Beveridge还对每一季做了人物图谱分析,看看每一季中谁和谁是盟友,谁跟谁又是敌人。感兴趣的读者可以查看项目链接:

https://networkofthrones.wordpress.com/

相比而言,Tomaz Bratanic的《哈利·波特》人物图谱项目更容易上手,读者可以用第二部或第三部尝试这种方法,唯一需要稍微调整的是实体消除歧义过程。

《哈利·波特》人物图谱GitHub链接:

https://github.com/tomasonjo/blogs/blob/master/harry_potter/HarryPotterNLP.ipynb

Tomaz Bratanic表示,下一步他将着手整个哈利·波特宇宙的分析,将《神奇动物在哪里》的部分也囊括进去,感兴趣的小伙伴可以持续关注。

参考链接:

https://medium.com/neo4j/turn-a-harry-potter-book-into-a-knowledge-graph-ffc1c45afcc8

https://networkofthrones.wordpress.com/

https://harrypotter.fandom.com/wiki/Main_Page

亲手制作一个《哈利·波特》人物图谱,原来罗恩和赫敏的姻缘从第一部就已注定?...相关推荐

  1. 如何自己亲手制作一个防疫地图?

    总第192篇/张俊红 最近有几个小程序可以查询你周边小区新型冠状病毒的确诊人数情况,通过这个小程序你可以看到你周围疫情的情况,具体如下图所示: 这张图是怎么做出来的呢?我们可不可以自己做一个呢?是可以 ...

  2. 教你亲手制作一个虚拟数字人,超全步骤详解

    自计算机图形学问世以来,人们一直在尝试创造逼真的数字人类.直到最近,那些成功的人还必须投入数月甚至数年的时间.这是一个非常昂贵和耗时的过程,需要高技术知识和设备以及高超的艺术技巧.但随着MetaHum ...

  3. html5中怎么制作一个盒子,亲手制作一个折纸盒子超有成就感 这个教程超级简单的...

    简单的折纸盒子制作方法,可能你还没有掌握,那不要紧,我们就将一个怎么样制作简单折纸盒子的手工图解教程在这里分享给你,对于一个追求怎么样折叠一个简单的折纸盒子的你而言,这样的手工折纸收纳盒教程是适合你的 ...

  4. 使用残差网络resnet与WGAN制作一个生成二次元人物头像的GAN(pytorch)

    a GAN using Wasserstein loss and resnet to generate anime pics. 一个resnet-WGAN用于生成各种二次元头像(你也可以使用别的图像数 ...

  5. 制作一个简单的轮播图(详解新手教学)

    制作一个简单的轮播图(详解新手教学) 相信很多初学者,无论是前端还是后端,对于制作页面时,都想自己亲手制作一个轮播图. 如何制作一个轮播图: 基础知识:有HTML,Css,js基础 本文使用技术: H ...

  6. 计算机设计贺卡教案,制作一个多媒体贺卡教案设计

    [课题]制作一个多媒体贺卡 [课时]1课时 [教法]任务驱动.小组合作 [教学环境]多媒体网络教室 [教材分析] 本课以任务驱动的形式介绍了制作多媒体贺卡的全过程.本课综合了第3单元和第4单元的内容, ...

  7. 《哈利·波特:霍格沃茨之谜》邀请玩家为魔法世界的圣诞节装饰大厅

    12月6日至12日,粉丝可在"和霍格沃茨之谜一起过圣诞"活动中为最喜爱的假日装饰投票 --(美国商业资讯)--Jam City: 人物: Jam City 是一家位于洛杉矶的手机游 ...

  8. 《哈利·波特与死亡圣器(上)》BD中英双字无水印高清+1080P 720P蓝光地址

    ◎译 名 哈利·波特与死亡圣器(上)/哈利波特:死神的圣物1(港/台)/哈利·波特与死圣(上)/哈利·波特7 ◎片 名 Harry Potter and the Deathly Hallows Par ...

  9. max导出fbx设置_真3D虚拟偶像制作教程——虚拟偶像人物模型导出前的处理

    大家好,相信大家用DAZ3D做了一个虚拟形象,肯定不是为了一时释放脑中的意念和过过手瘾,在DAZ3D里摆摆POSE那么简单,看着自己辛辛苦苦给妹子整了个形,丰了个胸,塑了个腰,还是一个没有灵魂的木偶, ...

最新文章

  1. 关于MYSQL中like 检索汉字问题。
  2. RunTime 入门
  3. 【Mybatis 之应用篇】 5_Mybatis总结(附20道练习题以及答案)
  4. python 子线程coredump_python多线程备份mysql数据工具:mysqlpdump使用方法
  5. Maven项目中使用JUnit进行单元测试
  6. 论ACM ICPC_Ruins He
  7. 转--javascript 数组
  8. MySQL CookBook 学习笔记-01
  9. php学的是什么意思_为什么要学习PHP?到底什么是PHP?
  10. 阿里巴巴开源语音识别声学建模技术
  11. 按键精灵 android,按键精灵安卓版
  12. 电子元件识别 测量
  13. 常用颜色及RGB配色表
  14. Tesla又撞,能上天的马斯克,自动驾驶为何只有如此水准
  15. 快递是否签收,分享小技巧查询物流查看已签收件
  16. 服务器上挂网站怎么挂,网站怎样上挂到云服务器
  17. linux需要GPT初始化磁盘吗,PVE里面使用GPT初始化磁盘选项为灰色的解决办法
  18. 手把手教你在Github上建立自己的个人博客网站
  19. linux内核损坏的原因,Linux内核报错“General protection fault”原因
  20. 卸载“趋势科技防毒墙网络版客户机”方法之一

热门文章

  1. CAP in tns
  2. Atitit qzone qq空间博客自动点赞与评论工具的设计与实现
  3. 网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了
  4. mybatis学习笔记(13)-延迟加载
  5. 51CTO交流摘录(2):SOC的应用现状
  6. Chkconfig命令
  7. 2011年8月51CTO壁纸点评活动获奖名单【已结束】
  8. 大型软件公司.Net面试题(一)
  9. 著名IT公司名字来由
  10. python实现简单爬虫百度首页_python使用百度进行爬虫简单学习例子