自然語言學習16-知識圖譜

知識圖譜的通用表示方法

本質上,知識圖譜是一種揭示實體之間關係的語義網絡 ,可以對現實世界的事物及其相互關係進行形式化地描述 。現在的知識圖譜己被用來泛指各種大規模的知識庫 。

三元組是知識圖譜的一種通用表示方式,即 G=(E,R,S)G=(E,R,S),其中 E=e1,e2,…,e|E|E=e1,e2,…,e|E|是知識庫中的實體集合,共包含 |E||E| 種不同實體,R=r1,r2,…,r|E|R=r1,r2,…,r|E| 是知識庫中的關係集合,共包含 |R||R| 種不同關係,S⊆E×R×ES⊆E×R×E 代表知識庫中的三元組集合。

三元組的基本形式主要包括實體 A、關係、實體 B 和概念、屬性、屬性值等,實體是知識圖譜中的最基本元素,不同的實體間存在不同的關係。概念主要指集合、類別、對象類型、事物的種類,例如人物、地理等;屬性主要指對象可能具有的屬性、特徵、特性、特點以及參數,例如國籍、生日等;屬性值主要指對象指定屬性的值,例如中國、1988—09—08等。每個實體(概念的外延)可用一個全局唯一確定的 ID 來標識,每個屬性—屬性值對可用來刻畫實體的內在特性,而關係可用來連接兩個實體,刻畫它們之間的關聯。

如下圖是實體 A 與實體 B 組成的一個簡單三元組形式。

enter image description here

知識圖譜的架構

知識圖譜的架構主要包括自身的邏輯結構以及體系架構,分別說明如下。

1. 知識圖譜的邏輯結構。

知識圖譜在邏輯上可分爲模式層與數據層兩個層次,數據層主要是由一系列的事實組成,而知識將以事實爲單位進行存儲。如果用(實體 A,關係,實體 B)、(實體、屬性,屬性值)這樣的三元組來表達事實,可選擇圖數據庫作爲存儲介質,例如開源的 Neo4j、Twitter 的 FlockDB、Sones 的 GraphDB 等。模式層構建在數據層之上,主要是通過本體庫來規範數據層的一系列事實表達。本體是結構化知識庫的概念模板,通過本體庫而形成的知識庫不僅層次結構較強,並且冗餘程度較小。

2. 知識圖譜的體系架構。

知識圖譜的體系架構是指其構建模式結構,如圖下圖所示。

enter image description here

知識圖譜主要有自頂向下與自底向上兩種構建方式。自頂向下指的是先爲知識圖譜定義好本體與數據模式,再將實體加入到知識庫。該構建方式需要利用一些現有的結構化知識庫作爲其基礎知識庫,例如 Freebase 項目就是採用這種方式,它的絕大部分數據是從維基百科中得到的。自底向上指的是從一些開放鏈接數據中提取出實體,選擇其中置信度較高的加入到知識庫,再構建頂層的本體模式。目前,大多數知識圖譜都採用自底向上的方式進行構建,其中最典型就是 Google 的 Knowledge Vault。

知識圖譜的關鍵技術

 

enter image description here

 

1. 知識抽取。

知識抽取技術,可以從一些公開的半結構化、非結構化的數據中提取出實體、關係、屬性等知識要素。

知識抽取主要包含實體抽取、關係抽取、屬性抽取等,涉及到的 NLP 技術有命名實體識別、句法依存、實體關係識別等。

2. 知識表示。

知識表示形成的綜合向量對知識庫的構建、推理、融合以及應用均具有重要的意義。

基於三元組的知識表示形式受到了人們廣泛的認可,但是其在計算效率、數據稀疏性等方面卻面臨着諸多問題。近年來,以深度學習爲代表的表示學習技術取得了重要的進展,可以將實體的語義信息表示爲稠密低維實值向量,進而在低維空間中高效計算實體、關係及其之間的複雜語義關聯。

知識表示學習主要包含的 NLP 技術有語義相似度計算、複雜關係模型,知識代表模型如距離模型、雙線性模型、神經張量模型、矩陣分解模型、翻譯模型等。

3.知識融合。

由於知識圖譜中的知識來源廣泛,存在知識質量良莠不齊、來自不同數據源的知識重複、知識間的關聯不夠明確等問題,所以必須要進行知識的融合。知識融合是高層次的知識組織,使來自不同知識源的知識在同一框架規範下進行異構數據整合、消歧、加工、推理驗證、更新等步驟,達到數據、信息、方法、經驗以及人的思想的融合,形成高質量的知識庫。

在知識融合過程中,實體對齊、知識加工是兩個重要的過程。

4.知識推理。

知識推理則是在已有的知識庫基礎上進一步挖掘隱含的知識,從而豐富、擴展知識庫。在推理的過程中,往往需要關聯規則的支持。由於實體、實體屬性以及關係的多樣性,人們很難窮舉所有的推理規則,一些較爲複雜的推理規則往往是手動總結的。對於推理規則的挖掘,主要還是依賴於實體以及關係間的豐富情況。知識推理的對象可以是實體、實體的屬性、實體間的關係、本體庫中概念的層次結構等。

知識推理方法主要可分爲基於邏輯的推理與基於圖的推理兩種類別。

NEO4j創建知識圖譜

Cypher 命令

CREATE (n:Person { name: 'Andres', title: 'Developer' }) return n;

作用是創建一個 Person,幷包含屬性名字和職稱。

enter image description here

創建一個 Person 對象,屬性中只是名字和職稱不一樣。

CREATE (n:Person { name: 'Vic', title: 'Developer' }) return n;

進行兩個 Person 的關係匹配:

match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)-[r:Friend]->(m) return r;

match(n:Person{name:"Vic"}),(m:Person{name:"Andres"}) create (n)<-[r:Friend]-(m) return r;

查看數據庫中的圖形:

match(n) return n;

如下圖,返回兩個 Person 節點,以及其關係網,兩個 Person 之間組成 Friend 關係:

enter image description here

Neo4j 的 Python 操作

pip install py2neo

簡單的圖關係構建

from py2neo.data import Node, Relationship
a = Node("Person", name="Alice")
b = Node("Person", name="Bob")
ab = Relationship(a, "KNOWS", b)

首先引入 Node 和 Relationship 對象,緊接着,創建 a 和 b 節點對象,最後一行匹配 a 和 b 之間的工作僱傭關係。

ab 對象的內容:

print(ab)

通過 print 打印出 ab 的內容:

(Alice)-[:KNOWS {}]->(Bob)

用 Neo4j 構建一個簡單的農業知識圖譜

語料是已經處理好的數據,包含6個 csv 文件,文件內容和描述如下。

  • attributes.csv:文件大小 2M,內容是通過互動百科頁面得到的部分實體的屬性,包含字段:Entity、AttributeName、Attribute,分別表示實體、屬性名稱、屬性值。文件前5行結構如下:
Entity,AttributeName,Attribute
密度板,別名,纖維板
葡萄蔓枯病,主要爲害部位,枝蔓
坎德拉,性別,男
坎德拉,國籍,法國
坎德拉,場上位置,後衛
  • hudong_pedia.csv:文件大小 94.6M,內容是已經爬好的農業實體的百科頁面的結構化數據,包含字段:title、url、image、openTypeList、detail、baseInfoKeyList、baseInfoValueList,分別表示名稱、百科 URL 地址、圖片、分類類型、詳情、關鍵字、依據來源。文件前2行結構如下:
"title","url","image","openTypeList","detail","baseInfoKeyList","baseInfoValueList"
"菊糖","http://www.baike.com/wiki/菊糖","http://a0.att.hudong.com/72/85/20200000013920144736851207227_s.jpg","健康科學##分子生物學##化學品##有機物##科學##自然科學##藥品##藥學名詞##藥物中文名稱列表","[藥理作用] 診斷試劑 人體內不含菊糖,靜注後,不被機體分解、結合、利用和破壞,經腎小球濾過,通過測定血中和尿中的菊糖含量,可以準確計算腎小球的濾過率。菊糖廣泛存在於植物組織中,約有3.6萬種植物中含有菊糖,尤其是菊芋、菊苣塊根中含有豐富的菊糖[6,8]。菊芋(Jerusalem artichoke)又名洋姜,多年生草本植物,在我國栽種廣泛,其適應性廣、耐貧瘠、產量高、易種植,一般畝產菊芋塊莖爲2 000~4 000 kg,菊芋塊莖除水分外,還含有15%~20%的菊糖,是加工生產菊糖及其製品的良好原料。","中文名:","菊糖"
"密度板","http://www.baike.com/wiki/密度板","http://a0.att.hudong.com/64/31/20200000013920144728317993941_s.jpg","居家##巧克力包裝##應用科學##建築材料##珠寶盒##禮品盒##科學##糖果盒##紅酒盒##裝修##裝飾材料##隔斷##首飾盒","密度板(英文:Medium Density Fiberboard (MDF))也稱纖維板,是以木質纖維或其他植物纖維爲原料,施加脲醛樹脂或其他適用的膠粘劑製成的人造板材。按其密度的不同,分爲高密度板、中密度板、低密度板。密度板由於質軟耐衝擊,也容易再加工,在國外是製作傢俬的一種良好材料,但由於國家關於高密度板的標準比國際標準低數倍,所以,密度板在中國的使用質量還有待提高。","中文名:##全稱:##別名:##主要材料:##分類:##優點:","密度板##中密度板纖維板##纖維板##以木質纖維或其他植物纖維##高密度板、中密度板、低密度板##表面光滑平整、材質細密性能穩定"
  • hudong_pedia2.csv:文件大小 41M,內容結構和 hudong_pedia.csv 文件保持一致,只是增加數據量,作爲 hudong_pedia.csv 數據的補充。

  • new_node.csv:文件大小 2.28M,內容是節點名稱和標籤,包含字段:title、lable,分別表示節點名稱、標籤,文件前5行結構如下:

title,lable
藥物治療,newNode
膳食纖維,newNode
Boven Merwede,newNode
亞美尼亞蘇維埃百科全書,newNode
  • wikidata_relation.csv:文件大小 1.83M,內容是實體和關係,包含字段 HudongItem1、relation、HudongItem2,分別表示實體1、關係、實體2,文件前5行結構如下:
HudongItem1,relation,HudongItem2
菊糖,instance of,化合物
菊糖,instance of,多糖
瓦爾,instance of,河流
菊糖,subclass of,食物
瓦爾,origin of the watercourse,萊茵河
  • wikidata_relation2.csv:大小 7.18M,內容結構和 wikidata_relation.csv 一致,作爲 wikidata_relation.csv 數據的補充。

語料加載。

語料加載,利用 Neo4j 的 LOAD CSV WITH HEADERS FROM... 功能進行加載,具體操作過程如下。

首先,依次執行以下命令:

// 將hudong_pedia.csv 導入
LOAD CSV WITH HEADERS  FROM "file:///hudong_pedia.csv" AS line  
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})

執行成功之後,控制檯顯示成功:

enter image description here

上面這張圖,表示數據加載成功,並顯示加載的數據條數和耗費的時間。

// 新增了hudong_pedia2.csv
LOAD CSV WITH HEADERS  FROM "file:///hudong_pedia2.csv" AS line  
CREATE (p:HudongItem{title:line.title,image:line.image,detail:line.detail,url:line.url,openTypeList:line.openTypeList,baseInfoKeyList:line.baseInfoKeyList,baseInfoValueList:line.baseInfoValueList})

// 創建索引
CREATE CONSTRAINT ON (c:HudongItem)
ASSERT c.title IS UNIQUE

以上命令的意思是,將 hudong_pedia.csv 和 hudong_pedia2.csv 導入 Neo4j 作爲結點,然後對 titile 屬性添加 UNIQUE(唯一約束/索引)。

數據導入命令:

// 導入新的節點
LOAD CSV WITH HEADERS FROM "file:///new_node.csv" AS line
CREATE (:NewNode { title: line.title })

//添加索引
CREATE CONSTRAINT ON (c:NewNode)
ASSERT c.title IS UNIQUE

//導入hudongItem和新加入節點之間的關係
LOAD CSV  WITH HEADERS FROM "file:///wikidata_relation2.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem}) , (entity2:NewNode{title:line.NewNode})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)

LOAD CSV  WITH HEADERS FROM "file:///wikidata_relation.csv" AS line
MATCH (entity1:HudongItem{title:line.HudongItem1}) , (entity2:HudongItem{title:line.HudongItem2})
CREATE (entity1)-[:RELATION { type: line.relation }]->(entity2)

導入 new_node.csv 新節點,並對 titile 屬性添加 UNIQUE(唯一約束/索引),導入 wikidata_relation.csv 和 wikidata_relation2.csv,並給節點之間創建關係。

導入實體屬性,並創建實體之間的關係:

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:HudongItem{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:NewNode{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2);

LOAD CSV WITH HEADERS FROM "file:///attributes.csv" AS line
MATCH (entity1:NewNode{title:line.Entity}), (entity2:HudongItem{title:line.Attribute})
CREATE (entity1)-[:RELATION { type: line.AttributeName }]->(entity2)  

知識圖譜查詢展示

最後通過 cypher 語句查詢來看看農業圖譜展示。

首先,展示 HudongItem 實體,執行如下命令:

MATCH (n:HudongItem) RETURN n LIMIT 25

對 HudongItem 實體進行查詢,返回結果的25條數據,結果如下圖:

enter image description here

接着,展示 NewNode 實體,執行如下命令:

MATCH (n:NewNode) RETURN n LIMIT 25

對 NewNode 實體進行查詢,返回結果的25條數據,結果如下圖:

enter image description here

之後,展示 RELATION 直接的關係,執行如下命令:

MATCH p=()-[r:RELATION]->() RETURN p LIMIT 25

展示實體屬性關係,結果如下圖:

enter image description here

 

 

 

 

 

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