張政平,倪建成
(曲阜師范大學(xué),山東 濟寧 273165)
家譜是一種表譜形式的特殊文獻,記載了以血緣關(guān)系為主體的家族世系繁衍信息和重要人物的相關(guān)事跡信息等。它不僅包含了整個家族可追溯的家族來源、遷徙軌跡以及人物描述等結(jié)構(gòu)化數(shù)據(jù),還隱含了獨有的文化傳承、族規(guī)家約等歷史文化信息?!犊鬃邮兰易V》(2009 版)作為“世界最長家譜”[1],全譜共分108 卷,首次收錄了女性族人、少數(shù)民族和外籍后裔的資料,增加了性別、配偶等個人信息,且已于2016 年實現(xiàn)了孔子世家譜的數(shù)字化續(xù)修系統(tǒng)[2],使用關(guān)系型數(shù)據(jù)庫存儲世家譜數(shù)據(jù)。然而,隨著家譜數(shù)據(jù)的不斷豐富,家譜信息的復(fù)合查詢、語義推理與分析等需求急劇擴增,導(dǎo)致傳統(tǒng)的家譜數(shù)據(jù)管理方式[3]已經(jīng)無法滿足上述需求所需要的實時、自動推理和可視化等特性。
知識圖譜是一種能夠可視化的信息表達方法,便于人們準確、清晰地獲取數(shù)據(jù)。本體作為一種語義數(shù)據(jù)模型,用于定義特定領(lǐng)域的概念、屬性及其相互關(guān)系,實現(xiàn)領(lǐng)域建模和推理。因此,將知識圖譜和本體有效結(jié)合可以更準確地分析家譜領(lǐng)域知識之間的邏輯關(guān)聯(lián)。
知識圖譜的構(gòu)建一般采用自頂向下和自底向上兩種方式[4]。自頂向下的方法通常用于領(lǐng)域知識圖譜,先定義本體與數(shù)據(jù)模式,再填充實體形成完整的知識圖譜,如FreeBase。自底向上的方法則先從開放連接數(shù)據(jù)中提取實體,再選擇置信度超過閾值的實體-關(guān)系對加入知識庫,最后構(gòu)建頂層的本體結(jié)構(gòu)和數(shù)據(jù)模式[5]。
在知識圖譜構(gòu)建過程中,數(shù)據(jù)層的填充需要使用實體識別技術(shù)。實體識別大致可分為基于規(guī)則[6]、基于統(tǒng)計學(xué)習(xí)[7]和基于機器學(xué)習(xí)[8-10]3 種方法?;诮y(tǒng)計學(xué)習(xí)的方法對人工特征選擇要求較高,對語料庫的依賴較大?;跈C器學(xué)習(xí)的方法雖在預(yù)測過程中無需過多的人工干預(yù),但在訓(xùn)練模型時仍需大量的人工標注信息。基于規(guī)則的方法需要領(lǐng)域?qū)<业闹С?,難以移植到新領(lǐng)域,但是準確率高、直觀性好,更加接近人類的思考方式。對于孔子世家譜原始數(shù)據(jù),從零開始標注數(shù)據(jù)的任務(wù)量較大。某些實體類型的數(shù)據(jù)量比較稀疏,使用統(tǒng)計學(xué)習(xí)、機器學(xué)習(xí)方法會導(dǎo)致模型欠擬合或訓(xùn)練不充分。此外,孔子世家譜的結(jié)構(gòu)比較單一,有一定的規(guī)律性。因此,使用基于規(guī)則的實體識別是最佳選擇。
目前,家譜領(lǐng)域本體的研究工作屈指可數(shù)。夏翠娟等人[11]設(shè)計了基于書目框架(Bibframe)的上海圖書館家譜本體。該本體以一個家族為最小單位進行資源描述,無法描述家族中的具體人物及其關(guān)系和屬性。陳艷[12]構(gòu)建了中國家譜知識本體,本體面向多宗族家譜,規(guī)模較為龐大。孔子世家譜記載了孔子后人詳細的人物信息,包括人物的名、字、號、性別、世系代數(shù)、支派、出嗣情況以及生平事跡等。對于孔子世家譜數(shù)據(jù)而言,現(xiàn)有的本體結(jié)構(gòu)規(guī)模冗余且粒度過粗。
此外,相對于關(guān)系數(shù)據(jù)庫而言,圖數(shù)據(jù)庫更適合處理大規(guī)模數(shù)據(jù),可以避免關(guān)系數(shù)據(jù)庫涉及多表的復(fù)合查詢時的表聯(lián)接復(fù)雜性和低效性,從而提升用戶體驗。Neo4j 是一個開源的圖數(shù)據(jù)庫管理系統(tǒng),以面向圖的存儲格式將數(shù)據(jù)存儲在本地文件,具備完全事務(wù)特性,能夠高效執(zhí)行結(jié)構(gòu)化數(shù)據(jù)的各項操作。另外,Neo4j 使用聲明式的模式匹配查詢語言Cypher。相對于SPARQL,它更加易于理解和操作,對大規(guī)模的數(shù)據(jù)庫應(yīng)用至關(guān)重要。
綜上,目前構(gòu)建孔子世家譜知識圖譜存在兩方面的問題。一方面,當前領(lǐng)域本體建模方法不完善,現(xiàn)有家譜本體無法準確描述世家譜數(shù)據(jù)。另一方面,基于關(guān)系型數(shù)據(jù)庫存儲的孔子世家譜續(xù)修系統(tǒng)數(shù)據(jù)存取效率低,且無法挖掘家譜數(shù)據(jù)之間的語義關(guān)聯(lián)。
針對以上問題,本文采用自頂向下的方式構(gòu)建孔子世家譜知識圖譜:
(1)在孔子世家譜原始數(shù)據(jù)的基礎(chǔ)上,提出一種世家譜本體構(gòu)造方法,并依據(jù)此方法建立世家譜本體結(jié)構(gòu);
(2)根據(jù)世家譜本體的約束,抽取非結(jié)構(gòu)化數(shù)據(jù)中的實體,并將實體數(shù)據(jù)整合為知識三元組;
(3)將知識三元組存儲至Neo4j 圖數(shù)據(jù)庫,完成初始的孔子世家譜知識圖譜構(gòu)建。
本文在構(gòu)建孔子世家譜知識圖譜時,按照知識圖譜的生命周期,將構(gòu)建流程分為本體構(gòu)建、知識抽取和知識存儲等3 個步驟。構(gòu)建流程如圖1 所示。
圖1 孔子世家譜知識圖譜構(gòu)建流程
首先,提出融合骨架法和七步法的世家譜本體構(gòu)造方法,并據(jù)此構(gòu)建本體。其次,采用基于規(guī)則的實體識別方法抽取實體,并整合完成知識抽取。最后,利用圖數(shù)據(jù)庫Neo4j 存儲知識圖譜。
七步法[13]和骨架法是現(xiàn)有構(gòu)建領(lǐng)域本體的常用方法。骨架法分為確定知識本體應(yīng)用的目的和范圍、本體分析、本體表示、本體評價和本體建立5個環(huán)節(jié)。當本體不符合評價標準時,重新進行本體分析。骨架法雖然工程周期完整,但領(lǐng)域本體的設(shè)計過程較為籠統(tǒng),缺乏考慮現(xiàn)有本體的共享和復(fù)用。七步法包含確定本體的專業(yè)領(lǐng)域和范疇、考查復(fù)用現(xiàn)有本體的可能性、列出本體中的重要術(shù)語、定義類和類的等級體系、定義類的屬性、定義屬性的分面和創(chuàng)建實例7 個步驟。雖有較為完整的本體分析環(huán)節(jié),但是缺少本體的質(zhì)量評估步驟。事實上,我們無法保證一次性得出的本體結(jié)構(gòu)就是最恰當?shù)哪P?。本體的構(gòu)建過程應(yīng)該是迭代進行的,即先構(gòu)造基礎(chǔ)本體,再根據(jù)實際應(yīng)用需求不斷完善。因此,本文融合骨架法和七步法設(shè)計了世家譜本體構(gòu)造方法,具體的構(gòu)造流程如圖2 所示。
圖2 世家譜本體構(gòu)造流程
作為孔子世家譜知識圖譜的模式層,世家譜本體用于描述孔氏家族的世系、人物概念及其之間的關(guān)系。因而,世家譜本體應(yīng)該準確描述記載家譜的書籍信息、家族支派信息和人員詳細信息,由此才能夠清晰反映出各人物及其之間的關(guān)系,以便進行人物分類,進而避免形成超級節(jié)點。
通過調(diào)研已有的家譜領(lǐng)域本體模型,對夏翠娟等人[11]的上海圖書館家譜本體和陳艷[12]的中國家譜知識本體進行分析復(fù)用。
本文從孔子世家譜中析取出相應(yīng)的重要術(shù)語,如表1 所示。
表1 孔子世家譜重要術(shù)語
為滿足知識圖譜的應(yīng)用需求,從術(shù)語中提取出集次、卷次、支派、世系代數(shù)和人物5 個核心類。Protege 中最頂層的類為Thing 類,5 個核心類均為該類的子類,其等級體系如圖3 所示。
圖3 世家譜本體的核心類
將核心類之外的術(shù)語進行歸納整理,作為屬性劃分給對應(yīng)的類,且明確類與類之間的關(guān)聯(lián)。類的屬性包括對象屬性和數(shù)據(jù)屬性。世家譜本體的5 個核心類共包含11 個對象屬性和若干數(shù)據(jù)屬性。使用Protege 表示的對象屬性和數(shù)據(jù)屬性分別如圖4和圖5 所示。
圖4 世家譜本體的對象屬性
圖5 世家譜本體的數(shù)據(jù)屬性
應(yīng)用本體建模工具Protege進行本體建模表示,且存儲為OWL 格式文件。
世家譜本體OWL 文件部分內(nèi)容如下。
建立本體是為了解決實際問題,因此要為本體填充實例。一方面,填充實例可以使得知識更加豐富;另一方面,在本體實例化過程中,可以利用填充的實例評估本體結(jié)構(gòu),初步判斷該本體是否符合應(yīng)用需求。圖6 展示了Protege 中的部分世家譜本體實例。
圖6 本體實例化示意
通過咨詢家譜領(lǐng)域和儒家文化領(lǐng)域的專家意見,以Thomas 提出的5 條本體構(gòu)建原則[14]為評價準則,證明了本文構(gòu)建的世家譜本體符合客觀事實和評價標準,遵循本體構(gòu)建原則,具有可行性,能夠滿足實際應(yīng)用需求。
通過迭代第2.3~2.8 章節(jié)的相關(guān)步驟,最終建立了符合本體評價要求的世家譜本體,模型如圖7所示。
圖7 世家譜本體模型
在世家譜本體中,大量的又名、字、號、居住地、墓葬地以及配偶等數(shù)據(jù)屬性蘊含于人物的生平事跡中,可以使用基于規(guī)則的實體識別技術(shù)進行提取。
基于規(guī)則的實體識別中,首先對要抽取的某個實體類型進行數(shù)據(jù)分析和統(tǒng)計。其次,迭代制定、測試分析和更新規(guī)則,直到識別出更多更準確的實體為止。最后,將規(guī)則應(yīng)用于全部數(shù)據(jù),完成該實體類型的識別。
下面以又名、號和壽數(shù)3 個數(shù)據(jù)屬性為例,詮釋實體的具體識別過程。
通過統(tǒng)計,又名的前綴一般包括本名、一名、初名、改名、后名、又名、原名、學(xué)名、官名以及庠名等,且可以先將又名的字數(shù)默認與名的字數(shù)相同,然后根據(jù)以下條件更改字符串長度。
條件1:若取2 個漢字超出字數(shù)范圍,則只取1 個漢字。
條件2:按照生平事跡的書寫格式,“又名”后一般緊跟“字”的描述。因此,當“名”的字數(shù)為1 時,且“名”后的第3 個字為“字”時,“又名”取2 個漢字;否則,當“名”的字數(shù)為2,且提取的又名第二個字為“字”字時,則只取1 個漢字。
另外,每個人只存在一個又名,因此只取匹配到的第一個字符串為人物的又名。
綜上所述,又名實體的識別規(guī)則如下:
(本名|一名|初名|改名|后名|又名|原名|學(xué)名|官名|庠名)<人物的又名>(字)?
將以上規(guī)則應(yīng)用于全部數(shù)據(jù)中,共識別出又名29 626 例。識別效果如圖8 所示。
圖8 “又名”實體識別示例
從《孔子世家譜》原始數(shù)據(jù)中隨機抽取出1 000 條存在號的數(shù)據(jù)作為測試數(shù)據(jù),用以規(guī)則的制定。通過對測試數(shù)據(jù)的統(tǒng)計和分析發(fā)現(xiàn),古人的號通常由兩個漢字組成,但也有例外,如有些人會使用特定名詞另起一個別號。比如,3 個漢字號的形式通常為“號+{兩個漢字}+(子|翁|叟|人)”,4 個漢字的形式通常為“號+{兩個漢字}+(先生|老人|居士|外史|山人|散人|道人)”等。因此,號的識別規(guī)則可以表示為:
號<人物的號>(先生|老人|居士|外史|山人|散人|道人|漁|樵|翁|叟|人)?
將以上規(guī)則應(yīng)用于全部數(shù)據(jù)中,共識別出號2 332 例,其中有9 例存在別號。識別效果如圖9 所示。
圖9 號實體識別示例
壽數(shù)在數(shù)據(jù)中的形式比較統(tǒng)一,描述為“年XXX 卒,卒年XXX,年XXX 薨,薨年XXX”,因此規(guī)則描述如下。
規(guī)則1:年<人物壽數(shù)>(卒|薨)
規(guī)則2:(卒年|薨年)<人物壽數(shù)>
將以上規(guī)則應(yīng)用于全部數(shù)據(jù)中,共識別出壽數(shù)175 例。識別效果如圖10 所示。
圖10 “壽數(shù)”實體識別示例
此外,從生平事跡中提取出“字”實體7 644 例,“出生日期”實體327 694 例,“死亡日期”實體22 132 例,“配偶”實體222 716 例,“居住地”實體84 019 例,“墓葬地”實體94 例。
在《孔子世家譜》中,僅初集卷就包含了65萬余節(jié)點實例、325 萬余關(guān)系實例和325 萬余屬性實例??紤]到孔子世家譜數(shù)據(jù)量大、知識圖譜圖結(jié)構(gòu)本質(zhì)和世家譜應(yīng)用實時性需求,本文使用Neo4j圖數(shù)據(jù)庫實現(xiàn)知識圖譜的持久化與Web 可視化。
采用neo4j-admin import 工具將家譜數(shù)據(jù)導(dǎo)入圖數(shù)據(jù)庫Neo4j,具體操作步驟如下。
4.1.1 節(jié)點CSV 文件
使用Neo4j-admin import 工具存儲知識圖譜,需要先建立圖譜節(jié)點的CSV 文件。每個節(jié)點必須有一個全局唯一的ID,從而在創(chuàng)建節(jié)點之間關(guān)系時便于引用。
為集次等5 個核心類單獨建立了CSV 節(jié)點文件,每個節(jié)點文件都有對應(yīng)的頭文件(Header File),且頭文件與數(shù)據(jù)文件分開保存。
設(shè)置的數(shù)據(jù)節(jié)點文件如下:
(1)jici_data.csv:集次節(jié)點文件;
(2)juanci_data.csv:卷次節(jié)點文件;
(3)zhipai_data.csv:支派節(jié)點文件;
(4)shixi_data.csv:世系代數(shù)節(jié)點文件;
(5)person_data.csv:人物節(jié)點文件。
上述5 個數(shù)據(jù)文件中的每一行代表一個實例,每一列描述該實例的不同屬性,且屬性名與頭文件中的內(nèi)容一一對應(yīng)。
例如,人物節(jié)點文件部分內(nèi)容如圖11 所示。其中,ID(personID)為“0100004”的人物名(Given Name)是“白”,性別(Gender)為“男”,沒有出嗣(Adopting),壽數(shù)(Age)為“四十七”,子數(shù)(Number of Children)為“1”,墓葬地在“祖墓西北”。
圖11 人物節(jié)點文件示例
4.1.2 關(guān)系CSV 文件
Neo4j-admin import 工具通過連接節(jié)點ID 創(chuàng)建關(guān)系(relationships)。如前所述,核心類本體共涉及11 個關(guān)系,具體包括:
(1)集次→卷次(有卷次);
(2)卷次→集次(屬于集次);
(3)卷次→支派(有支派);
(4)支派→卷次(屬于卷次);
(5)支派→人物(有人物);
(6)人物→支派(屬于支派);
(7)人物→世系(是世代);
(8)人物→人物(有孩子);
(9)人物→人物(有父親);
(10)人物→人物(有母親);
(11)人物→人物(相同人物sameAs)。
與上述11 個關(guān)系對應(yīng),分別創(chuàng)建相應(yīng)的CSV文件。例如,“有父親”關(guān)系的CSV 文件部分內(nèi)容如圖12 所示。
圖12 人物關(guān)系文件示例
可以看出,節(jié)點ID 為“01000005”和“01000004”的人物間存在“有父親”的關(guān)系。兩節(jié)點分別對應(yīng)圖11 中的人物,“01000005”指代名為“求”的人,“01000004”指代名為“白”的人,“01000005,01000004,有父親”表明“求→有父親→白”,即“求”的父親是“白”。
4.1.3 批量導(dǎo)入Neo4j
使用Neo4j-admin import 命令批量導(dǎo)入數(shù)據(jù),需要先把所有CSV 文件置于導(dǎo)入目錄(.import),然后 在Neo4j-admin 的同級目錄中執(zhí)行import 命令。導(dǎo)入結(jié)果如圖13 所示??梢钥闯?,本文共導(dǎo)入了650 864 個節(jié)點實例、3 251 812 個關(guān)系和9 757 851 個屬性。導(dǎo)入過程僅用了9.764 s,內(nèi)存使用峰值為1.04 GB。
圖13 批量導(dǎo)入結(jié)果指標
Neo4j 啟動完畢后,打開瀏覽器輸入Neo4j 的本地網(wǎng)址(默認為http://localhost:7474),即可看到知識三元組的可視化視圖,如圖14 所示。
圖14 孔子世家譜知識圖譜可視化效果示例
本文以《孔子世家譜》為基礎(chǔ),提出了世家譜本體構(gòu)造方法,并使用該方法構(gòu)建了世家譜本體模型。此外,使用基于規(guī)則的實體識別進行信息抽取,將數(shù)據(jù)存儲在Neo4j 圖數(shù)據(jù)庫中,實現(xiàn)了孔子世家譜知識圖譜的構(gòu)建??鬃邮兰易V圖譜化便于挖掘孔子世家譜中的隱藏關(guān)聯(lián),有助于儒家文化的研究學(xué)習(xí)。本文對孔子世家譜知識圖譜構(gòu)建進行了探索,但由于主要考慮使用《孔子世家譜》原始數(shù)據(jù)構(gòu)建知識圖譜,對其他相關(guān)文獻利用不充分,在未來工作中將進一步挖掘蘊含在其他文獻中的家譜知識,用以更新世家譜本體和孔子世家譜知識圖譜。