親手制作一個(gè)《哈利·波特》人物圖譜,原來羅恩和赫敏的姻緣從第一部就已注定?
文摘菌記得小時(shí)候看《哈利·波特》小說的時(shí)候,最難記住的就是那些音譯的名字,又長又多,最后只能關(guān)注那幾個(gè)主要人物,跟著主要?jiǎng)∏橐宦愤^去,當(dāng)個(gè)爽文看完了。
這就導(dǎo)致一些邊緣人物根本沒關(guān)注到,也錯(cuò)過了J·K·羅琳埋下的許多小伏筆。
比如盧娜與韋斯萊其實(shí)是鄰居關(guān)系,這個(gè)在《火焰杯》中眾人出發(fā)去世界杯時(shí)有伏筆,但是很少有人第一遍看的時(shí)候能注意到。
大概是為了從一開始就厘清人物關(guān)系,Medium上一位博主Tomaz Bratanic開發(fā)了一個(gè)小項(xiàng)目,用Selenium結(jié)合SpaCy來創(chuàng)建一個(gè)Neo4j哈利·波特人物圖譜,把《哈利·波特》第一部中所有的人物都納入一張網(wǎng)絡(luò)中,人物關(guān)系一目了然。
從圖譜中我們似乎可以看到,三人小分隊(duì)中,哈利和赫敏的直接連接很少,這兩人出現(xiàn)時(shí)基本羅恩都在,而羅恩和赫敏二人卻連接很多,這讓人不禁聯(lián)想,難道從第一部開始,J·K·羅琳就安排好了羅恩和赫敏的姻緣了?
制作一個(gè)這樣的圖譜需要5步,動(dòng)手試試?
八卦的事情我們先放在一邊,還是先來看看Tomaz Bratanic是如何制作這一圖譜的。
總體來說,整個(gè)過程被分為了5步:
爬取“哈利波特迷”網(wǎng)站數(shù)據(jù)
書籍文本預(yù)處理
基于 SpaCy 規(guī)則匹配的實(shí)體識別
推斷字符之間的關(guān)系
將結(jié)果存儲(chǔ)到 Neo4j 圖形數(shù)據(jù)庫中
作者將整個(gè)過程記錄了一個(gè)Google Colab notebook,方便大家動(dòng)手試試,鏈接如下:
https://github.com/tomasonjo/blogs/blob/master/harry_potter/HarryPotterNLP.ipynb
第一步,爬取“哈利波特迷”網(wǎng)站數(shù)據(jù)
“哈利波特迷”網(wǎng)站頁面包含了第一本書中的人物列表,其中還包括了各個(gè)人物最初出現(xiàn)在哪一章,這可以幫助進(jìn)一步消除字符的歧義,因此第一步就是去爬取“哈利波特迷”網(wǎng)站數(shù)據(jù)。
作者選擇使用Selenium進(jìn)行Web頁面抓取,然后形成一個(gè)字符列表,其中包含人物最先出現(xiàn)的章節(jié)的信息,此外,每個(gè)角色都有一個(gè)網(wǎng)頁,上面有關(guān)于角色的詳細(xì)介紹。
例如,從赫敏·格蘭杰的頁面你可以觀察到一個(gè)結(jié)構(gòu)化的表格,其中包含了更多的信息,作者使用別名部分的實(shí)體提取然后添加其他字符細(xì)節(jié),如家族和血型來豐富最后的人物圖譜。
第二步,書籍文本預(yù)處理
由于文本中人物往往散布于文本的不同位置,其中涉及到的人物通常可以有多種不同的表達(dá)方式,例如某個(gè)語義關(guān)系中的實(shí)體可能是以代詞形式(比如he和she)出現(xiàn)的,為了更準(zhǔn)確且沒有遺漏地從文本中抽取相關(guān)信息,必須要對文章中的指代現(xiàn)象進(jìn)行消解。
在尋找合適的指代消解(Co-reference Resolution)模型時(shí),作者考慮了NeuralCoref和AllenNLP,這兩個(gè)模型都能提供指代消解功能。
但是在試用AllenNLP模型輸入整個(gè)章節(jié)時(shí),作者的內(nèi)存不夠,把一個(gè)章節(jié)分割成一個(gè)句子列表又運(yùn)行得非常慢,所以作者最后還是使用了NeuralCoref,NeuralCoref很輕松地處理了整個(gè)章節(jié),并且工作得更快。
準(zhǔn)備好了文本,是時(shí)候從文本中提取提到的字符了。
第三步,基于SpaCy規(guī)則匹配的實(shí)體識別
作者一開始試了幾個(gè)不同的命名實(shí)體識別(Named Entity Recognition,NER)模型,SpaCy、HuggingFace、Flair,甚至是 Stanford NLP。
但是這些模型都不能很好地滿足我的要求。因此,作者決定使用SpaCy基于規(guī)則的模式匹配特性,而不是自己訓(xùn)練模型。
根據(jù)第一步從網(wǎng)站上搜集的數(shù)據(jù),現(xiàn)在已經(jīng)知道我們需要在尋找哪些角色,下面只需要找到一種方法,在文本中盡可能完美地匹配他們。
首先必須為每個(gè)字符定義文本模式。這需要添加全名作為我們正在尋找的模式,然后我們使用空格將名稱分開,并創(chuàng)建一個(gè)模式,將這個(gè),名字中的每個(gè)單詞分開。舉個(gè)例子,如果我們定義了matcher模式,我們最終會(huì)得到3個(gè)不同的文本模式來表示給定的字符:
全名: 阿不思·鄧不利多(Albus Dumbledore)
名: 阿不思(Albus)
姓: 鄧布利多(Dumbledore)
當(dāng)然,還會(huì)有許多特例,比如“天狼星布萊克”(Sirius Black),為了不將所有“黑色”(Black)和人物搞混,作者定義只有當(dāng)“布萊克”是標(biāo)題格式的,才會(huì)假設(shè)“小天狼星布萊克”被引用。
另外,還需要考慮當(dāng)只提到姓時(shí),如何匹配到正確的人,比如這句話,“Weasley, get over here!”,這里面的Weasley可能指向羅恩的任何一個(gè)兄弟姐妹,這時(shí)必須為實(shí)體消歧提出一個(gè)通用的解決方案。
第四步,推斷字符之間的關(guān)系
解決了實(shí)體識別問題,其實(shí)就已經(jīng)完成了整個(gè)工作中最難的部分。
推斷角色之間的關(guān)系則非常簡單,首先,需要定義相互作用的距離閾值或兩個(gè)字符之間的關(guān)系。
作者將距離閾值定義為14,也就是說,如果兩個(gè)字符在14個(gè)單詞的距離內(nèi)共同出現(xiàn),那么我們假設(shè)它們一定是相互作用的。
此外,作者還合并了一些實(shí)體以避免扭曲結(jié)果,比如“哈利今天過得很愉快。他下午去找鄧布利多談話了?!?/p>
如果簡單分析這句話,會(huì)讓“哈利”和“鄧布利多”發(fā)生兩次互動(dòng),因此需要按照引用單個(gè)實(shí)體的相同字符的順序合并實(shí)體,來解決重復(fù)統(tǒng)計(jì)的問題。
第五步,將結(jié)果存儲(chǔ)到Neo4j圖形數(shù)據(jù)庫中
提取了字符之間的交互網(wǎng)絡(luò)后,剩下的唯一工作就是將結(jié)果存儲(chǔ)到圖形數(shù)據(jù)庫中。
導(dǎo)入查詢非常簡單,因?yàn)檫@里處理的是單向網(wǎng)絡(luò),如果使用的 是作者準(zhǔn)備的Colab Notebook,那么創(chuàng)建一個(gè)免費(fèi)的Neo4j Sandbox 或者免費(fèi)的Aura數(shù)據(jù)庫實(shí)例來存儲(chǔ)結(jié)果將是最簡單的。
最后,可視化結(jié)果,我們就能得到最終的人物關(guān)系圖譜。
靈感來自《權(quán)利的游戲》人物圖譜,下一步要分析哈利·波特宇宙
在文章中,作者表示,這一項(xiàng)目的靈感來源于此前Andrew Beveridge建立的《權(quán)利的游戲》人物圖譜。
相比于《哈利·波特》,《權(quán)力的游戲》擁有更多的人物和劇情,生成的網(wǎng)絡(luò)也更加復(fù)雜。
除了對整個(gè)1-8季進(jìn)行分析,Andrew Beveridge還對每一季做了人物圖譜分析,看看每一季中誰和誰是盟友,誰跟誰又是敵人。感興趣的讀者可以查看項(xiàng)目鏈接:
https://networkofthrones.wordpress.com/
相比而言,Tomaz Bratanic的《哈利·波特》人物圖譜項(xiàng)目更容易上手,讀者可以用第二部或第三部嘗試這種方法,唯一需要稍微調(diào)整的是實(shí)體消除歧義過程。
《哈利·波特》人物圖譜GitHub鏈接:
https://github.com/tomasonjo/blogs/blob/master/harry_potter/HarryPotterNLP.ipynb
Tomaz Bratanic表示,下一步他將著手整個(gè)哈利·波特宇宙的分析,將《神奇動(dòng)物在哪里》的部分也囊括進(jìn)去,感興趣的小伙伴可以持續(xù)關(guān)注。
參考鏈接:
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
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。