想不出合適的標(biāo)題,很喜歡關(guān)漢卿的這組元曲,就胡亂取了,順便安利下。
適意行,安心坐,渴時(shí)飲饑時(shí)餐醉時(shí)歌,困來時(shí)就向莎茵臥。日月長,天地闊,閑快活!
舊酒投,新醅潑,老瓦盆邊笑呵呵,共山僧野叟閑吟和。他出一對雞,我出一個(gè)鵝,閑快活!
意馬收,心猿鎖,跳出紅塵惡風(fēng)波,槐陰午夢誰驚破?離了利名場,鉆入安樂窩,閑快活!
南畝耕,東山臥,世態(tài)人情經(jīng)歷多,閑將往事思量過。賢的是他,愚的是我,爭甚么?
——元·關(guān)漢卿《四塊玉·閑適》
本文代碼開源在:GitHub - DesertsX/gulius-projects
復(fù)雜
上一篇文章里安利了這個(gè)非常驚艷的關(guān)于紅樓夢的可視化作品:InteractiveGraph/example1。

有不少人喜歡,也有人說如此復(fù)雜的圖譜,反而會(huì)使人覺得頭大。其實(shí)我也有此感受,對于紅迷們來說,書中內(nèi)容情節(jié)、人物關(guān)系都是很熟悉的,這樣的關(guān)系圖一點(diǎn)點(diǎn)看起來自然不會(huì)太費(fèi)勁。

可整個(gè)作品還是蠻復(fù)雜的,即便人物、事件、地點(diǎn)、關(guān)系等以不同顏色區(qū)別開來并在節(jié)點(diǎn)上附有詳情介紹,且右上角亦有可交互的選項(xiàng),但畢竟成百上千的節(jié)點(diǎn)和邊交織在一個(gè)網(wǎng)頁里,對于不熟悉紅樓夢的人來說,就更覺錯(cuò)綜復(fù)雜了。
這里也想起之前接觸的一個(gè)知識圖譜API,其實(shí)同樣也不知道這些實(shí)體與關(guān)系,對于個(gè)人而言能有什么切入點(diǎn)、可以怎么利用起來。下圖展示了該知識圖譜關(guān)于鄧婕的所有信息。大家可自行更改最后的參數(shù),就能看到其他所有實(shí)體的情況了,比如entity=胡歌等等。

兩個(gè)緣由
言歸正傳,基于上文提到關(guān)系圖譜的復(fù)雜面貌的緣故,以及最近接觸了些依存句法分析、信息抽取、事件圖譜等知識(后續(xù)會(huì)寫寫這方面內(nèi)容),因而也對實(shí)際項(xiàng)目中如何從非結(jié)構(gòu)化的文本內(nèi)容中抽取出結(jié)構(gòu)化的數(shù)據(jù)非常感興趣。
比如本項(xiàng)目里,究竟是如何從1600余頁、73萬余字的《紅樓夢》原著中提取出人物關(guān)系、情節(jié)事件的呢?想來應(yīng)該不會(huì)人工手動(dòng)實(shí)現(xiàn)的吧?如果能知曉實(shí)現(xiàn)的流程和技術(shù),甚至有開源的代碼,那么其他人也就能輕松遷移到不同小說、不同文本領(lǐng)域上去,并實(shí)現(xiàn)同樣酷炫的關(guān)系圖譜了。

數(shù)據(jù)集
幸運(yùn)的是,這個(gè)項(xiàng)目代碼都是開源的,GitHub上介紹了詳細(xì)的實(shí)現(xiàn)流程。參見:InteractiveGraph/README_CN。

但數(shù)據(jù)集是別處提供的,并非從頭開始構(gòu)建的。簡單搜索了下,目前只看到兩個(gè)疑似相關(guān)的項(xiàng)目:GitHub - lzell/nickel、GitHub - iainbeeston/nickel,有待后續(xù)進(jìn)一步驗(yàn)證。
honglou.json
honglou.json數(shù)據(jù)集來自于中國古典名著《紅樓夢》(又名《石頭記》,wikipedia / Dream_of_the_Red_Chamber)。 在這部小說中賈寶玉、林黛玉、薛寶釵是主要人物。這個(gè)數(shù)據(jù)集中定義了超過300個(gè)實(shí)體,其中包括書中的人物,地點(diǎn)和時(shí)間,以及超過500個(gè)這些實(shí)體之間的連接。
nickel2008@github 提供了數(shù)據(jù)集。此數(shù)據(jù)集中或有紕漏,但是對于一個(gè)圖數(shù)據(jù)項(xiàng)目的示例來說已經(jīng)足夠好了。
雖然遇到了些阻礙,但所幸數(shù)據(jù)集還在,不如直接去分析統(tǒng)計(jì)下里面的人物、地點(diǎn)、事件和關(guān)系,在輔助理解復(fù)雜的關(guān)系圖譜的同時(shí),看看能否逆向的獲取些構(gòu)建數(shù)據(jù)集的靈感啟示。
準(zhǔn)備數(shù)據(jù)
紅樓夢數(shù)據(jù)集在此文件里dist/examples/honglou.json。點(diǎn)擊raw后,全選復(fù)制新頁面里的所有數(shù)據(jù),并粘貼到本地文件中,文件名取為InteractiveGraph_HongLouMeng.json。

刪除下面無用的代碼,方可后續(xù)讀取json數(shù)據(jù)時(shí)不出錯(cuò)。最后記得保存成utf-8編碼格式。
"translator": {
"nodes": function (node) {
//set description
if (node.description === undefined) {
var description = "<p align=center>";
if (node.image !== undefined) {
description += "<img src='" + node.image + "' width=150/><br>";
}
description += "<b>" + node.label + "</b>" + "[" + node.id + "]";
description += "</p>";
if (node.info !== undefined) {
description += "<p align=left>" + node.info + "</p>";
} else {
if (node.title !== undefined)
description += "<p align=left>" + node.title + "</p>";
}
node.description = description;
}
},
},
簡單展示下數(shù)據(jù)格式,其實(shí)和GitHub上的差不多:
{
"categories": {
"person": "人物",
"event": "事件",
"location": "地點(diǎn)"
},
"data": {
"nodes": [{
"label": "共讀西廂",
"value": 2,
"id": 3779,
"categories": [
"event"
],
"info": "寶玉到沁芳橋邊桃花底下看《西廂記》,正準(zhǔn)備將落花送進(jìn)池中,黛玉說她早已準(zhǔn)備了一個(gè)花冢,正來葬花。黛玉發(fā)現(xiàn)《西廂記》,寶玉借書中詞句,向黛玉表白。黛玉覺得冒犯了自己尊嚴(yán),引起口角,寶玉賠禮討?zhàn)?,黛玉也借《西廂記》詞句,嘲笑了寶玉。于是兩人收拾落花,葬到花冢里去。"
},
......
],
"edges": [{
"id": 3776,
"label": "位于",
"from": 3838,
"to": 3851
},
...
]
讀取數(shù)據(jù)
以上,完成了數(shù)據(jù)準(zhǔn)備過程,接下來可以開始在jupyter notebook里進(jìn)行分析挖掘。
import json
import codecs
with codecs.open('InteractiveGraph_HongLouMeng.json', 'r',encoding='utf-8') as json_str:
json_dict = json.load(json_str)
print(json_dict.keys())
print(json_dict["categories"].keys())
print(json_dict["categories"])
nodes = json_dict['data']['nodes']
edges = json_dict['data']['edges']
層級關(guān)系大致如此,categories和data同一級,節(jié)點(diǎn)nodes和邊edges同一級,并且歸屬于data,也是本次要統(tǒng)計(jì)分析的所有數(shù)據(jù),categories指明三種節(jié)點(diǎn)數(shù)據(jù)類型,即:'person': '人物', 'event': '事件', 'location': '地點(diǎn)。
dict_keys(['categories', 'data'])
dict_keys(['person', 'event', 'location'])
dict_keys(['nodes', 'edges'])
{'person': '人物', 'event': '事件', 'location': '地點(diǎn)'}
紅樓多少事
首先來看看數(shù)據(jù)中都包含了哪些紅樓夢中的事件,直接篩選出類型為event的節(jié)點(diǎn),共拿到59條數(shù)據(jù)。
event_nodes = []
for num, node in enumerate(nodes):
if node['categories'][0] == 'event':
event_nodes.append(node)
print(len(event_nodes))
字典元素組成的列表直接用pandas轉(zhuǎn)成表格格式:
import pandas as pd
df = pd.DataFrame(event_nodes)
df.head()
其中label就是事件名稱,info是內(nèi)容簡介,value貌似是覺得節(jié)點(diǎn)大小的,未做細(xì)究,本次均不做探索。

將事件全部提取出來:
events = df['label'].values.tolist()
events
存成列表格式,方便后續(xù)處理,注意,所有事件并非按照小說里情節(jié)發(fā)展的順序排列的,所以看起來會(huì)較為混亂:
['共讀西廂', '林如海捐館揚(yáng)州城', '海棠詩社', '紫鵑試玉',
'魘魔姊弟', '羞籠紅麝串', '麒麟伏雙星', '納鴛鴦',
'攆晴雯', '偷娶尤二姐', '軟語救賈璉', '大鬧學(xué)堂',
'拐賣巧姐', '亂判葫蘆案', '毒設(shè)相思局', '情贈(zèng)茜香羅',
'勇救薛蟠', '倪二輕財(cái)尚義', '神游太虛幻境', '借劍殺人',
'平兒失鐲', '平兒行權(quán)', '司棋被捉', '巧結(jié)梅花絡(luò)',
'親嘗蓮葉羹', '寶玉挨打', '大鬧廚房', '香菱學(xué)詩',
'鳳姐托孤', '旺兒婦霸成親', '弄權(quán)鐵檻寺', '智能偷情',
'勾引薛蝌', '賈政借錢', '探春遠(yuǎn)嫁', '劉姥姥一進(jìn)榮國府',
'黛玉葬花', '寶釵撲蝶', '金釧投井', '大觀園試才',
'秦可卿淫喪天香樓', '迎春誤嫁中山狼', '金玉良緣', '王熙鳳協(xié)理寧國府',
'元妃省親', '甄士隱夢幻識通靈', '晴雯撕扇', '鳳姐潑醋',
'探春理家', '湘云醉眠芍藥裀', '尤三姐殉情', '抄檢大觀園',
'黛玉焚稿', '黛玉之死', '晴雯補(bǔ)裘', '元宵丟英蓮',
'冷子興演說榮國府', '木石前盟', '賢襲人嬌嗔箴寶玉']
拿到這些事件后下一步該怎么辦?讓我們再明確下本文的目的之一,即看看能否逆向找出數(shù)據(jù)構(gòu)造的規(guī)則與邏輯。那么自然而然的就有一個(gè)問題:這些事件都是如何從原著中抽取出來或者總結(jié)出來的呢?

作為中國古典四大名著之首的《紅樓夢》,有1600余頁、73萬余字(人民文學(xué)出版社版本),涉及的人物和事件繁多,若是單純靠人工去總結(jié),顯然并不可取,而且也無法遷移到其他文本上去。當(dāng)然,《紅樓夢》本身廣受讀者喜愛,歷來研究的人也多,且婦孺皆知、耳熟能詳,網(wǎng)上現(xiàn)成的人物名單、事件羅列,想來或多或少都是有的,此處暫且不表。
考慮到《紅樓夢》本身是章回體小說,各章回的名字高度總結(jié)概括了本章的內(nèi)容,一個(gè)合理的猜想就是從章回中直接抽取出事件內(nèi)容。那么就來看看這59條數(shù)據(jù)里有多少是完全和章回名重合的呢?

獲取章節(jié)名
首先從《紅樓夢》小說章節(jié)目錄網(wǎng)站獲取各章回名稱,簡單寫個(gè)爬蟲就行。
import requests
from lxml import etree
url = 'https://www.555zw.com/book/39/39480/'
r = requests.get(url)
r.encoding = r.apparent_encoding
selector = etree.HTML(r.content)
contents = selector.xpath('//tr//a/@title')
print(len(contents))
contents
注意需要設(shè)置編碼格式,否則會(huì)亂碼。展示部分?jǐn)?shù)據(jù)
120
['第一回 甄士隱夢幻識通靈 賈雨村風(fēng)塵懷閨秀',
'第二回 賈夫人仙逝揚(yáng)州城 冷子興演說榮國府',
'第三回 賈雨村夤緣復(fù)舊職 林黛玉拋父進(jìn)京都',
'第四回 薄命女偏逢薄命郎 葫蘆僧亂判葫蘆案',
'第五回 游幻境指迷十二釵 飲仙醪曲演紅樓夢',
'第六回 賈寶玉初試云雨情 劉姥姥一進(jìn)榮國府',
...]
經(jīng)過一些簡單處理后(具體可見代碼:GitHub - DesertsX/gulius-projects,本文略過),拿到章回與事件對應(yīng)關(guān)系
chapter_df = pd.DataFrame({"chapter":chapters, "title":contents})
def is_event(title):
for event in event_chaps:
if event in title:
return event
return ''
chapter_df['title2event'] = chapter_df['title'].apply(is_event)
chapter_df.head(10)
title2event列可以看成能直接從章回名中提前出事件名。

接著將
title2event列非空的所有行都標(biāo)上顏色,由于在整個(gè)表格里只標(biāo)出特定的行的代碼寫不出來(太菜),只能將非空的行選出來后再設(shè)置顏色。
chapter_df[chapter_df.title2event != '']
.style.set_properties(**{'background-color': '#ccff99', 'color': '#B452CD'})
因?yàn)楹苌倏吹接腥讼裨?code>excel一樣,用不同顏色顯示jupyter notebook里的表格數(shù)據(jù),于是搜了下,還真有實(shí)現(xiàn)的方式:pandas-docs/style。

由上圖可知,共有18條(18/59=30%)事件是一字不差包含在章回名里的。不過感覺非紅迷的朋友,可能不熟悉這些事件到底是什么情節(jié)(是這樣嗎?)
非章節(jié)名的事件
接著看看其他41條事件,這里按人物角色和小說情節(jié)出現(xiàn)的前后順序進(jìn)行簡單整理,比較耳熟能詳?shù)挠校?code>'木石前盟', '金玉良緣', '共讀西廂', '寶釵撲蝶','黛玉葬花','晴雯撕扇', '湘云醉眠芍藥裀', '香菱學(xué)詩'等等。
'元宵丟英蓮', '木石前盟', '金玉良緣', '麒麟伏雙星', '神游太虛幻境', '秦可卿淫喪天香樓',
'倪二輕財(cái)尚義', '智能偷情', '旺兒婦霸成親',
'大鬧學(xué)堂', '寶玉挨打', '元妃省親', '共讀西廂', '寶釵撲蝶', '海棠詩社', '湘云醉眠芍藥裀', '香菱學(xué)詩',
'魘魔姊弟', '金釧投井', '紫鵑試玉', '大鬧廚房', '司棋被捉',
'晴雯撕扇', '晴雯補(bǔ)裘', '攆晴雯',
'平兒失鐲', '鳳姐托孤', '拐賣巧姐',
'探春理家', '探春遠(yuǎn)嫁', '黛玉葬花', '黛玉之死',
'納鴛鴦', '偷娶尤二姐', '尤三姐殉情',
'賈政借錢', '勇救薛蟠', '勾引薛蝌',}
其中,'寶釵撲蝶'和'黛玉葬花'均對應(yīng)第二十七回 滴翠亭楊妃戲彩蝶 埋香冢飛燕泣殘紅。可見還是可以轉(zhuǎn)換成從章節(jié)名里提取事件的。

以上就是對數(shù)據(jù)集中事件這一維度的分析,借助章回名和耳熟能詳?shù)臉蚨?,可以拿到大多?shù)事件。而有了事件后,如何提取事件中涉及的主要人物,這又是需要解決的,并且如何對其他不含章回名的、不那么熟悉的文本進(jìn)行實(shí)體關(guān)系抽取、事件圖譜構(gòu)建等等都是需要進(jìn)一步研究的。
location 地點(diǎn)
接下來,看看location地點(diǎn)數(shù)據(jù)。格式如下:
{
"label": "太虛幻境",
"value": 1,
"id": 3860,
"categories": [
"location"
],
"info": "太虛幻境,《紅樓夢》中的女兒仙境,警幻仙子司主。它位于離恨天之上、灌愁海之中的放春山遣香洞,以夢境的形式向甄士隱、賈寶玉二位有緣人顯現(xiàn)。"
},
代碼很簡單,和上面event事件差不多:
loc_nodes = []
for num, node in enumerate(nodes):
if node['categories'][0] == 'location':
loc_nodes.append(node)
print(len(loc_nodes))
loc_df = pd.DataFrame(loc_nodes)
loc_df.head(10)

本數(shù)據(jù)集給出的地點(diǎn)不算多,僅26條,主要是城市、賈府、大觀園、各主要人物的住處等等。這部分可以用命名實(shí)體識別、或手動(dòng)創(chuàng)建地點(diǎn)詞典、或網(wǎng)上找現(xiàn)成的匯總等,應(yīng)該能比較方便的實(shí)現(xiàn),所以不展開了。至于人物與地點(diǎn)關(guān)系的抽取,同樣不清楚有什么自動(dòng)化的方式可以實(shí)現(xiàn)嘛?
['榮國府', '寧國府', '大觀園', '太虛幻境',
'蘇州', '京郊', '揚(yáng)州', '金陵', '京城', '胡州', '大同府', '閶門', '應(yīng)天府',
'怡紅院', '瀟湘館', '蘅蕪苑', '秋爽齋', '暖香塢', '綴錦樓', '稻香村', '鳳藻宮', '櫳翠庵', '梨香院',
'玄真觀', '葫蘆廟', '南海']
看到這些熟悉地名,也是想起自己曾去過北京和上海青浦南北兩處大觀園,網(wǎng)上盜張圖,懷念一下:

person 人物
再來看看person人物數(shù)據(jù)詳情。格式如下:
{
"label": "林黛玉",
"value": 21,
"image": "./images/photo/林黛玉.jpg",
"id": 4037,
"categories": [
"person"
],
"info": "金陵十二釵之冠(與寶釵并列)。林如海與賈敏之女,寶玉的姑表妹,寄居榮國府 。她生性孤傲,多愁善感,才思敏捷。她與寶玉真心相愛,是寶玉反抗封建禮教的同盟,是自由戀愛的堅(jiān)定追求者。"
},
轉(zhuǎn)成表格格式:
person_nodes = []
for num, node in enumerate(nodes):
if node['categories'][0] == 'person':
person = node['label']
person_nodes.append(node)
print(len(person_nodes))
person_df = pd.DataFrame(person_nodes)
person_df.head(10)
共242條人物數(shù)據(jù),其中有112人附帶了1987版《紅樓夢》電視劇的角色劇照,照片統(tǒng)一存放在:dist\examples\images\photo。

陳曉旭版的林黛玉了解一下:

用百年百圖の中國(1900-1999):另類python爬蟲和PIL拼圖 一文里的代碼將所有圖片拼到一起看看。里面混入了一個(gè)奇怪的東西(黑白的那張)。

另外,尤三姐的照片搞錯(cuò)成了尤二姐,于是有兩張尤二姐的,即第四行倒數(shù)第三四張(一位“紅迷”的自我修養(yǎng),后面還發(fā)現(xiàn)了其他BUG,稍后再談)。
edges 邊
最后再來看看人物與人物、人物與地點(diǎn)、人物與事件的關(guān)系。數(shù)據(jù)格式:
"edges": [{
"id": 3776,
"label": "位于",
"from": 3838,
"to": 3851
},
{
"id": 3777,
"label": "位于",
"from": 3839,
"to": 3851
},
轉(zhuǎn)成表格形式:
edges_df = pd.DataFrame(edges)
edges_df.head()
共25類694條數(shù)據(jù)。
['參與', '仆人', '居住地', '父親', '原籍',
'母親', '丈夫', '妻子', '哥哥', '交好',
'位于', '同宗', '姐姐', '私通', '老師',
'姬妾', '喜歡', '跟班', '干娘', '奶媽',
'知己', '陪房', '前世', '連宗', '有恩']
用pyecharts繪制各類關(guān)系及其數(shù)量的柱形圖。

最近python交友娛樂會(huì)所群(QQ:613176398)里看到很多人都也在用這個(gè)庫,不過我又想重新用ECharts來“美顏”圖表了,以往整理過的代碼和示例可見:圖表太丑怎么破,ECharts神器帶你飛!。這里也用一下,顏值碾壓。

在這些關(guān)系中,首先看到了“私通”二字,那么就來看下都是誰和誰私通吧。寫成函數(shù)方便復(fù)用。這里edges只包含相關(guān)節(jié)點(diǎn)的id,需要從person里拿到對應(yīng)的人物名稱。
def word2id(word):
df = edges_df[edges_df.label== word]
from_id = df['from'].values.tolist()
to_id = df['to'].values.tolist()
return from_id, to_id
def id2label(ids):
tables = []
for ID in ids:
tables.append(person_df[person_df['id']==ID])
labels = pd.concat(tables)['label'].values.tolist()
return labels
def get_relation(from_id,to_id):
for from_label, to_label in zip(id2label(from_id), id2label(to_id)):
print(from_label, '--> {} -->'.format(word), to_label)
word = "私通"
from_id,to_id = word2id(word)
get_relation(from_id,to_id)
以下就是私通名單!《紅樓夢》里蠻出名的一句話是焦大說的:“爬灰的爬灰,養(yǎng)小叔子的養(yǎng)小叔子”,不明真相的吃瓜群眾可以自行搜索。
賈薔 --> 私通 --> 齡官
賈珍 --> 私通 --> 秦可卿
賈璉 --> 私通 --> 多姑娘
薛蟠 --> 私通 --> 寶蟾
王熙鳳 --> 私通 --> 賈蓉
秦可卿 --> 私通 --> 賈薔
司棋 --> 私通 --> 潘又安
寶蟾 --> 私通 --> 薛蟠
尤三姐 --> 私通 --> 賈珍
鮑二家的 --> 私通 --> 賈璉
智能兒 --> 私通 --> 秦鐘
萬兒 --> 私通 --> 茗煙
其中,賈璉也就是王熙鳳鳳姐的丈夫,分別和多姑娘、鮑二家的有私情。這里不得不開個(gè)車,其實(shí)《紅樓夢》里也有幾個(gè)黃段子的,下面兩則均出自第二十一回 《賢襲人嬌嗔箴寶玉 俏平兒軟語救賈璉》:
賈璉見她嬌俏動(dòng)情,便摟著求歡,被平兒奪手跑了,急的賈璉彎著腰恨道:“死促狹小瀅婦!一定浪上人的火來,他又跑了?!逼絻涸诖巴庑Φ溃骸拔依宋业?,誰叫你動(dòng)火了?難道圖你受用一回,叫他知道了,又不待見我。”
下面這個(gè)更好笑,因?yàn)樾掳婕t樓夢電視劇把這部分拍成了拔火罐,也是佩服導(dǎo)演的“神來之筆”,為18歲以下青少年的心理健康出了一份力??梢姡?a target="_blank" rel="nofollow">為什么網(wǎng)上對于舊版《紅樓夢》的評價(jià)比新版《紅樓夢》好那么多,舊版紅樓是否被過度神話?
那個(gè)賈璉,只離了鳳姐便要尋事,獨(dú)寢了兩夜,便十分難熬,便暫將小廝們內(nèi)有清俊的選來出火。

言歸正傳,本以為這里出現(xiàn)了個(gè)BUG:秦可卿 --> 私通 --> 賈薔 應(yīng)該是秦可卿 --> 私通 --> 賈珍,但一搜真有這些猜想,也就隨它去吧。
另外在原著里秦可卿,乳名兼美,暗含兼有釵黛之美的意思,在寶玉夢游太虛幻境時(shí),寫到“其鮮艷嫵媚,有似乎寶釵,風(fēng)流裊娜,則又如黛玉”。也是金陵十二釵中最先去世的女子。

再來看看其他關(guān)系:“喜歡”
林黛玉 --> 喜歡 --> 賈寶玉
薛寶釵 --> 喜歡 --> 賈寶玉
妙玉 --> 喜歡 --> 賈寶玉
秦可卿 --> 喜歡 --> 賈寶玉
彩云 --> 喜歡 --> 賈環(huán)
尤三姐 --> 喜歡 --> 柳湘蓮
藕官 --> 喜歡 --> 菂官
彩霞 --> 喜歡 --> 賈環(huán)
齡官 --> 喜歡 --> 賈薔
“知己”
林黛玉 --> 知己 --> 紫鵑
妙玉 --> 知己 --> 邢岫煙
史湘云 --> 知己 --> 林黛玉
“交好”
賈寶玉 --> 交好 --> 秦鐘
賈寶玉 --> 交好 --> 柳湘蓮
賈寶玉 --> 交好 --> 蔣玉菡
賈寶玉 --> 交好 --> 北靜王
賈蓉 --> 交好 --> 賈璉
賈薔 --> 交好 --> 秦鐘
秦鐘 --> 交好 --> 香憐
薛蟠 --> 交好 --> 柳湘蓮
薛蟠 --> 交好 --> 馮紫英
薛蟠 --> 交好 --> 金榮
柳湘蓮 --> 交好 --> 秦鐘
賈雨村 --> 交好 --> 冷子興
蔣玉菡 --> 交好 --> 北靜王
賈蕓 --> 交好 --> 賈薔
賈菌 --> 交好 --> 賈藍(lán)
賴尚榮 --> 交好 --> 柳湘蓮
癩頭和尚 --> 交好 --> 跛足道人
晴雯 --> 交好 --> 麝月
襲人 --> 交好 --> 平兒
小紅 --> 交好 --> 墜兒
瑞珠 --> 交好 --> 寶珠
柳嫂子 --> 交好 --> 芳官
馬道婆 --> 交好 --> 趙姨娘
感覺挺多和自己想的不一樣的。但也懶得管了。逃......

小結(jié)
以上算是“簡單”完成了對該數(shù)據(jù)集的探索和分析,代碼開源在:GitHub - DesertsX/gulius-projects,其實(shí)到底該如何在新的文本上構(gòu)造可用的、靠譜的數(shù)據(jù)集依舊不得而知,后續(xù)會(huì)寫寫句法依存分析、信息抽取、事件圖譜等等的文章,敬請期待。(馬卡龍伏筆)
