XML 程式設計思想:知識管理的基本 XML 和 RDF 技術:語義知識(轉)
本專欄文章是這個系列的第三部分,它演示瞭如何透過合併 WordNet 同義詞集將語義知識新增到 RDF 應用程式。有了新增的 WordNet 詞彙資料庫知識,可以一次性搜尋具有相關概念的一組 RDF 資料,而不是一次只能搜尋一個關鍵字。如同演示問題跟蹤器應用程式所示,那意味著搜尋一次以獲得符合“selection”概念的例項,而不是對“vote”、“choice”、“vote”以及 86 個其它的相關術語進行單獨查詢。專欄作家 Uche Ogbuji 用 Python 編寫的示例程式碼演示了這項技術。
既然我已經在以前的專欄文章裡概述了從 XML 應用程式抽取資料到 RDF 模型中去的基本技術,那麼可以繼續獲取這一工作所帶來的好處。如果最近沒有閱讀過前兩個專題,則在繼續向下讀之前,可能需要回顧一下它們(請參閱本專欄文章右側“內容”表中“相關內容”這一部分中的連結)。
您可能會想起演示應用程式是管理以 XML 格式表示的事件資料的問題跟蹤器。至此,本專欄已經涉及了從這些資料抽取 RDF 的技術,以及查詢結果 RDF 模型的基本技術。現在,讓我們來仔細研究一個例項,來說明為什麼這些努力是非常有價值的。
WordNet 簡介
WordNet 是普林斯頓大學的一個專案。該專案被稱為“英語詞彙資料庫”,它是這樣一個系統,透過將同義詞的集合集中到稱為 同義詞集(synonym sets)或 同義集(synsets)的組中來描述和分類單詞和概念。我不能過分吹捧這一重要的長期專案,該專案代表瞭如此有前景的產業。因為它的開放性意味著實際上任何開發人員都可以使用它,所以它十分重要。WordNet 有“不受限制的”許可證。它很象 BSD 許可證,因為唯一真正的限制是不可以盜用普林斯頓大學的商標來宣傳 WordNet 的任何派生產品。
必須指出的是,智力勞動的一些最重要的成果被自由用於公益事業總是件好事。這些天,我們經常聽到太多有關一些組織企圖透過免費獲取公共知識但又拒絕無償做出貢獻來獲取可能有問題的利潤的新聞。
WordNet 目前的版本是 1.7,它包括一個表示成千上萬名詞的同義集詞彙表。同義集是有關大量概念(包括 上義關係(hyponyms))、其它概念型別的概念以及子類( 上義關係(hypernym)是下義關係的超類)。WordNet 還包含相似但不同義的概念之間的對映。
普林斯頓分發的 WordNet 本身是作為用於各種平臺的資料檔案和命令列查詢工具。許多專案都對 WordNet 進行了更改和增強,並且由於它表示了構造如此良好的資源網路,所以 RDF 社群對採用 WordNet 尤為積極。幾個相關的專案包括 Dan Brickley 的用於 Web 的 WordNet,和 Jonathan Borden 博士的將其改寫成可瀏覽的 XHTML 格式。在本文中,我使用了從 WordNet 資料庫到 RDF 的直接轉換,感謝 Sergey Melnik 和 Stefan Decker,和 Brickley 和 Borden 一樣,他們倆都忙碌於 RDF 社群。我所提到的大多數專案(包括這裡使用的 Melnik 和 Decker RDF 轉換)仍然是基於 WordNet 1.6。
安裝 WordNet/RDF
本專欄舉例說明了使用 RDF 工具和 WordNet RDF 模型將語義特性新增到 RDF 構建的問題跟蹤器。可以使用任何 RDF 工具,對其作一些更改來遵循該過程。我將使用我公司的開放原始碼 4Suite 的 4RDF。以 RDF 形式表示的 WordNet 非常巨大,因此將使用 4RDF 的持久資料庫後端來管理 WordNet。4RDF 允許在記憶體中管理這些模型(這也是到目前為止本系列中一直使用的方法),它也允許在持久儲存(以平面檔案的形式儲存的諸如 PostgreSQL 和 Oracle 這樣的 SQL DBMS 中,或儲存在我所編寫的實驗性定製 RDF 後端 Mangrove 中)中管理模型。因為 Mangrove 將可能在 4Suite 的下一個發行版本 0.12.0 中首次出現,而它在發行之前是不能出現的,所以本專欄文章中的示例使用 PostgreSQL。PostgreSQL 是開放原始碼,企業級的關聯式資料庫,許多 Linux 的分發版(distribution)都帶有它,並且還有可供許多其它平臺使用的包。
要安裝它,請首先下載 WordNet/RDF 檔案。我必須修正幾個地方,因為 wordnet_hyponyms-20010201.rdf 檔案被毀壞。我將 58268 行
修改為
將 109228 行
修改為
接下來,(對於語義問題跟蹤器)將名詞和下義關聯式資料庫 WordNet RDF 檔案新增到基於 PostgreSQL 名為 sit的 RDF 模型:
清單 1. 將 WordNet RDF 檔案新增到名為 sit 的資料庫 RDF 模型中
$ 4rdf --driver=Postgres --dbName=sit wordnet_nouns-20010201.rdf$ 4rdf --driver=Postgres --dbName=sit wordnet_hyponyms-20010201.rdf
如同在清單 1 中所見到的一樣,必須指定 Postgres 驅動程式,這需要指定資料庫名稱。如果具有該名稱的資料庫不存在,那麼將建立該資料庫;如果該資料庫存在,將向該資料庫中新增生成的語句。
在返回到問題跟蹤器之前,請試著在目前所建立的 WordNet 模型上執行簡單的測試指令碼。
清單 2:練習 WordNet RDF 模型的小測試程式(wn-test.py)
from Ft.Rdf.Drivers import Postgresfrom Ft.Rdf import Model, UtilWN_RDF_BASE = "~wn/schema/"def Test(): db = Postgres.GetDb('wordnet') db.begin() m = Model.Model(db) print "Size of the model (number of statements): ", m.size() print "Synonyms of the word 'knowledge':" noun = Util.GetSubject(m, WN_RDF_BASE+'wordForm', 'knowledge') print Util.GetObjects(m, noun, WN_RDF_BASE+'wordForm') print "Classification chain for 'knowledge':" HypernymChain(noun, 'knowledge', m) db.rollback() returndef HypernymChain(noun, wform, m): hyper = Util.GetObject(m, noun, WN_RDF_BASE+'hyponymOf') if hyper: hwform = Util.GetObject(m, hyper, WN_RDF_BASE+'wordForm') print "%s is a kind of %s"%(wform, hwform) HypernymChain(hyper, hwform, m) returnif __name__ == "__main__": Test()
在清單 2 中, Postgres.GetDb('sit') 建立到所建立的 RDF 資料庫後端的連線。在建立該連線之後,在後端開始了一個事務,並使用它來建立可供查詢的模型物件。首先,只要檢視一下模型中的語句的數目。然後,使用在上一篇文章中所介紹的一些 RDF 查詢的基本型別來查詢單詞 “knowledge”的同義詞,並跟蹤概念間分類鏈。
WordNet/RDF 以如下形式使用 URI
~wn/concept#100001740
來表示名詞同義集,其中 100001740 是同義集的識別符號。然後,每個詞(同義集中的每一個詞)都有一條 wordForm 語句。如果適當,還有一條 hyponymOf 語句以將每個同義集同其超類相聯絡。因此,測試程式按照這一模式使用幾個簡單查詢就可以獲取同義詞。 HypernymChain 是遞迴函式,該函式先取得同義集資源以及同義詞中的某一詞的單詞形式,然後查詢上義關係。將該清單儲存到稱為 wn-test.py 的檔案中,並按如下所示執行它:
$ python wn-test.pySize of the model (number of statements): 351632Synonyms of the word 'knowledge':['cognition', 'knowledge']Classification chain for 'knowledge':knowledge is a kind of psychological feature
問題跟蹤器詞彙層
上一個專題論述了為了抽取序列化 RDF 如何轉換多個 XML 檔案,然後如何透過 RDF 處理器傳遞結果。現在該是將那些語句新增到含有 WordNet 語句的同一個模型中的時候了:
$ 4rdf --driver=Postgres --dbName=sit issues.rdf
該程式碼再一次指定 Postgres 驅動程式以及與前面相同的資料庫名稱,但是,這一次它從 issues.rdf 檔案讀取資料,如果還記得的話,該檔案包含從樣本問題跟蹤器檔案中抽取的後設資料。
現在,可以重新執行我們已經見過的查詢,但這次具有語義能力。例如,在上一個專題中,演示了使用正規表示式查詢賦予 uogbuji所有操作(這些操作的主體裡含有字串 vote)的查詢示例。現在,比如說,想查詢賦予 uogbuji有關一般意義上“選擇”的所有操作。這時,不用再查詢一些字串模式,取而代之的是,需要語言認知層上的真正詞彙模式。正在查詢的單詞都帶有“selection”的含義:不僅僅是 “vote”,而且還有 “choice”和 “ballot”。
清單 3 是執行該搜尋的程式。
清單 3:使用 WordNet,透過英語語義概念執行搜尋的程式(seman-search.py)
from Ft.Rdf.Drivers import Postgresfrom Ft.Rdf import Model, Utilfrom Ft.Rdf.Model import REGEXUSER_ID_BASE = ''IT_SCHEMA_BASE = ''WN_RDF_BASE = "~wn/schema/"g_relatedWords = []def SemanSearch(word): db = Postgres.GetDb('wordnet') db.begin() model = Model.Model(db) #Find the synset resource of which we have the word form noun = Util.GetSubject(model, WN_RDF_BASE+'wordForm', word) print 'Actions assigned to uogbuji related to "%s":'%(word) #Get all word forms of this synset and its hyponyms HyponymWords(noun, model) #Combine all the words into one large regular expression pattern = ".*" + "|".join(g_relatedWords) + ".*" #Use this regex to search for the appopriate concepts actions = Util.GetSubjects(model, IT_SCHEMA_BASE+'body', pattern, objectFlags=REGEX) #Iterate over the bodies of the matching actions for action in actions: #See if this action is assigned to uogbuji assignee = Util.GetObject(model, action, IT_SCHEMA_BASE+'assign-to') body = Util.GetObject(model, action, IT_SCHEMA_BASE+'body') if assignee == USER_ID_BASE+'uogbuji': print "*", body db.rollback() returndef HyponymWords(noun, model): words = Util.GetObjects(model, noun, WN_RDF_BASE+'wordForm') print "words", words g_relatedWords.extend(words) hypos = Util.GetSubjects(model, WN_RDF_BASE+'hyponymOf', noun) print "hypos", hypos for h in hypos: HyponymWords(h, model) returnif __name__ == "__main__": import sys SemanSearch(sys.argv[1])
在清單 3 中, SemanSearch 是主函式。它從訪問帶有 WordNet 和問題跟蹤器資料的 RDF 模型開始執行。該函式帶有一個 word 引數:作為概念性搜尋基礎的單詞。第一步是將該單詞轉換到 WordNet 同義集資源。然後,該程式將該同義集所有其它單詞形式(同義詞),以及下義關係同義集中所有單詞形式新增到搜尋列表。例如,在給定最初的概念: “selection”的情況下開始搜尋,清單 4 顯示了這次搜尋到的所有 89 個與“selection”的單詞。
清單 4. 搜尋“selection”的同義詞和下義關係的結果
['choice', 'pick', 'selection', 'casting', 'sampling', 'randomsampling', 'proportional sampling', 'representative sampling','stratified sampling', 'conclusion', 'decision', 'determination','appointment', 'assignment', 'designation', 'naming', 'nominating','nomination', 'co-optation', 'co-option', 'delegacy', 'ordaining','ordination', 'laying on of hands', 'call', 'move', 'demarche','maneuver', 'maneuvering', 'manoeuvering', 'manoeuvre','tactical maneuver', 'tactical manoeuver', 'parking', 'device','gimmick', 'twist', 'fast one', 'trick', 'feint', 'gambit', 'ploy','stratagem', 'artifice', 'ruse', 'measure', 'step', 'countermeasure','countermine', 'porcupine provision', 'shark repellent', 'goldenparachute', 'greenmail', 'pac-man strategy', 'poison pill', 'suicidepill', 'safe harbor', 'scorched-earth policy', 'casting lots', 'drawinglots', 'sortition', 'finding', 'finding of fact', 'verdict', 'compromiseverdict', 'quotient verdict', 'directed verdict', 'false verdict','general verdict', 'partial verdict', 'special verdict', 'conclusionof law', 'finding of law', 'volition', 'willing', 'election', 'co-optation','co-option', 'ballot', 'balloting', 'vote', 'voting', 'secret ballot','split ticket', 'straight ticket', 'multiple voting', 'casting vote','veto', 'pocket veto']
為了對該搜尋列表中的單詞(問題操作)執行一次性搜尋,該程式將這些單詞形式放進了一個大的正規表示式。然後,如同以前專欄文章所說明的那樣,操作結果列表進一步縮小到賦給“uogbuji”的操作。以下是執行清單 3 中程式(seman-search.py)的結果:
$ python seman-search.py selectionActions assigned to uogbuji related to "selection":* Organize a vote on this topic
在命令列中傳入基本概念(這裡是 “selection”),並且列印匹配的操作。
並非一切都十全十美
當然,這種語義搜尋方法還有些問題。最明顯的是效能問題。WordNet/RDF 圖表的大小使得遍歷的代價非常高昂。以上面的樣本會話為例,使用 “selection”作為搜尋的基本概念,在 PIII 1GHz 膝上電腦上執行,花了兩分多鐘,嚴重影響了磁碟上的 DBMS。幾乎所有時間都花在遞迴向下遍歷下義關係鏈上。如果搜尋諸如 “thing”這樣抽象的概念,我幾乎不敢推測這要花多長時間,它可能會將機器掛起(也可能使機器崩潰)。
和以前專題中一樣,存在該問題的部分原因是這個示例仍然使用一些真正的蠻力的方法來查詢 RDF 模型。它沒有真正地利用任何最佳化。當在本系列中隨後的文章中,討論 RDF Inference Language (RIL)時,將提出一些最佳化措施。然而,即便經過最佳化,象這樣功能強大的搜尋可能還是有一些難以解決的效能問題。
可以透過策略來處理一些效能問題。譬如,可以禁止搜尋超過某一抽象級別。一個比較原始的用以衡量抽象級別的標準,可能是從同義集到它的最遠下義關係的最長距離。由於大多數的處理時間花費在遍歷 WordNet 圖表上,因此另外一個可能的解決方案是,透過使用搜尋器(crawler)以準備相關概念的列表,來最佳化常見搜尋。
另外一個問題是,在 WordNet 上所做的努力還不夠。WordNet 中幾乎對映了所有的常用的名詞或名詞片語,但卻沒有對映動詞、修飾語以及語言的其它部分。這一點限制了搜尋。而且,還有一個事實,WordNet 是英語專案,因此其它語言可能還無法用這種具有強大功能的語義搜尋。現在 EuroWordNet 在開發針對歐洲語言的對映,但它仍處於開發之中。當然,還有許多重要的語系,諸如東亞和中東,可能還沒有這樣的設施。
結束語
我一直很高興地看到人們對我透過使用 RDF 語義查詢使用 RDF 所引起的種種可能性進行演示所產生的興奮反應。它能幫助人們瞭解半結構化關係和後設資料管理的價值,因此這簡直是恩賜,因為向生意人甚至許多開發人員解釋這一概念都不是一件容易的事。我將透過討論 RDF 驅動的問題跟蹤器的詳細資訊,來繼續探索使用知識管理以改進應用程式。然而,在下一專題中,將暫時放下這一點,先討論我們在本專欄早些時候討論的一些事物的更新。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-950188/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- XML 程式設計思想:知識管理的基本 XML 和 RDF 技術(7)(轉)XML程式設計
- XML 程式設計思想:知識管理的基本 XML 和 RDF 技術:問題跟蹤程式模式(轉)XML程式設計模式
- XML 程式設計思想:XML和語義(轉)XML程式設計
- XML 程式設計思想:XML語義(轉)XML程式設計
- XML 程式設計思想: XML 語義錨(轉)XML程式設計
- XML 程式設計思想:定義 RDF 和 DAML+OIL 圖示(轉)XML程式設計
- XML 程式設計思想:將檔案合併到 RDF 模型和基本的 RDF 查詢(轉)XML程式設計模型
- XML 程式設計思想:XML和語義:XML 會兌現其承諾嗎?(轉)XML程式設計
- XML 程式設計思想:使用 XSLT 生成 RDF(轉)XML程式設計
- XML 程式設計思想:XML 建模藝術描述(轉)XML程式設計
- XML 程式設計思想:重新審視 XML 中的語義透明性(轉)XML程式設計
- XML 程式設計思想:踏著語義的節拍(轉)XML程式設計
- XML 程式設計思想: 研讀XML Hacks(轉)XML程式設計
- XML 程式設計思想: Harold 的高效 XML 設計原則(轉)XML程式設計
- 非常硬核的技術知識-CopyOnWrite思想
- XML 程式設計思想:Thinking XML: 通用商業語言(UBL)(轉)XML程式設計Thinking
- XML 程式設計思想:查詢 XML 格式的 WordNet(轉)XML程式設計
- 程式設計的基本知識點(浙大)程式設計
- XML 程式設計思想: 專利編檔遭遇 XML(轉)XML程式設計
- 程式設計師的知識管理程式設計師
- XML 程式設計思想: XMLOpen 會議,再評 XML Hacks(轉)XML程式設計
- XML 程式設計思想:利用模式標準化實現自上而下的語義透明(轉)XML程式設計模式
- Java程式設計思想——知識卡片01_02Java程式設計
- XML 程式設計思想:用 MusicBrainz 管理後設資料(轉)XML程式設計AI
- 設計師的知識管理
- 作為程式設計師應具備的基本知識 (轉)程式設計師
- java物件導向程式設計的基本知識Java物件程式設計
- Oracle 基本知識(轉)Oracle
- 專案管理知識體系術語(二) (轉)專案管理
- 專案管理知識體系術語(三) (轉)專案管理
- 專案管理知識體系術語(四) (轉)專案管理
- 專案管理知識體系術語(五) (轉)專案管理
- 專案管理知識體系術語(六) (轉)專案管理
- 運營知識與管理知識(轉)
- XML相關知識全接觸(一)XML
- 【技術性】OO語言知識
- XML 程式設計思想:從書本學習 XML Topic Maps(轉)XML程式設計
- 藍芽4.0技術知識整理和基本介紹藍芽