1. 程式人生 > >實踐篇(一):資料準備和本體建模

實踐篇(一):資料準備和本體建模

對知識圖譜有興趣的讀者可以關注我的知乎專欄,主要介紹知識圖譜的相關概念、技術,也包含一些具體實踐。

通過前面幾篇文章的介紹,讀者應該對知識圖譜,其相關概念,以及語義網技術棧中的RDF,RDFS/OWL有了一定的瞭解。然而,之前我們都是在介紹一些概念性的東西。實踐才出真知,理論掌握得再好,不能解決實際問題也只是紙上談兵。因此,筆者準備開一個實踐篇,結合理論篇,讓讀者能夠從無到有構建一個領域知識圖譜,並在其上搭建一個基於知識圖譜的問答小程式。demo比較簡單,問答實現是基於模板匹配和正則表示式,整個流程是為了讓讀者對知識圖譜及其相關應用有個直觀的認識。

本文作為實踐篇第一篇文章,首先介紹我們使用的資料、資料來源和資料獲取方法;其次,基於資料內部關係,介紹如何以自頂向下的方式構建本體結構。

一、資料準備

實踐篇使用的資料是與電影相關的。基本統計資料如下:
1. 演員數量:505人
2. 電影數量:4518部
3. 電影型別:19類
4. 人物與電影的關係:14451
5. 電影與型別的關係:7898

演員的基本資訊包括:姓名、英文名、出生日期、死亡日期、出生地、個人簡介。

電影的基本資訊包括:電影名稱、電影簡介、電影評分、電影發行日期、電影型別。

資料是從“The Movie DB”網站獲取的,官方提供註冊使用者API KEY用於查詢和下載資料。我本來打算從豆瓣獲取電影資料,但現在豆瓣API已經關閉了個人使用者申請入口。

本例項資料獲取方法:以周星馳為初始入口,獲取其出演的所有電影;再獲取這些電影的所有參演演員;最後獲取所有參演演員所出演的全部電影。經過去重處理,我們得到了505個演員的基本資訊和4518部電影的基本資訊。資料儲存在mysql中,其ER圖如下:
er_movie

讀者可以直接下載我們獲取到的資料,或者用我們提供的指令碼自己從網站獲取額外的資料,再或者根據自己的需要重新編寫指令碼。

二、本體建模

本體的構建大體有兩種方式:自頂向下和自底向上。
1. 開放域知識圖譜的本體構建通常用自底向上的方法,自動地從知識圖譜中抽取概念、概念層次和概念之間的關係。這也很好理解,開放的世界太過複雜,用自頂向下的方法無法考慮周全,且隨著世界變化,對應的概念還在增長。
2. 領域知識圖譜多采用自頂向下的方法來構建本體。一方面,相對於開放域知識圖譜,領域知識圖譜涉及的概念和範圍都是固定或者可控的;另一方面,對於領域知識圖譜,我們要求其滿足較高的精度。現在大家接觸到的一些語音助手背後對接的知識圖譜大多都是領域知識圖譜,比如音樂知識圖譜、體育知識圖譜、烹飪知識圖譜等等。正因為是這些領域知識圖譜來滿足使用者的大多數需求,更需要保證其精度。

本例項是一個電影領域的知識圖譜,我們採用自頂向下的方法來構建本體結構。首先介紹下我們使用的工具protege(點選進入官網下載):

Protégé,又常常簡單地拼寫為“Protege”,是一個斯坦福大學開發的本體編輯和知識獲取軟體。
開發語言採用Java,屬於開放原始碼軟體。由於其優秀的設計和眾多的外掛,Protégé已成為目前使用最廣泛的本體論編輯器之一(來自維基百科)。

開啟protege,看到和下圖類似的介面。在Ontology IRI中填寫我們新建本體資源的IRI。讀者可以填寫自己的符合標準的IRI。

protege

點選“Entities”tab標籤,選擇“Classes”標籤。在這個介面,我們建立電影知識圖譜的類/概念。注意,所有的類都是“Thing”的子類。最左邊紅色小方框中的按鈕用於建立當前選中類的子類,中間的按鈕用於建立兄弟類(平行類),最右邊的按鈕刪除當前選中的類。我們建立了三個類,“人物”、“電影”、“類別”。右下方的介面是用於描述該類的一些特性,例如:”disjoint of”是用於表示該類與哪些類是互斥的。本例中,三個類都是互斥的。也就是說,一個例項只能是三個類中的一個。我們沒有在protege中顯式地定義互斥關係,讀者可以自己定義。

class

接下來我們切換到”Object Properties”頁面,我們在此介面建立類之間的關係,即,物件屬性。這裡我們建立了三個物件屬性,”hasActedIn”表示某人蔘演了某電影,因此我們在右下方的3號矩形框中定義該屬性的”domain”是人,4號框定義”range”是電影。這個很好理解,”domain”表示該屬性是屬於哪個類的,”range”表示該屬性的取值範圍。2號框表示該屬性的逆屬性是”hasActor”,即,有了推理機,儘管我們的RDF資料只儲存了A出演了B,我們在查詢的時候也能得到B的演員有A。1號方框中是一些描述該屬性的詞彙,我們在上一篇文章中已經介紹過,這裡不再贅述。同理,我們定義另外兩個屬性,這裡不再展示。

obeject property

最後,我們切換到”Data properties”,我們在該介面建立類的屬性,即,資料屬性。其定義方法和物件屬性類似,除了沒有這麼豐富的描述屬性特性的詞彙。其實不難理解,這些描述特性的詞彙是傳遞、對稱、反對稱、自反等,表明其必定有指向其他資源或自身的邊,而我們之前提到過,資料屬性相當於樹的葉子節點,只有入度,而沒有出度。

data property

其實區分資料屬性和物件屬性還有一個很直觀的方法,我們觀察其”range”,取值範圍即可。物件屬性的取值範圍是類,而資料屬性的取值範圍則是字面量,如下圖。

range

protege也支援以視覺化的方式來展示本體結構。我們點選”Window”選項,在”Tabs”中選擇”OntoGraf”,然後”Entities”旁邊就多了一個標籤頁。在右側視窗中移動元素,可以很直觀地觀察本體之間的關係。
image

在這個小節,我們簡單地介紹瞭如何用protege自頂向下地構建知識圖譜的本體結構。對於Protege更詳細的操作和介紹,請參考這篇文件

總結

這篇文章介紹了接下來實踐中使用的資料,以及如何利用protege,根據我們的資料來進行本體建模。資料、程式碼以及本體檔案我都上傳到了github。之後實踐篇涉及到的所有檔案我都會放在該專案中。下一篇實踐文章將介紹關係資料庫中的資料轉換為RDF的幾種方法,讓讀者學會如何把存在Mysql中的電影資料轉為RDF格式的資料。