張政平,倪建成
(曲阜師范大學,山東 濟寧 273165)
家譜是一種表譜形式的特殊文獻,記載了以血緣關系為主體的家族世系繁衍信息和重要人物的相關事跡信息等。它不僅包含了整個家族可追溯的家族來源、遷徙軌跡以及人物描述等結構化數據,還隱含了獨有的文化傳承、族規家約等歷史文化信息。《孔子世家譜》(2009 版)作為“世界最長家譜”[1],全譜共分108 卷,首次收錄了女性族人、少數民族和外籍后裔的資料,增加了性別、配偶等個人信息,且已于2016 年實現了孔子世家譜的數字化續修系統[2],使用關系型數據庫存儲世家譜數據。然而,隨著家譜數據的不斷豐富,家譜信息的復合查詢、語義推理與分析等需求急劇擴增,導致傳統的家譜數據管理方式[3]已經無法滿足上述需求所需要的實時、自動推理和可視化等特性。
知識圖譜是一種能夠可視化的信息表達方法,便于人們準確、清晰地獲取數據。本體作為一種語義數據模型,用于定義特定領域的概念、屬性及其相互關系,實現領域建模和推理。因此,將知識圖譜和本體有效結合可以更準確地分析家譜領域知識之間的邏輯關聯。
知識圖譜的構建一般采用自頂向下和自底向上兩種方式[4]。自頂向下的方法通常用于領域知識圖譜,先定義本體與數據模式,再填充實體形成完整的知識圖譜,如FreeBase。自底向上的方法則先從開放連接數據中提取實體,再選擇置信度超過閾值的實體-關系對加入知識庫,最后構建頂層的本體結構和數據模式[5]。
在知識圖譜構建過程中,數據層的填充需要使用實體識別技術。實體識別大致可分為基于規則[6]、基于統計學習[7]和基于機器學習[8-10]3 種方法。基于統計學習的方法對人工特征選擇要求較高,對語料庫的依賴較大。基于機器學習的方法雖在預測過程中無需過多的人工干預,但在訓練模型時仍需大量的人工標注信息。基于規則的方法需要領域專家的支持,難以移植到新領域,但是準確率高、直觀性好,更加接近人類的思考方式。對于孔子世家譜原始數據,從零開始標注數據的任務量較大。某些實體類型的數據量比較稀疏,使用統計學習、機器學習方法會導致模型欠擬合或訓練不充分。此外,孔子世家譜的結構比較單一,有一定的規律性。因此,使用基于規則的實體識別是最佳選擇。
目前,家譜領域本體的研究工作屈指可數。夏翠娟等人[11]設計了基于書目框架(Bibframe)的上海圖書館家譜本體。該本體以一個家族為最小單位進行資源描述,無法描述家族中的具體人物及其關系和屬性。陳艷[12]構建了中國家譜知識本體,本體面向多宗族家譜,規模較為龐大。孔子世家譜記載了孔子后人詳細的人物信息,包括人物的名、字、號、性別、世系代數、支派、出嗣情況以及生平事跡等。對于孔子世家譜數據而言,現有的本體結構規模冗余且粒度過粗。
此外,相對于關系數據庫而言,圖數據庫更適合處理大規模數據,可以避免關系數據庫涉及多表的復合查詢時的表聯接復雜性和低效性,從而提升用戶體驗。Neo4j 是一個開源的圖數據庫管理系統,以面向圖的存儲格式將數據存儲在本地文件,具備完全事務特性,能夠高效執行結構化數據的各項操作。另外,Neo4j 使用聲明式的模式匹配查詢語言Cypher。相對于SPARQL,它更加易于理解和操作,對大規模的數據庫應用至關重要。
綜上,目前構建孔子世家譜知識圖譜存在兩方面的問題。一方面,當前領域本體建模方法不完善,現有家譜本體無法準確描述世家譜數據。另一方面,基于關系型數據庫存儲的孔子世家譜續修系統數據存取效率低,且無法挖掘家譜數據之間的語義關聯。
針對以上問題,本文采用自頂向下的方式構建孔子世家譜知識圖譜:
(1)在孔子世家譜原始數據的基礎上,提出一種世家譜本體構造方法,并依據此方法建立世家譜本體結構;
(2)根據世家譜本體的約束,抽取非結構化數據中的實體,并將實體數據整合為知識三元組;
(3)將知識三元組存儲至Neo4j 圖數據庫,完成初始的孔子世家譜知識圖譜構建。
本文在構建孔子世家譜知識圖譜時,按照知識圖譜的生命周期,將構建流程分為本體構建、知識抽取和知識存儲等3 個步驟。構建流程如圖1 所示。

圖1 孔子世家譜知識圖譜構建流程
首先,提出融合骨架法和七步法的世家譜本體構造方法,并據此構建本體。其次,采用基于規則的實體識別方法抽取實體,并整合完成知識抽取。最后,利用圖數據庫Neo4j 存儲知識圖譜。
七步法[13]和骨架法是現有構建領域本體的常用方法。骨架法分為確定知識本體應用的目的和范圍、本體分析、本體表示、本體評價和本體建立5個環節。當本體不符合評價標準時,重新進行本體分析。骨架法雖然工程周期完整,但領域本體的設計過程較為籠統,缺乏考慮現有本體的共享和復用。七步法包含確定本體的專業領域和范疇、考查復用現有本體的可能性、列出本體中的重要術語、定義類和類的等級體系、定義類的屬性、定義屬性的分面和創建實例7 個步驟。雖有較為完整的本體分析環節,但是缺少本體的質量評估步驟。事實上,我們無法保證一次性得出的本體結構就是最恰當的模型。本體的構建過程應該是迭代進行的,即先構造基礎本體,再根據實際應用需求不斷完善。因此,本文融合骨架法和七步法設計了世家譜本體構造方法,具體的構造流程如圖2 所示。

圖2 世家譜本體構造流程
作為孔子世家譜知識圖譜的模式層,世家譜本體用于描述孔氏家族的世系、人物概念及其之間的關系。因而,世家譜本體應該準確描述記載家譜的書籍信息、家族支派信息和人員詳細信息,由此才能夠清晰反映出各人物及其之間的關系,以便進行人物分類,進而避免形成超級節點。
通過調研已有的家譜領域本體模型,對夏翠娟等人[11]的上海圖書館家譜本體和陳艷[12]的中國家譜知識本體進行分析復用。
本文從孔子世家譜中析取出相應的重要術語,如表1 所示。

表1 孔子世家譜重要術語
為滿足知識圖譜的應用需求,從術語中提取出集次、卷次、支派、世系代數和人物5 個核心類。Protege 中最頂層的類為Thing 類,5 個核心類均為該類的子類,其等級體系如圖3 所示。

圖3 世家譜本體的核心類
將核心類之外的術語進行歸納整理,作為屬性劃分給對應的類,且明確類與類之間的關聯。類的屬性包括對象屬性和數據屬性。世家譜本體的5 個核心類共包含11 個對象屬性和若干數據屬性。使用Protege 表示的對象屬性和數據屬性分別如圖4和圖5 所示。

圖4 世家譜本體的對象屬性

圖5 世家譜本體的數據屬性
應用本體建模工具Protege進行本體建模表示,且存儲為OWL 格式文件。
世家譜本體OWL 文件部分內容如下。

建立本體是為了解決實際問題,因此要為本體填充實例。一方面,填充實例可以使得知識更加豐富;另一方面,在本體實例化過程中,可以利用填充的實例評估本體結構,初步判斷該本體是否符合應用需求。圖6 展示了Protege 中的部分世家譜本體實例。

圖6 本體實例化示意
通過咨詢家譜領域和儒家文化領域的專家意見,以Thomas 提出的5 條本體構建原則[14]為評價準則,證明了本文構建的世家譜本體符合客觀事實和評價標準,遵循本體構建原則,具有可行性,能夠滿足實際應用需求。
通過迭代第2.3~2.8 章節的相關步驟,最終建立了符合本體評價要求的世家譜本體,模型如圖7所示。

圖7 世家譜本體模型
在世家譜本體中,大量的又名、字、號、居住地、墓葬地以及配偶等數據屬性蘊含于人物的生平事跡中,可以使用基于規則的實體識別技術進行提取。
基于規則的實體識別中,首先對要抽取的某個實體類型進行數據分析和統計。其次,迭代制定、測試分析和更新規則,直到識別出更多更準確的實體為止。最后,將規則應用于全部數據,完成該實體類型的識別。
下面以又名、號和壽數3 個數據屬性為例,詮釋實體的具體識別過程。
通過統計,又名的前綴一般包括本名、一名、初名、改名、后名、又名、原名、學名、官名以及庠名等,且可以先將又名的字數默認與名的字數相同,然后根據以下條件更改字符串長度。
條件1:若取2 個漢字超出字數范圍,則只取1 個漢字。
條件2:按照生平事跡的書寫格式,“又名”后一般緊跟“字”的描述。因此,當“名”的字數為1 時,且“名”后的第3 個字為“字”時,“又名”取2 個漢字;否則,當“名”的字數為2,且提取的又名第二個字為“字”字時,則只取1 個漢字。
另外,每個人只存在一個又名,因此只取匹配到的第一個字符串為人物的又名。
綜上所述,又名實體的識別規則如下:
(本名|一名|初名|改名|后名|又名|原名|學名|官名|庠名)<人物的又名>(字)?
將以上規則應用于全部數據中,共識別出又名29 626 例。識別效果如圖8 所示。

圖8 “又名”實體識別示例
從《孔子世家譜》原始數據中隨機抽取出1 000 條存在號的數據作為測試數據,用以規則的制定。通過對測試數據的統計和分析發現,古人的號通常由兩個漢字組成,但也有例外,如有些人會使用特定名詞另起一個別號。比如,3 個漢字號的形式通常為“號+{兩個漢字}+(子|翁|叟|人)”,4 個漢字的形式通常為“號+{兩個漢字}+(先生|老人|居士|外史|山人|散人|道人)”等。因此,號的識別規則可以表示為:
號<人物的號>(先生|老人|居士|外史|山人|散人|道人|漁|樵|翁|叟|人)?
將以上規則應用于全部數據中,共識別出號2 332 例,其中有9 例存在別號。識別效果如圖9 所示。

圖9 號實體識別示例
壽數在數據中的形式比較統一,描述為“年XXX 卒,卒年XXX,年XXX 薨,薨年XXX”,因此規則描述如下。
規則1:年<人物壽數>(卒|薨)
規則2:(卒年|薨年)<人物壽數>
將以上規則應用于全部數據中,共識別出壽數175 例。識別效果如圖10 所示。

圖10 “壽數”實體識別示例
此外,從生平事跡中提取出“字”實體7 644 例,“出生日期”實體327 694 例,“死亡日期”實體22 132 例,“配偶”實體222 716 例,“居住地”實體84 019 例,“墓葬地”實體94 例。
在《孔子世家譜》中,僅初集卷就包含了65萬余節點實例、325 萬余關系實例和325 萬余屬性實例。考慮到孔子世家譜數據量大、知識圖譜圖結構本質和世家譜應用實時性需求,本文使用Neo4j圖數據庫實現知識圖譜的持久化與Web 可視化。
采用neo4j-admin import 工具將家譜數據導入圖數據庫Neo4j,具體操作步驟如下。
4.1.1 節點CSV 文件
使用Neo4j-admin import 工具存儲知識圖譜,需要先建立圖譜節點的CSV 文件。每個節點必須有一個全局唯一的ID,從而在創建節點之間關系時便于引用。
為集次等5 個核心類單獨建立了CSV 節點文件,每個節點文件都有對應的頭文件(Header File),且頭文件與數據文件分開保存。
設置的數據節點文件如下:
(1)jici_data.csv:集次節點文件;
(2)juanci_data.csv:卷次節點文件;
(3)zhipai_data.csv:支派節點文件;
(4)shixi_data.csv:世系代數節點文件;
(5)person_data.csv:人物節點文件。
上述5 個數據文件中的每一行代表一個實例,每一列描述該實例的不同屬性,且屬性名與頭文件中的內容一一對應。
例如,人物節點文件部分內容如圖11 所示。其中,ID(personID)為“0100004”的人物名(Given Name)是“白”,性別(Gender)為“男”,沒有出嗣(Adopting),壽數(Age)為“四十七”,子數(Number of Children)為“1”,墓葬地在“祖墓西北”。

圖11 人物節點文件示例
4.1.2 關系CSV 文件
Neo4j-admin import 工具通過連接節點ID 創建關系(relationships)。如前所述,核心類本體共涉及11 個關系,具體包括:
(1)集次→卷次(有卷次);
(2)卷次→集次(屬于集次);
(3)卷次→支派(有支派);
(4)支派→卷次(屬于卷次);
(5)支派→人物(有人物);
(6)人物→支派(屬于支派);
(7)人物→世系(是世代);
(8)人物→人物(有孩子);
(9)人物→人物(有父親);
(10)人物→人物(有母親);
(11)人物→人物(相同人物sameAs)。
與上述11 個關系對應,分別創建相應的CSV文件。例如,“有父親”關系的CSV 文件部分內容如圖12 所示。

圖12 人物關系文件示例
可以看出,節點ID 為“01000005”和“01000004”的人物間存在“有父親”的關系。兩節點分別對應圖11 中的人物,“01000005”指代名為“求”的人,“01000004”指代名為“白”的人,“01000005,01000004,有父親”表明“求→有父親→白”,即“求”的父親是“白”。
4.1.3 批量導入Neo4j
使用Neo4j-admin import 命令批量導入數據,需要先把所有CSV 文件置于導入目錄(.import),然后 在Neo4j-admin 的同級目錄中執行import 命令。導入結果如圖13 所示。可以看出,本文共導入了650 864 個節點實例、3 251 812 個關系和9 757 851 個屬性。導入過程僅用了9.764 s,內存使用峰值為1.04 GB。

圖13 批量導入結果指標
Neo4j 啟動完畢后,打開瀏覽器輸入Neo4j 的本地網址(默認為http://localhost:7474),即可看到知識三元組的可視化視圖,如圖14 所示。

圖14 孔子世家譜知識圖譜可視化效果示例
本文以《孔子世家譜》為基礎,提出了世家譜本體構造方法,并使用該方法構建了世家譜本體模型。此外,使用基于規則的實體識別進行信息抽取,將數據存儲在Neo4j 圖數據庫中,實現了孔子世家譜知識圖譜的構建。孔子世家譜圖譜化便于挖掘孔子世家譜中的隱藏關聯,有助于儒家文化的研究學習。本文對孔子世家譜知識圖譜構建進行了探索,但由于主要考慮使用《孔子世家譜》原始數據構建知識圖譜,對其他相關文獻利用不充分,在未來工作中將進一步挖掘蘊含在其他文獻中的家譜知識,用以更新世家譜本體和孔子世家譜知識圖譜。