######好好好好#####知識圖譜推理與實踐(1)

知識圖譜推理與實踐(1)

由於工作原因,需要在系統裏建立圖譜推理功能,因此簡單學習了浙江大學 陳華鈞教授 知識圖譜導論課程課件,這裏記錄下學習筆記。

知識圖譜推理的主要方法

• 基於描述邏輯的推理(如DL-based)
• 基於圖結構和統計規則挖掘的推理(如: PRA、 AMIE)
• 基於知識圖譜表⽰學習的推理(如: TransE)
• 基於概率邏輯的⽅法(如: Statistical Relational Learning)

基於符號邏輯的推理——本體推理

  • 傳統的符號邏輯推理中主要與知識圖譜有關的推理手段是基於描述邏輯的本體推理。
  • 描述邏輯主要被⽤來對事物的本體進⾏建模和推理,⽤來描述和推斷概念分類及其概念之間的關係。
  • 主要方法:
    • 基於表運算(Tableaux)及改進的⽅法: FaCT++、 Racer、 Pellet Hermit等
    • 基於Datalog轉換的⽅法如KAON、 RDFox等
    • 基於產⽣式規則的算法(如rete): Jena 、 Sesame、 OWLIM等

本體推理

基於圖結構和統計規則挖掘的推理

主要方法:
• 基於路徑排序學習⽅法(PRA, Path ranking Algorithm)
• 基於關聯規則挖掘⽅法(AMIE)

基於圖結構和統計規則挖掘的推理

基於知識圖譜表示學習的關係推理

  • 將實體和關係都表示爲向量
  • 通過向量之間的計算代替圖的遍歷和搜索來預測三元組的存在,由於向量的表示已經包含了實體原有的語義信息,計算含有⼀定的推理能⼒。
  • 可應⽤於鏈接預測,基於路徑的多度查詢等

表示學習推理

基於概率邏輯的⽅法——Statistical Relational Learning

概率邏輯學習有時也叫Relational Machine Learning (RML),關注關係的不確定性和複雜性。
通常使用Bayesian networks or Markov networks

PSL

基於符號邏輯的推理

本體概念推理

圖譜中基於RDF來作爲資源描述語言,RDF是Resource Description Framework的簡稱。

RDF

但是RDF表示關係層次受限,因此有了RDFS,在RDF的基礎上,新增了Class, subClassOf, type, Property, subPropertyOf, Domain, Range 詞彙,可以更好的表述相關關係。

RDFS

基於RDFS,可以做一些簡單的推理

RDFS推理

OWL在RDFS的基礎上,進一步擴展了一些複雜類型、約束:

OWL

因此,我們也叫OWL爲本體語言:

  • OWL是知識圖譜語言中最規範, 最嚴謹, 表達能力最強的語言
  • 基於RDF語法,使表示出來的文檔具有語義理解的結構基礎
  • 促進了統一詞彙表的使用,定義了豐富的語義詞彙
  • 允許邏輯推理

OWL的描述邏輯系統:

  • 一個描述邏輯系統包括四個基本的組成部分
    • 1)最基本的元素: 概念關係個體(實例),
    • 2) TBox術語集 (概念術語的公理集合) - 泛化的知識
      • 描述概念和關係的知識,被稱之爲公理 (Axiom)
    • 3) ABox斷言集 (個體的斷言集合) --具體個體的信息
      • ABox包含外延知識 (又稱斷言 (Assertion)),描述論域中
        的特定個體
    • 4) TBoxABox上的推理機制
  • 不同的描述邏輯系統的表示能力與推理機制由於對這四個組成部分的不同選擇而不同

描述邏輯的語義

描述邏輯與OWL的對應:

OWL

推理就是通過各種方法獲取新的知識或者結論,這些知識和結論滿足語義。

OWL本體推理

  • 可滿足性
    • 本體可滿足性: 檢查一個本體是否可滿足,即檢查該本體是否有模型。
    • 概念可滿足性,檢查某一概念的可滿足性,即檢查是否有模型,使得對該概念的解釋不是空集。

可滿足性

  • 分類(classification),針對Tbox的推理,計算新的概念的包含關係

分類

分類

  • 實例化(materialization),即計算屬於某個概念或關係的所有實例的集合。

實例化

例子:

實例化選股

典型的推理算法: Tableaux,適用於檢查某一本體概念的可滿足性,以及實例檢測,基本思想是通過一系列規則構建Abox,以檢測可滿足性,或者檢測某一實例是否存在於某概念,基本思想類似於一階邏輯的歸結反駁。

Tableaux

基於邏輯編程改寫的方法

本體推理的侷限:

  • (1) 僅支持預定義的本體公理上的推理 (無法針對自定義的詞彙支持靈活推理)
  • (2) 用戶無法定義自己的推理過程

因此,引入規則推理

  • (1) 可以根據特定的場景定製規則,以實現用戶自定義的推理過程
  • (2) Datalog語言可以結合本體推理和規則推理

Datalog的語法:

  • 原子(atom)
    • p(t1,t2,...,tn)
    • p是謂詞,n是目數,ti是項
    • 例如has_child(x,y)
  • 規則(rule)
    • H:-B1,B2,...,Bm
    • has_child(X, Y) :−has_son(X, Y)
  • 事實(Fact)
    • F(c1,c2,...cn):-
    • 沒有體部且沒有變量的規則
    • 例如:has_child(Alice,Bob):-

Datalog程序是規則的集合:

has_child(X, Y) : −has_son(X, Y).
has_child(Alice, Bob) : −

Datalog 推理舉例:

Datalog推理舉例

相關工具:

datalog工具

基於產生式規則的方法

產生式系統,一種前向推理系統,可以按照一定機制執行規則從而達到某些目標,與一階邏輯類似,也有區別,可以應用來做自動規劃和專家系統。

產生式系統的組成:

  • 事實集合 (Working Memory)
  • 產生式/規則集合 (Production Memory, PM)
  • 推理引擎

產生式表示:

IF conditions THEN actions

  • conditions是由條件組成的集合,又稱爲LHS(Left Hand Side)
  • actions是由動作組成的序列,又稱爲RHS(Right Hand Side)

LHS,是條件的集合,各條件是(AND)的關係,當所有條件均被滿足,則該規則觸發。
條件形如(type attr1: spec1 attr2:spec2)條件的形式:

  • 原子 (person name:alice)
  • 變量(person name:x)
  • 表達式 (person age:[n+4]
  • 布爾 (person age:{>10})
  • 約束的與、或、非

RHS,是執行動作(action)的序列,執行時依次運行。動作的種類有ADD pattern,Remove i,Modify i,可以理解爲對WME(Working Memory)的CUD;

產生式舉例:

IF (Student name: x)
Then ADD (Person name: x)

也可以寫作:

(Student name: x) ⇒ ADD (Person name: x)

推理引擎

➤ 控制系統的執行:

  • 模式匹配,用規則的條件部分匹配事實集中的事實,整個LHS都被滿足的規,則被觸發,並被加入議程(agenda)
  • 解決衝突,按一定的策略從被觸發的多條規則中選擇一條
  • 執行動作,執行被選擇出來的規則的RHS,從而對WM進行一定的操作

產生式系統=事實集+產生式集合+推理引擎

產生式系統執行流程

產生式系統執行流程

匹配舉例

模式匹配——RETE算法

  • 將產生式的LHS組織成判別網絡形式
  • 用空間換時間

RETE算法

相關工具介紹

  • Drools
  • Jena 提供了處理RDF、 RDFS、 OWL數據的接口,還提供了一個規則引擎
Model m = ModelFactory.createDefaultModel(); 
Reasoner reasoner = new
GenericRuleReasoner(Rule.rulesFromURL("file:rule.txt"));
InfModel inf = ModelFactory.createInfModel(reasoner, m)

相關工具

Inductive Reasoning – 基於圖的方法

PRA

➤ 將連接兩個實體的路徑作爲特徵來預測其間可能存在的關係

Inductive Reasoning

• 通用關係學習框架 (generic relational learning framework)

PRA

路徑排序算法 – Path Ranking Algorithm (PRA)

PRA2

enter description here

TransE

知識圖譜嵌⼊模型: TransE

TransE(Translating Embeddings for Modeling Multi-relational Data. NIPS 3013)

TransE

⽬標函數:

TransE

損失函數:

TransE 損失函數

知識圖譜嵌⼊模型: 預測問題

  • 測試三元組( h, r, t )
  • 尾實體預測( h, r, ? )
  • 頭實體預測( ?, r, t )

圖嵌入預測

PRA vs. TransE

PRA

基於Jena實現演繹推理

實踐圖譜

構建model

NO BB, show code:

Model myMod = ModelFactory.createDefaultModel();
String finance = “http://www.example.org/kse/finance#”;

// 實體
Resource shb = myMod.createResource(finance + "孫宏斌");
Resource rczg = myMod.createResource(finance + "融創中國");


// 關係

Property control = myMod.createProperty(finance + "執掌");

// 加入三元組
myMod.add(shb, control, rczg);

上圖所示的圖譜,包含如下的三元組:

finance :孫宏斌 finance :control finance :融創中國
finance :賈躍亭 finance :control finance :樂視網
finance :融創中國 rdf:type finance :地產公司
finance :地產公司 rdfs:subclassOf finance:公司
finance:公司 rdfs:subclassOf finance:法人實體
finance:孫宏斌 rdf:type finance:公司
finance:孫宏斌 rdf:type finance:人
finance :人 owl:disjointWith finance:公司

我們可以依次加入,代碼略。

添加推理機

jena推理使用的是InfModel,可以基於Model構造,實際上在原來的Model之上加了個RDFS推理機

InfModel inf_rdfs = ModelFactory.createRDFSModel(myMod);

• 上下位推理

通過listStatements來獲取是否有滿足條件的三元組,從而實現判斷,subClassOf是RDFS裏的vob,因此使用RDFS.subClassOf。

public static void subClassOf(Model m, Resource s, Resource o) {
for (StmtIterator i = m.listStatements(s, RDFS.subClassOf, o); i.hasNext(); ) {
Statement stmt = i.nextStatement();
System.out.println(" yes! " );
break;
}
}

subClassOf(inf_rdfs, myMod.getResource(finance+"地產公司"),myMod.getResource(finance+”法人實體"));

enter description here

• 針對類別的推理,OWL推理機可以針對個體類別做出完備推理,即補充完整該個體的所有類別;在查詢的時候,可以直接打印出所有類別!

首先構建owl推理機:

Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
InfModel inf_owl = ModelFactory.createInfModel(reasoner, myMod);

然後執行類別推理

public static void printStatements(Model m, Resource s, Property p, Resource o) {
for (StmtIterator i = m.listStatements(s,p,o); i.hasNext(); ) {
Statement stmt = i.nextStatement();
System.out.println(" - " + PrintUtil.print(stmt));
}
}
printStatements(inf_owl, rczg, RDF.type, null);

enter description here

• 不一致檢測, jena的另一個常用推理就是檢驗data的不一致。

Model data = FileManager.get().loadModel(fname);
Reasoner reasoner = ReasonerRegistry.getOWLReasoner();
InfModel inf_owl = ModelFactory.createInfModel(reasoner, myMod);
ValidityReport validity = inf_owl.validate();
if (validity.isValid()) {
System.out.println(“沒有不一致");
} else {
System.out.println(“存在不一致,如下: ");
for (Iterator i = validity.getReports(); i.hasNext(); ) {
System.out.println(" - " + i.next());
}
}

enter description here

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章