計算機專業剛入坑知識圖譜,我大概是這種狀態:
這里主要是為了開發時看懂需求,所以不做深入了解。
不過沒辦法- -從概念開始慢慢來吧。。。
1. 什么是知識圖譜:
知識圖譜(Knowledge Graph),在圖書情報界稱為知識域可視化或知識領域映射地圖,是顯示知識發展進程與結構關系的一系列各種不同的圖形,用可視化技術描述知識資源及其載體,挖掘、分析、構建、繪制和顯示知識及它們之間的相互聯系。
個人理解就是展示復雜知識資源相互聯系的一圖形結構
2. RDF:資源描述框架(Resource Description Framework) (知識表示的一種方式)
知識圖譜是展示資源相互聯系的結構,所以首先要能描述資源,以及資源的聯系。然后通過各種處理來發現其中的直接關系(我們用RDF已經存儲的)和可能的隱藏關系(推導出來的)。
最簡單的應用:你淘寶搜個衛生巾,然后淘寶知識圖譜里:衛生巾是大姨媽的 “需要” 屬性之一,大姨媽的其他 “需要” 屬性還包含了:綠豆湯,衛生棉,熱水壺。。。然后你第二天就發現你的淘寶主頁上各種暖水壺,衛生棉,綠豆湯。。。
或者:特朗普是美國總統,特朗普是房地產商 -》 美國總統是一個房地產商 然后進一步推導出別的隱藏關系。
資源(Resource):所有以RDF表示法來描述的東西都叫做資源,它可能是一個網站,可能是一個網頁,可能只是網頁中的某個部分,甚至是不存在於網絡的東西,如紙本文獻、器物、人等。在RDF中,資源是以統一資源標識(URI,Uniform Resource Indentifiers)來命名,統一資源定位器(URL,Uniform Resource Locators)、統一資源名稱(URN,Uniform Resource Names)都是URI的子集。
屬性(Properties):屬性是用來描述資源的特定特征或關系,每一個屬性都有特定的意義,用來定義它的屬性值(Value)和它所描述的資源形態,以及和其它屬性的關系。RDF的(Property,Property value)在概念上和傳統的(Attribute,Attribute value)是相同的。
陳述(Statements):特定的資源以一個被命名的屬性與相應的屬性值來描述,稱為一個RDF陳述,其中資源是主詞(Subject),屬性是述詞(Predicate),屬性值則是受詞(Object),陳述的受詞除了可能是一個字符串,也可能是其它的資料形態或是一個資源。
先舉一個例子:
用xml語法來描述一個東西:
e.g:
<
Description
about
=
http
://www.dlib.org/dlib/may98/miller> <- http
://www.dlib.org/dlib/may98/miller 這個唯一標識了這個資源(統一資源標識)
<
DC:title
> <- 屬性標簽
An introduction to the Resource Description Framework <--屬性的描述 (陳述)
</
DC:title
>
<
DC:creator
>
Eric Miller
</
DC:creator
>
<
DC:date
>
1998-0501
</
DC:date
>
</
Description
>
這種描述一個東西的方式就是RDF(不等同於XML語法,只能說所有RDF可以用xml來描述, xml有固定格式,而rdf只是一種框架,感覺有點像jvm和hotspot,一個是一種規范,一個是這種規范的一種主要實現方式)
不過xml相對來說太過正規,所以現在不用這種方式,而是直接用三元組(“主 謂 賓” 的直接排列) (也可以理解為 資源 的xx屬性是 描述)
類似於這種:
<
http
://www.dlib.org/dlib/may98/miller>
<
DC:title
> "An introduction to the Resource Description Framework".
<
http
://www.dlib.org/dlib/may98/miller>
<
DC:creator
>
"Eric Miller".
<
http
://www.dlib.org/dlib/may98/miller>
<
DC:date
>
"1998-0501".
或者用turtle方式來描述:
@prefix Description
: <"http
://www.dlib.org/dlib/may98/miller
/">. //這里要注意。。。下面那些語句的主語是這個url,不是Description,相當於java里面聲明了一個變量Description指向它。。。
Description :
title
"An introduction to the Resource Description Framework".
Description :creator
"Eric Miller". //或者表示成主謂賓:
Description :的creator是
"Eric Miller".
Description :date
"1998-0501".
這樣可以用更少的空間,更簡潔的方式來存儲一個資源了。
RDF的描述方式有很多。。。總之只要是用 資源,屬性,描述的方式來描述的方法就是RDF(不是這方面專業的知道這個就差不多了- -)
三元組的個人理解:這玩意類似於關系數據庫中的關聯查詢。。。A中包含的屬性B,然后B有描述C。 ((A,B),C) --> 變成RDF就成了(A,B,C),只不過默認了ABC有着固定的關系。
3元組其實就是2元組基礎上外面多套了一層關系,因此再套一層就會變成4元組。。。以此類推。
3. OWL, RDFS
RDF的擴展,加了一點新功能。
4. SPARQL
RDFS查詢語句(Java中有SPARQL處理器:ARQ)
貌似很常用,有需要的話准備單獨寫一篇。
基本語句:
PREFIX exp:http://www.baidu.com
select ?student where {
?student exp:studies exp:CS328
}
差不多等於:
var exp = http://www.baidu.com
select student from exp where studies = CS328
5. 知識抽取:
想要完成知識圖譜,第一步就是獲取知識和知識之間的關系。
1. 命名實體識別:
找出信息中的名字和實體 (確定主語和賓語)
2. 術語抽取:
分辨並抽取信息中的專業術語
3. 關系抽取:
抽取資源之間的關系。(王健林之子王思聰 -> 王健林 的兒子是 王思聰)
4.共指消解:
分辨合並同類項(“比如小明出去玩,他沒去成”,要找出:其中的“他”是指的小明)
如果還沒有概念可以舉個例子:
我們要處理一句話,並梳理成知識圖譜:
王健林之子王思聰宣布破產
1. 我們數據庫里存放了各種詞組,可以先分詞: 王健林 之子 王思聰 宣布 破產
2,抽出其中的名詞: 王健林, 王思聰 (名詞的確定可以是存儲,也可能是某種算法: 比如分詞時,王xx + 之子 可能是一個姓名 + 之子 這種,基本上每種抽取算法都可以單獨開課= =。)
3.抽取關系: 名詞之間一般是動詞或者關系詞。 然后分析: 之子不是動詞,說明王建林 的兒子是 王思聰(建立關系1)
4.抽取事件:找到動詞: 宣布 可以知道動詞前后是主語和賓語
5.建立關系:王思聰 宣布 破產(建立關系2)
然后建立知識圖譜: 比如百度建立了這個圖譜,當你搜王思聰的百科,百度根據關系查找,然后就會顯示相關詞條: 王健林, 破產。
這只是舉個例子,實際分析肯定不會這么簡單,還要考慮很多東西。
6.確定關系的方法:
1. 模板: 儲存常用詞的詞性和上下文可能出現的詞性,然后得到一個樹形結構的模型(儲存各種句子結構分支)進行分析。
這種方式查的准,但是可能不全。(因為你不可能列舉出所有可能,但是基本准確)
比如 王思聰 是 富豪 (模型中“是” 肯定是表示一種 is 關系)所以直接可以得出 王思聰 是 富豪 這種關系
2. 監督學習: 利用大量的數據對算法進行訓練(俗稱找規律- -),然后得到一個樹形結構的模型。 (感覺這個和上面那個區別不大。。。)
Pipleline: 先找出實體,再分析關系。 (先找出名詞,然后根據位置推測其他詞的詞性,確定兩者之間的關系)
Joint Model:實體和關系一起分析。 (一步到位進行分析,確定兩者之間關系)
這種方式需要大量數據和標注來進行訓練,工作量很大。(所以叫監督學習= =要有人給答案。。。機器才能學習)
先輸入 王思聰是富豪,然后輸入結果:王思聰 是 富豪。
機器分析記住了“是”前后是名詞時代表一種關系
輸入 王健林是富豪, 機器可以得出 王健林 是 富豪 這種關系。
3. 半監督學習:
最開始知識圖譜里面有: 王思聰 創立 熊貓TV
知道 A 創立 B 可以抽取關系: B 的創始人是 A。
之后碰到句子: 王思聰 建立了 熊貓TV
知識圖譜查到王思聰,熊貓TV,根據已有結果確定: 建立了 = 創立
然后加入圖譜。
圖譜增加: A 建立了 B 可以抽取關系: B 的創始人是 A
之后碰到句子: 王健林 建立了 萬達
圖譜增加: 王健林 和 萬達之間有建立關系
之后碰到句子: 王健林帶領萬達走向輝煌
圖譜增加: A 帶領 B 走向輝煌: B 的創始人是 A (大部分時候帶領人就是創始人,但是也有例外,這時候已經有可能出現分析錯誤了)
半監督算法就是這樣不斷迭代增加,但是也可以看出來:代多了可能就會出現分析准確率逐漸跑偏的可能。。。
所以新增時需要人工檢測審查(因此是半監督,人不負責告訴答案了,但是仍然要責審查機器得到的答案)
4.無監督(純自學)
目前基本不會用這種方式。。。因為很難保證正確性。
7. 知識存儲
一般使用圖形數據庫: 最常用的比如mongodb,nodejs等
8. 知識融合
知識融合是指對來自不同地方的相同實例進行合並(比如百度的特朗普 和 wifi的Trump, 或者百度中的 唐僧 和 唐三藏)。
創建知識圖譜,需要的數據資源往往來自於各種數據庫,所以需要合並同類項。
主要有兩種情況的融合:
主要是實體融合,也叫知識對齊(判斷兩個實體是不是同一個)
不同別稱 (唐僧 唐三藏):
比如唐僧的關系中有: 徒弟是 孫悟空, 是 唐朝人, 等等
然后唐三藏的關系也有:徒弟是 孫悟空, 是唐朝人, 等等
當重合性達到一定比率,就可以大概判斷出這兩個是同一個實體。(低於一定比率就說明不是)
不同語言(比如特朗普 Trump): 主要是通過翻譯, 然后也可以翻譯后進行補充。
當然,實際操作起來有很多步驟:
1. 預處理 (語言,標點等正規化,去重去錯等)
2. 分塊
把目標對象群體分組,目的很簡單,減少每次需要處理的數據數量。
1. 根據hash算法(比如字符串前幾個字母,或者算hashcode是不是一樣)
2.生成某些關鍵字,然后排序等(比如動物根據綱,科這類的分組)
分組后為了多線操作可能要做負載均衡(數據多的,或者比較重要的數據占用更多資源來處理)。
盡量保證塊中的數據數量相當
3. 記錄鏈接
主要是計算相似度:
屬性相似度:屬性有多少是一樣的。
計算相似距離:用動態規划計算兩個描述語句之間的差別大小等技術(字符串A變成字符串B需要最少需要修改多少個字符(類似於這種))
計算集合相似度: 比如兩個樂隊,比較成員然后看相似度。 兩個單詞,看做字母的集合,比較相似度。
向量相似度:實體A和B之間關系可以看做是個從A指向B的向量,比較兩個向量的相似度。
4. 評估
根據相似度確定是不是同一個(設定一個標准)
5. 結果輸出
合並實體或者不合並
主要挑戰: 保證數據質量, 處理大量數據
9.知識推理 (最好看一下離散數學,感覺很像。。。)
TBOX: 描述概念和關系的知識,被稱之為公理
說人話就是:一類東西的定義。 比如: 富豪 = 資產超過1000萬的人
ABOX: 包含外延知識,描述論域中的個體
說人話:就是具體某個事物的關系(A是B的什么)和概念(A是什么)。
一類東西中的某些實體。 比如 王思聰是富豪: 富豪(王思聰)。 (逼格高點就: richer(Sicong Wang))
或者關系。比如: 王思聰的爸爸是王健林: father_is(王思聰,王健林)。 其實你要想寫寫成: 王健林的兒子(王思聰),王思聰的爸爸(王健林)也沒問題。
這兩種寫法只是為了區分關系(A是B的什么)和概念(A是什么),可以相互轉化,至於具體怎么用= =自己體會。。。
這個專業人士一般會用離散數學表達式來表示:
符號表
比如:
TBOX:
有100萬的是富豪
has(A,100萬) <=> 富豪(A) (這里是定義為了等價關系,實際可能會更嚴格一些,比如用包含於(⊆)這類的,表示富豪包括了所有有100萬的人: 有100萬的都在富豪這個集合里,但是富豪集合里的不一定都有100萬)
ABOX:
王思聰有1000萬。
has(王思聰, 100萬)。
這個邏輯庫信息都存好后,就可以進行推導了。。。因為富豪和有100萬是等價的,所以王思聰有100萬 => 王思聰是富豪
(<has(person,100萬) <=> 富豪) ∧ has(王思聰, 100萬)> => 富豪(王思聰)
∧: 與運算, 可以理解為把條件串聯成: 條件A是真, 而且條件B是真時。
上面那句推導就是: 有100萬的人事富豪,而且王思聰有100萬,所以王思聰是富豪。
大概這么個意思,你要想再嚴謹點,可能還要加上條件 person(王思聰)
一個邏輯庫一般是:M=<Tbox,Abox>
TBOX定義了某種概念集合(什么是富豪),ABOX描述具體的個體概念或者關系(王思聰是富豪,王思聰與王健林是父子)。
10.語義搜索
定義:語義搜索的本質是通過數學來拜托當今搜索中使用的猜測和近似,並為詞語的含義以及它們如何關聯到我們在搜索引擎輸入框中所找的東西引進一種清晰的理解方式。
其實就是查詢。。。
基於IR:Sindice, FalconS;是單一數據結構和查詢算法,針對文本數據進行排序檢索來優化。它的數據是高度可壓縮的,可訪問的。排序是組成部分。但不能處理簡單的select,join等操作。
比如文章中某個單詞出現的位置。
主要方式:倒排索引。
倒排索引: 比如有30篇文章,存儲時采用關鍵字+位置的方式存儲。
王思聰:1,2,6,18,26,19. (也就是說王思聰在第1,2,6,18,26,19文章中出現過,可以快速定位)。
主要工具elasticsearch:https://www.cnblogs.com/clamp7724/p/12710326.html
基於DB:Oracle的RDF擴展,DB2的SOR;具有各種索引和查詢算法,以適應各種對結構化數據的復雜查詢。優點是能夠完成復雜的selects,joins,…(SQL, SPARQL),能夠對高動態場景(許多插入/刪除)。缺點是由於使用B+樹,空間的開銷大和訪問的局限性。同時來自葉子節點的結果沒有集成對檢索結果的排序。
傳統關系數據庫。根據屬性值和范圍等進行查詢。
原生存儲(Native stores):Dataplore, YARS, RDF-3x;優點是高度可壓縮,可訪問。類似於IR的檢索排序。類似於DB的selects和joins操作。可在亞秒級實踐內在單台機器上完成對TB數據的查詢。支持高動態操作。缺點是沒有事務、恢復等。
1. 查詢構建:預處理,知道要用到的條件和准備查的結果
2. 進行查詢
3. 顯示結果
4. 后續處理:比如你百度個 wangsicong, 百度給結果后還會顯示: 你要查找的是否是 王思聰