知識圖譜實戰系列六:Lucene在知識圖譜上構建索引

2021-03-02 機器學習算法與知識圖譜

這篇文章講講如何在知識圖譜數據集上構建索引進行查詢。

倒排索引是一種數據結構,它表示了這樣一種映射,以字或詞或數字為關鍵字進行索引,映射到出現這個字或詞的所有文檔或者資料庫文件。

它大概由三部分組成term index、term dictionary 和posting list(倒排表)。

索引過程,首要需要找到term(關鍵詞)索引的位置。term index就是用於找到關鍵詞term在term dictionary(詞典)中的位置。term index有很多種詞典結構,比如哈希表,B樹、B+、FST。

B樹

B-樹(Balance Tree)是一種多路平衡查找樹,他的每一個節點最多包含M個孩子,M就是B樹的階。樹的分叉多使得高度足夠低,於是和磁碟的I0次數就會減少。

B+樹

相比B樹,其區別體現在:

父節點的元素都會出現在子節點,因此葉子節點包含所有元素信息。

從左邊開始,每一個葉子節點帶有指向下一個葉子節點的指針,形成一個有序鍊表,便於範圍查詢。而B-樹做範圍查詢,只能依靠繁瑣的中序遍歷。

B+樹非葉節點沒有衛星數據(索引元素所指向的數據記錄),磁碟頁可以容納更多節點元素,其高度會比B樹矮,查詢的IO會更少。

B+樹的查詢必須抵達葉子節點,查找性能更穩定

FST

FST(Finite State Transducer)原理是有限狀態機原理構造的一個有向無環圖。我們今天使用的Lucene就採用了FST的索引結構來構建詞典。FST將關鍵詞拆分為前綴和後綴,並在前綴部分構造了一個有向無環圖進行索引。
FST其特點是非常節省內存,缺點是結構複雜、更新麻煩

Lucene是Apache軟體基金會支持和提供的一套用於全文檢索和搜索的開放源碼程序庫。用Java編寫,為需要全文搜索的應用程式提供了一個簡單卻強大的接口,分布式檢索分析系統Solr和ElasticSearch底層就是基於Lucene實現。

FST索引結構

Elasticsearch檢索比mysql快的原因就是,相比Mysql以B樹方式將term index和term dictionary存儲在磁碟上,lucene的term index以FST的形式緩存在內存中。從term index查到關鍵詞對應的term dictionary的塊位置之後,再去磁碟上找term,大大減少了磁碟的IO次數。

Lucene索引文件結構

DBpedia知識圖譜我們可以使用Lucene基於我們知識圖譜具體的需求來構建倒排索引。這裡使用的數據集是英文百科類知識圖譜數據集DBpedia,其中大部分內容是從維基百科詞條進行結構化得到的。我們對其中每個實體進行節點編號,將每個節點上的非實體屬性文本作為每個節點的文檔,就得到下面形式的文件:

節點和文本

構建索引

document是Lucene索引和搜索的原子單位。document為包含一個或多個域,每個域都有一個名稱,當你將document加入到索引中時,可以通過一系列選項來控制 Lucene的行為。你需要將需要被索引的數據轉換成 Lucene所能識別的document和域。

這裡我們以知識圖譜上的一個節點上的內容作為一個文檔,包括三個域:

Document doc=new Document();
doc.add(new TextField("keywords", keywords, Field.Store.NO, Field.Index.ANALYZED));
doc.add(new IntPoint("nodeId",nodeId));
doc.add(new StoredField("nodeId", nodeId));

TextField為文本域,包含節點的文本內容,我們需要對其進行分詞然後再建立到排索引,Field.Store.NO指定是否要在正向文檔中保存這個域值,Field.Index.ANALYZED用於指定是否分詞

Analyzer analyzer = new StandardAnalyzer();
directory = FSDirectory.open(Paths.get(indexStorePath));
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
IndexWriter indexWriter = new IndexWriter(directory, iwc);

// 建立doc這個文檔的索引
indexWriter.addDocument(doc);

在構造索引寫入器的時候,可以指定用於分詞的工具analyzer,

Lucene比較常用的幾種英文分析器,他們之間存在一些區別:

SimpleAnalyzer:空格及各種符號分割

StandardAnalyzer:混合分割,包括了去掉停止詞,並且具備一定中文分詞的功能

WhitespaceAnalyzer :空格分割

StopAnalyzer:空格及各種符號分割,去掉停止詞,停止詞包括 is,are,in,on,the等無實際意義的詞

Elasticsearch內置的分詞器就包含了上面這些。

另外還有許多用於中文分詞的分詞器如ik-analyzer、結巴中文分詞等,可以根據需要進行配置。

搜索

Lucene的查詢調用的是 Indexsearcher類中的search方法,調用時傳人 Query類型作為參數。可以使用 QueryParser類將查詢詞轉換成 Query類型。hitNum可以限制你要拿到的目標文檔數。

IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(indexReader);

QueryParser parser = new QueryParser("worsIdStr", new StandardAnalyzer());
Query query = parser.parse("aKeyword");

TopDocs tds = searcher.search(query, hitNum);
ScoreDoc[] sds = tds.scoreDocs;

這樣,就可以找到這個查詢詞所在的文檔id,也即查詢詞所在的知識圖譜的圖節點編號。

☆☆☆為方便大家查閱,小編已將知識圖譜實戰專欄系列文章統一整理到公眾號底部菜單欄,同步更新中,關注公眾號,點擊左下方「系列文章」,如圖:

歡迎大家和我一起沿著知識圖譜實戰專欄這條路線,一起鞏固機器學習算法基礎。(添加微信:mthler,開啟打怪升級的學習之旅。)

相關焦點

  • 知識圖譜發展的難點&構建行業知識圖譜的重要性
    知識圖譜又稱為科學知識圖譜,在圖書情報界稱為知識域可視化,或知識領域映射地圖,用來顯示知識發展進程與結構關係的一系列各種不同的圖形,用可視化技術描述知識資源及載體,挖掘、分析、構建、繪製和顯示知識及他們互相之間的關係。
  • 知識圖譜系列:Task 1 知識圖譜介紹
    /team-learning-nlp/tree/master/KnowledgeGraph_Basic感謝Datawhale社區的無私分享想學習的小夥伴可以一起來1.知識圖譜知識圖譜本質上是語義網絡(Semantic Network)的知識庫。
  • 如何構建知識圖譜?
    本文根據轉轉張青楠老師,在DataFun AI+ Talk中所分享的《二手電商知識圖譜構建以及在價格模型中的應用》編輯整理而成。一、知識圖譜概述這次的分享主要從以下四個部分:知識圖譜概述、知識圖譜構造、轉轉二手電商知識圖譜、在價格模型中的應用。
  • 《知識圖譜完整項目實戰》學習指引
    一、前言本文是《知識圖譜完整項目實戰(附源碼)》系列課程的學習指引部分,主要是對《知識圖譜完整項目實戰》的課程特色、章節設置、關鍵技術和主要內容做一個簡介,目的是讓大家對本課程有一個系統性的認知。之所以有這樣一條,一方面因為我確實比較忙,拿不出那麼多的時間幫助大家逐個細節的解決問題;另外一個方面也是課程特色:課程特色1:案例驅動:圍繞一個完整的領域知識圖譜實戰項目展開
  • 如何構建知識圖譜
    編輯導語:知識圖譜可以說是一個資料庫,在如今大數據時代,知識圖譜已經是企業中能夠起到很大作用的一個環節,可以提高工作效率等;本文作者分享了關於構建知識圖譜以及問題的解答,我們一起來看一下。知識圖譜作為大數據內容的搬運工,在知識算法和使用上,能夠放大組織沉澱數據應用價值;目前搜索巨頭、購物網站均已經通過應用知識網絡,實現了更深層次的「千人千面」。
  • 媒體知識圖譜的構建簡析
    現有代表性的知識網絡有Wordnet、DBpedia、Freebase、NELL(Never Ending Language Learning,永不結束語言學習)、YAGO和谷歌知識圖譜等。其共同點是均基於單一文本進行構建。根據知識來源與頂層概念設計理念,現有數據驅動的知識圖譜構建的研究工作大致分為如下幾類。
  • 自底向上——知識圖譜構建技術初探
    是的,用關係資料庫來存儲,尤其是存儲簡單的知識圖譜,從技術上來說是完全沒問題的。但需要注意的是,一旦知識圖譜變複雜,圖資料庫在關聯查詢的效率上會比傳統的關係數據存儲方式有顯著的提高。當我們涉及到2,3度的關聯查詢,基於知識圖譜的查詢效率會高出幾千倍甚至幾百萬倍。
  • 知識圖譜的皇冠:知識圖譜推理的前世今生
    [ 導讀 ]業界和學界對知識圖譜的關注主要集中於兩大領域,分別是知識圖譜的構建和知識圖譜的應用。 前者聚焦於通過對結構化、非結構化數據的整合,實現統一形式的數據存儲;後者則著眼於通過算法對海量知識圖譜數據進行學習與挖掘,從而推理出新的知識,服務於具體行業應用。
  • 知識圖譜是什麼?
    01 什麼是知識圖譜1. 定義官方定義:知識圖譜是一種基於圖的數據結構,由節點(point)和邊(Edge)組成,每個節點表示一個「實體」,每條邊為實體與實體之間的「關係」,知識圖譜本質上是語義網絡。02 知識圖譜構建的關鍵技術知識圖譜構建的過程中,最主要的一個步驟就是把數據從不同的數據源中抽取出來,然後按一定的規則加入到知識圖譜中,這個過程我們稱為知識抽取。數據源的分為兩種:結構化的數據和非結構化的數據。
  • 從知識圖譜到認知圖譜:歷史、發展與展望
    知識圖譜的研究熱點逐漸出現重數量輕結構化的傾向,這與深度學習和聯結主義思想的盛行密不可分。認知圖譜依據人類認知的雙加工理論,動態構建帶有上下文信息的知識圖譜並進行推理。本文回顧了知識圖譜的發展歷史,指出認知圖譜提出的動機並展望其發展前景。知識圖譜是由谷歌(Google)公司在2012年提出來的一個新的概念。本質上是語義網的知識庫。
  • 試驗知識圖譜分析
    Graph)簡單說是一種大規模的語義網絡,圖書情報界稱為知識域可視化或知識領域映射地圖,是顯示知識發展進程與結構關係的一系列各種不同的圖形。知識圖譜核心內容三、試驗知識圖譜構建技術試驗知識圖譜構建流程為:1、信息抽取信息抽取是知識圖譜構建的第1步,其中的關鍵問題是如何從異構數據源中自動抽取信息得到候選知識單元;信息抽取是一種自動化地從半結構化和無結構數據中抽取實體、關係以及實體屬性等結構化信息的技術,涉及的關鍵技術包括:實體抽取、關係抽取和屬性抽取。
  • 知識圖譜線上培訓課程
    知識圖譜課程全面系統講授、研討知識圖譜相關概念與技術主題,對當前行業落地過程的一系列困難進行答疑解惑,使學員系統地掌握知識圖譜概念與技術。同時,本次課程還邀請了兩位華為雲的專家,結合華為雲知識計算即服務(KaaS)解決方案,為學員深度解析知識圖譜行業實踐經驗。
  • 是時候該關注「知識圖譜」了!
    知識圖譜是什麼通俗地講,知識圖譜就是將複雜的知識通過數據挖掘、信息處理、知識計量和圖形繪製等一系列方式,把所有不同種類的信息連接在一起得到的一個關係網絡。在知識圖譜裡,用節點表示現實世界中存在的「實體」,用邊示意實體與實體之間的「關係」。
  • 知識圖譜構建的研究已走入下半場,但大規模落地應用仍需時間
    在符號主義的思潮中,許多早期知識圖譜將關係局限為幾種特殊的基本關係,如「擁有屬性」、「導致」、「屬於」等,並定義一系列在圖譜上推理的規則,期望通過邏輯推理實現智能。 然而,早期知識圖譜的思路遇到了許多實際的困難,比如結構化知識信息的大量缺失,推理規則的無法窮舉問題等。當然,這些問題也並非來自知識圖譜,而是符號主義本身的特性。
  • 實戰:利用知識圖譜分析企業信息資產威脅(要點+視頻)
    因此,當知識圖譜應用於信息資產安全威脅的發現與分析時,能夠顯著提升發現資產安全威脅的效率和準確率,為企業安全人員的威脅分析提供決策依據。本次雷鋒網硬創公開課,北京數字觀星科技有限公司創始人郭亮分享了如何利用知識圖譜,對企業信息資產面臨的安全威脅,進行構建、繪製、挖掘以及分析的實踐經驗。
  • 陳華鈞等 | OpenKG區塊鏈:構建可信開放的聯邦知識圖譜平臺
    聯邦知識圖譜因為需要構架在一個分散並可能去中心化的分布式網絡上,必定面臨激勵、確權、溯責、信任和隱私等諸多問題。而現有集中式的知識圖譜構建平臺不考慮不同單位和部門的權力、責任和利益,也就無法激勵知識的共享互聯,也無法保證知識的真實性和時效性。如圖3所示,完整的知識圖譜構建和消費需要考慮知識生產、知識傳播和知識消費三個層次。
  • 知識圖譜實戰系列四:neo4j的介紹和使用
    從 http://db-engines.com/en/ranking 可以發現,Neo4j 是目前用的最多的圖資料庫,世界資料庫排行榜上排名21位。Neo4J屬於原生圖資料庫,其使用的存儲後端專門為圖結構數據的存儲和管理進行定製和優化的,在圖上互相關聯的節點在資料庫中的物理地址也指向彼此,因此更能發揮出圖結構形式數據的優勢。知識圖譜中,知識的組織形式採用的就是圖結構,所以非常適合用neo4j進行存儲。
  • 知識圖譜研討實錄05丨肖仰華教授帶你讀懂概念圖譜構建
    下面讓我們通過第五章課程《概念圖譜構建》的16條精華研討,來進一步學習了解知識圖譜技術內幕。文末可查看更多章節精華回顧。本課程配套教材《知識圖譜:概念與技術》。基於圖譜翻譯:譯法存在歧義。不同語種傾向於表達不同的知識。肖仰華老師:不同語言在知識表達上的傾向性是個十分有意思的問題,其實即便這個問題本身也很少看到研究工作,我們完全可以開展一些實證研究,分析到底中英文傾向於表達怎樣的知識。1.某個特定的文本語料知識對知識全集的一個不完整的表達。
  • 鄒磊 | 知識圖譜的數據應用和研究動態
    臉書利用OGP協議定義了社交網絡上的知識圖譜(Facebook Social Graph,社交圖),用於連接社交網絡的用戶、用戶分享的照片、電影、評論,甚至包括通過臉書定義的應用程式編程接口(Graph API)所連結的第三方的關於社交用戶的知識圖譜數據。在所構建的社交圖基礎上,臉書推出了圖搜索(Graph Search)功能,將用戶的自然語言問題轉化為面向社交圖的圖搜索問題,從而回答用戶的問題。
  • 讀書思考 | 《知識圖譜:概念與技術》C8:知識圖譜的質量控制
    知識圖譜基於OWA構建,因此它的質量控制有些難以捉摸。具體來說,某個實體有什麼屬性和關係是無法預見的,很難像數據質量工程那樣統一部署監控體系。如何在誤差可控前提下儘可能擴大知識範圍,是本章的焦點所在。註:文中「作者」指本書作者,「筆者」則指本人。知識圖譜的質量工程可分為內檢與外視兩種,均旨在提升知識準確率與覆蓋率。