上一篇已經對 Answer 系統的基本原理做了簡單的分析和介紹,接下來的兩篇文章將介紹 Answer 系統中的本體構建模塊。本體構建模塊完成的主要功能是爬取百度百科頁面的數據并基于規則構建起本體庫。
本體庫是整個系統的關鍵知識來源,是實現同名實體識別、實體別名識別等功能的關鍵。
但在講解本體構建模塊的實現之前,需要對諸如"本體"、"RDF/RDFS"、"OWL"等概念和"WebMagic"、"Jena"等涉及到的技術做一下基本介紹。
何為本體
本體概念最早源自于哲學領域,是事物的本源和根本。
從哲學中的本體論上講,我們所看到的,所聽到的和所感覺到的一切都只是事物的一種現象表示。
比如我們說一朵玫瑰是紅色的,并不表示紅色是這朵玫瑰的自身具有的根本屬性,因為顏色只是光線帶給我們的一種視覺效果。
同樣的,我們聞到的玫瑰的香味、觸摸玫瑰花時的觸感都只是一種感官上的印象,是我們的感官對玫瑰的一種表達。人們對玫瑰的所有描述都只是一種符號,對它的所有認識都只是一種現象,而這些符號和表象都將指向玫瑰的本源。
因此在哲學本體論并認為玫瑰這個事物根本或事物本源是客觀存在的,但同時也是不可認知的,這個事物本源并稱之為本體。
當然在計算機領域引入本體之后,并沒有這么高層次的概念和理解。在計算機領域中我們將本體定義成一種計算機可操作、可理解、可計算的概念。目前業內有許多關于本體的定義,其中最受認可的是 Studer 給出的理解:
An ontology is a formal, explicit specification of a shared conceptualization.”
本體是共享概念模型的明確的形式化規范說明。
其中定義了本體幾層含義。
-
概念模型
本體是對現實世界概念模型的表達和說明 -
明確
所定義的概念、概念相關的屬性以及概念之間的關系等都必須具有明確的含義 -
形式化
不同于哲學領域的定義,計算機領域的本體是形式化的,是計算機能夠理解和處理的 -
共享
是領域公認的概念和知識,能夠相互分享和操作
簡而言之,計算機世界中的本體就是利用計算機描述語言如 RDF/RDFS/OWL 等(可以采用 XML、JSON 等語法格式實現)去對現實世界中的概念進行說明定義,也就是用計算機可理解的數據模型來描述現實中的"本體",而在構建的過程中要注意其共享性和規范性。
本體構建語言
如前所說,我們希望在計算機世界里構建并描述現實世界中的概念,那么我們就需要一些規范、標準、強大的本體構建語言(也可稱為本體標記語言或本體表示語言)。
目前已有很多不同的本體構建語言,而主流的本體構建語言主要有 RDF/RDFS、OWL 等。
-
RDF
資源定義框架(Resource Description Framework),簡稱為 RDF,是 W3C 提出的 Web 元數據描述語言標準。它能夠描述互聯網資源之間的關系,其語法格式也以可擴展標記語言 XML 為基礎。其主要由一系列的三元組組成,三元組的主要形式為“主體-謂語-客體”,這里的謂語并不局限于動詞,而是表達主體和客體之間的關系。
例如"周星馳-年齡-xx" 這一個三元組中,"周星馳"是三元組中的主體,"年齡"(屬性名)是謂語,"xx"(屬性值)就是客體。 -
RDFS
RDFS 是在 RDF 的基礎上對其進行了適當擴展,相對于 RDF,RDFS 能夠描述類與類之間、屬性與屬性之間的層次關系、資源之間的關系,因此 RDFS 具有更加強大表達能力。例如 subClassOf 表達類與類之間的父子關系,subPropertyOf 表達屬性與屬性之間的父子關系。 -
OWL
OWL 是 Web Ontology Language 的縮寫,其中文含義即為網絡本體語言。W3C 設計了三種不同程度的 OWL 子語言,分別為 OWL Lite、OWL DL 和 OWL Full,三種語言在本體描述能力上依次增強,并且高表達能力語言可兼容低表達能力語言,我們可根據不同的應用場景選擇不同程度的表達語言。
利用上述語言就可以構建本體庫,并在本體庫表達一些知識,如下所示(使用 OWL 構建):
<?xml version="1.0"?>
<Ontology xmlns="http://www.w3.org/2002/07/owl#"
xml:base="http://www.semanticweb.org/yue/ontologies/2018/2/untitled-ontology-5"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
ontologyIRI="http://www.semanticweb.org/yue/ontologies/2018/2/untitled-ontology-5">
<Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/>
<Prefix name="rdf" IRI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
<Prefix name="xml" IRI="http://www.w3.org/XML/1998/namespace"/>
<Prefix name="xsd" IRI="http://www.w3.org/2001/XMLSchema#"/>
<Prefix name="rdfs" IRI="http://www.w3.org/2000/01/rdf-schema#"/>
<Declaration>
<ObjectProperty IRI="#妻子"/>
</Declaration>
<Declaration>
<NamedIndividual IRI="#周杰倫"/>
</Declaration>
<Declaration>
<Class IRI="#人"/>
</Declaration>
<Declaration>
<NamedIndividual IRI="#昆凌"/>
</Declaration>
<ClassAssertion>
<Class IRI="#人"/>
<NamedIndividual IRI="#周杰倫"/>
</ClassAssertion>
<ClassAssertion>
<Class IRI="#人"/>
<NamedIndividual IRI="#昆凌"/>
</ClassAssertion>
<ObjectPropertyAssertion>
<ObjectProperty IRI="#妻子"/>
<NamedIndividual IRI="#周杰倫"/>
<NamedIndividual IRI="#昆凌"/>
</ObjectPropertyAssertion>
</Ontology>
<!-- Generated by the OWL API (version 4.2.8.20170104-2310) https://github.com/owlcs/owlapi -->
上述 OWL 語言表達了以下現實知識:
-
存在著名為"妻子"的對象屬性
如下所示:<Declaration> <ObjectProperty IRI="#妻子"/> </Declaration>
- 對象屬性:對象之間的關系稱之為對象屬性,如 "周杰倫-妻子-昆凌",其中 "妻子" 為兩個對象實體之間的關系,稱之為對象屬性。
- 數據屬性:如 "周星馳-年齡-xx" 中的 "年齡" 是 "周星馳" 和數據 xx 之間的關系,這種關系稱為數據屬性。
-
存在著 "人" 這個類型
如下所示:<Declaration> <Class IRI="#人"/> </Declaration>
-
存在著 "周杰倫" 這個對象實體
如下所示:<Declaration> <NamedIndividual IRI="#周杰倫"/> </Declaration>
-
存在著 "昆凌" 這個對象實體
如下所示:<Declaration> <NamedIndividual IRI="#昆凌"/> </Declaration>
-
"周杰倫" 屬于人這個類型
如下所示:<ClassAssertion> <Class IRI="#人"/> <NamedIndividual IRI="#周杰倫"/> </ClassAssertion>
-
"昆凌" 屬于人這個類型
如下所示:<ClassAssertion> <Class IRI="#人"/> <NamedIndividual IRI="#昆凌"/> </ClassAssertion>
-
"周杰倫" 的妻子是 "昆凌",即 "周杰倫-妻子-昆凌"
如下所示:<ObjectPropertyAssertion> <ObjectProperty IRI="#妻子"/> <NamedIndividual IRI="#周杰倫"/> <NamedIndividual IRI="#昆凌"/> </ObjectPropertyAssertion>
本體操作框架 Jena
現在我們已經有了 RDF、RDFS 和 OWL 等本體構建語言來構建本體庫了,但是我們該如何對這些語言描述的數據進行查詢、插入、刪除、更新等操作呢?自然是需要寫相應的程序來解析和操作這些 RDF / RDFS / OWL 數據。
但像這種底層需求的功能自然已經有相應的輪子以供高層應用開發者使用。Jena 便是這樣一款滿足我們需求的開源框架,它提供了一系列強大的 API 實現對本體庫的插入、查詢等操作。
關于 Jena 的下載和詳細 API 文檔等可參見官網 Apache Jena
爬蟲框架 WebMagic
有了 RDF、OWL 等本體庫構建語言以及對本體庫進行查詢操作的 Jena 之后,我們就可以編寫程序向本體庫中插入或更新各種 "知識" 了。
但是這些 "知識" 來源于哪里?又該如何生成?這里又是一塊深不見底的坑,也是目前學術界比較活躍的研究領域,尤其是從非結構文本中提取知識。
當前版本的 Answer 采用最簡單最土的方式——數據來源于半結構化的百度百科,并基于規則,通過定義規則的方式來進行分類、插入屬性、建立對象之間關系等,從而生成一系列的知識插入到本體庫中。
那么這里自然需要一個爬蟲去抓取百度百科的數據,這里采用開源的 Java 爬蟲框架 WebMagic,關于 WebMagic 的使用教程和文檔請查看官方網站 http://webmagic.io/
下一篇
下一篇講解本體構建模塊的實現。
汪
汪.