沈陽 陳瑛
(廣州工程技術(shù)職業(yè)學(xué)院信息工程學(xué)院,廣東廣州 510075)
人物關(guān)系網(wǎng)絡(luò)也稱為人物社交網(wǎng)絡(luò),人物社交網(wǎng)絡(luò)分析是用來查看節(jié)點和連接邊之間相互關(guān)系的一種分析方法。節(jié)點是社交網(wǎng)絡(luò)里的每個參與者,連接邊則表示參與者之間的關(guān)系。節(jié)點之間可以有很多條連接邊,那么社交網(wǎng)絡(luò)實際是一張圖,圖中可以標(biāo)示出所有與節(jié)點間相關(guān)的連接邊。社交網(wǎng)絡(luò)也可以用來衡量每個參與者的重要性和人脈關(guān)系[1]。三國演義中有上千人有名有姓的人物,他們扮演著不同的角色,共同演繹了那段波瀾壯闊的歷史,但顯然,這些人物的重要性存在差別,有些人是一呼百應(yīng)、叱咤風(fēng)云的巨擘,而有些人只是一閃即過的“醬油”角色。通過Python按章節(jié)根據(jù)時間線構(gòu)建出這些人物之間關(guān)系網(wǎng)絡(luò),可清晰了解這些人物在時間長河和歷史事件中的沉浮。
實現(xiàn)《三國演義》中的人物關(guān)系網(wǎng)絡(luò),需考慮幾點因素:(1)實體鏈接:由于《三國演義》中人物眾多,同一人物名稱也較為繁雜,例如曹操在文中還有“曹孟德”,“孟德”,“阿瞞”等各種稱謂,因此把需要把別名、縮寫與他們的標(biāo)準(zhǔn)名聯(lián)系起來,以方便統(tǒng)計。(2)精細(xì)分詞分句:雖然我們可以使用了jieba分詞工具實現(xiàn)分詞,但針對《三國演義》我們需要更加精準(zhǔn)的分詞。(3)內(nèi)置資源:由于該書字?jǐn)?shù)較多,但并不是所有的字詞都在統(tǒng)計范圍內(nèi),為提高關(guān)鍵字詞的檢索效率,我們需要一個通用停用詞典過濾掉某些字或詞。(4)關(guān)系網(wǎng)絡(luò)構(gòu)建:關(guān)系網(wǎng)絡(luò)的構(gòu)建是一個復(fù)雜的實現(xiàn)過程,我們使用現(xiàn)在較為成熟的支撐庫HarvestText來實現(xiàn)關(guān)系網(wǎng)絡(luò)的快速構(gòu)建。該庫是一個專注無(弱)監(jiān)督方法,能夠?qū)μ囟I(lǐng)域文本進(jìn)行簡單高效地處理和分析的庫,可利用共現(xiàn)關(guān)系,獲得關(guān)鍵詞之間的網(wǎng)絡(luò)[2]。
導(dǎo)入HarvestText的核心庫和資源庫,通過調(diào)用harvesttext.resources中的get_sanguo_entity_dict函數(shù),獲取《三國演義》的實體詞典entity_mention_dict和實體類型詞典entity_type_dict,然后輸出“曹操”和“魏”的相關(guān)信息,如下述代碼所示。
代碼執(zhí)行結(jié)果如圖1所示,從結(jié)果可以看到與“曹操”相關(guān)的稱謂有四種,“曹操”這個名詞的類型是“人名”,而與“魏”相關(guān)的稱謂有兩種,它的類型是“勢力”??梢娡ㄟ^HarvestText,我們可以很方便的獲得關(guān)于三國中的各種實體及類型。
圖1 導(dǎo)入HarvestText和相關(guān)資源庫后輸出相關(guān)結(jié)果Fig.1 Output related results after importing HarvestText and related resource libraries
在上一節(jié)中我們可以將一個實體的相關(guān)稱謂統(tǒng)一成一個確定稱謂,例如將“曹操”“曹孟德”“孟德”“阿瞞”這些稱謂統(tǒng)一成“曹操”。我們現(xiàn)在就可以開始構(gòu)建《三國演義》的重要人物關(guān)系網(wǎng)絡(luò)了。構(gòu)建思想是如果兩個人物稱謂在兩句話內(nèi)同時出現(xiàn),就給他們之間加一條連接邊。例如“當(dāng)日怠慢了玄德,張飛性發(fā),便欲殺之。玄德與關(guān)公急止之曰;“他是朝廷命官,豈可擅殺?””,這樣一句話就可以構(gòu)建如圖2所示的人物關(guān)系網(wǎng)。
圖2 一個簡單的人物關(guān)系網(wǎng)Fig.2 A simple network of people
本文采用networkx庫對數(shù)據(jù)實現(xiàn)網(wǎng)絡(luò)建模,首先安裝并導(dǎo)入networkx庫和pylab模塊,獲取第一章的內(nèi)容,調(diào)用HarvestText的cut_sentences函數(shù)進(jìn)行分句,分句結(jié)果放入sent1變量中,再從sent1中獲得所有二連句,另外通過輸出i變量的值可知第1章共有119句。調(diào)用HarvestText的set_linking_strategy函數(shù)設(shè)置網(wǎng)絡(luò)連接策略,再調(diào)用ht.build_entity_graph函數(shù)構(gòu)建網(wǎng)絡(luò)。定義函數(shù)draw_graph,使用networkx進(jìn)行網(wǎng)絡(luò)圖繪制。最后獲取重要結(jié)點important_nodes,即該結(jié)點的邊數(shù)大于5條,這說明該結(jié)點與其他結(jié)點的關(guān)系較為密切。然后從網(wǎng)絡(luò)圖中復(fù)制出包含這些重要結(jié)點的子圖,并繪制出來。完整代碼如下所示。
最后網(wǎng)絡(luò)圖輸出結(jié)果如圖3所示,可以看出在第一章中以黃巾軍起義為事件中心,劉備、關(guān)羽、張飛、曹操等三國時期的重要人物都已登場。
圖3 構(gòu)建《三國演義》第一章重要人物關(guān)系網(wǎng)絡(luò)Fig.3 Constructing " Romance of the Three Kingdoms"chapter one the network of important people
在前一節(jié)繪制了第一章重要人物關(guān)系網(wǎng)絡(luò)圖,那么就可以采用相似的方法,將《三國演義》全部章節(jié)的內(nèi)容匯總起來,繪制出整本書的人物社交全景圖[3]。操作步驟如下:
(1)遍歷所有章節(jié)內(nèi)容,將每個章節(jié)的內(nèi)容進(jìn)行分句、獲取二連句,生成各章子圖后,依次存放到G_chapters中,見代碼1~5行。
(2)將各章子圖連接起來存入全景圖G_gloal中,見代碼6~13行。具體連接方法如下:遍歷每張子圖的各條邊,如果全景圖中已經(jīng)存在這條邊,則這條邊的權(quán)重累加到全景圖的該邊權(quán)重中,如果不存在這條邊,則向全景圖添加該邊。
(3)子全景圖中獲取最大連通分量的子圖,見代碼14~17行。從下面輸出的信息可知,該子圖共有1244個節(jié)點,9394條邊,平均權(quán)重值為15.1029。
Name:
Type: Graph
Number of nodes: 1244
Number of edges: 9394
Average degree: 15.1029
(4)整個社交網(wǎng)絡(luò)有1244人,還有9千條邊!我們要把這些節(jié)點和邊全部繪制出來太難了,我們只能挑選其中的關(guān)鍵人物來繪制出一個子圖。因此我們篩選出“度大于30”的節(jié)點作為重要節(jié)點,并從全景圖中復(fù)制出包含這些重要結(jié)點的子圖G_main,見代碼18~21行。
(5)使用pyecharts進(jìn)行可視化顯示,見代碼22~40行。導(dǎo)入pyecharts庫,具體安裝方法與上面任務(wù)中庫安裝方法類似。通過G_main構(gòu)建pyecharts圖形繪制所需的參數(shù)集合nodes、links,其中nodes的symbolSize屬性表示圖中空心圓圈的大小。
(6)繪制并輸出“三國人物社交全景圖”,輸出位置是當(dāng)前代碼文件所在目錄,名稱為“render.html”。打開這個文件可以看到一個絢麗的人物關(guān)系圖,如圖4所示,如果指用一個節(jié)點,如圖5所示,當(dāng)指向“劉備”節(jié)點時,可以看到這個人物的度量值和邊。
圖4 三國人物社交全景圖(一)Fig.4 Panorama of social intercourse among the Three Kingdoms (1)
圖5 三國人物社交全景圖(二)Fig.5 Panorama of social intercourse among the Three Kingdoms (2)
完整代碼如下所示。
本文實現(xiàn)了使用Python構(gòu)建《三國演義》人物關(guān)系網(wǎng)絡(luò)的方法。首先基于HarvestText庫對文本內(nèi)容進(jìn)行數(shù)據(jù)準(zhǔn)備,包括分詞、去除停用詞等步驟,然后基于networkx庫實現(xiàn)關(guān)系網(wǎng)絡(luò)的構(gòu)建,最后通過該方法構(gòu)建了《三國演義》人物社交全景圖。該方法具有普適性,對大文本數(shù)據(jù)分析具有一定的指導(dǎo)意義。