秦錦玉,翟潔,陳程,趙維杰,蔡婷婷,武海霞
(華東理工大學信息科學與工程學院,上海200237)
眾所周知,中醫(yī)是中國古代醫(yī)者同大量未知疾病斗爭所得的經(jīng)驗,經(jīng)歷持久的醫(yī)學實踐逐步形成和發(fā)展醫(yī)學理論體系。其中,中醫(yī)藥的研究和發(fā)展是中醫(yī)理論必不可少且相當重要的一部分。但由于國外對中醫(yī)藥學的無人問津,國內知識圖譜的發(fā)展還不夠面面俱到,導致中醫(yī)藥的知識網(wǎng)絡相對零散,更多的以文字作為載體的呈現(xiàn)形式,以靜態(tài)的圖形來表述關聯(lián)性,缺乏一定的交互性,也致使了大多數(shù)非相關人員很難接觸和了解這門學科,甚至從事者也難以在大量的文獻和文字資源中高效的獲取所需求的知識。
針對以上問題,設計了關于中醫(yī)藥知識圖譜的可視化系統(tǒng),對中藥數(shù)據(jù)采集后進行清理和分類,提供一個所想即所得的方式,以“圖”的方式提供一種引導性學習,將大量的中醫(yī)藥知識之間的關聯(lián)以簡單的圖譜形式展示,可視化效果好。
中醫(yī)藥知識圖譜的可視化流程如下所述:
1)層析結構設計
對展示的數(shù)據(jù)內容進行層次結構分析,確定上下位關系、數(shù)據(jù)模型和圖模型。
2)節(jié)點生成
對主頁面、分類頁和詳情頁根據(jù)其節(jié)點特點,設計不同的節(jié)點生成算法,獲得相應的節(jié)點和連線信息。
3)html頁面生成
節(jié)點和連線準備好之后,需要將其轉換為圖形。本文設計了html頁面生成算法,將節(jié)點和連線信息寫入html頁中。
4)力導引布局
以上步驟生成的知識圖譜整體平衡,但存在很多交叉點,很不美觀。我們可以利用KK算法來優(yōu)化節(jié)點布局,減少交叉點的數(shù)量。流程圖如圖1所示。
圖1 中醫(yī)藥知識圖譜的可視化流程圖
領域內的層次結構直觀反應了領域內知識的上下位關系,為實現(xiàn)中藥知識圖譜可視化,首先要建立中藥層次結構圖。
在中藥領域中,存在著很多上下位關系。本文中,采用藥性、藥味、歸經(jīng)等等作為中藥知識的下層知識。藥性、藥味、歸經(jīng)又有各自包含的子概念,形成了具體的上下位關系,即是層次結構。
另外,考慮到有多處的一對多及多對一關系,數(shù)據(jù)模型選擇不完全連接網(wǎng)狀結構,因包含關系的單向性,圖模型選擇有向圖。
綜上,圖譜設計規(guī)則為:上位元素作為起始節(jié)點,下位元素作為終止節(jié)點。
生成知識圖譜節(jié)點,便是將數(shù)據(jù)圖形化,因而數(shù)據(jù)的提取、合并就成了重中之重。文中,設計了適合這個中醫(yī)藥知識圖譜各種特性的節(jié)點及連線生成算法。
2.2.1 主頁面及分類頁節(jié)點生成算法
為形成清晰美觀而又實用的主頁面及分類頁,采用排序算法及隨機數(shù)生成算法,將點擊率較高和另一些隨機的中藥節(jié)點呈現(xiàn)出來,總數(shù)不多于20。圖2為主頁圖和分類節(jié)點圖的生成流程。
圖2 主頁圖和分類節(jié)點圖的生成流程
具體思想是:
1)實例化自定義類Edges,其中包括屬性source(起點),target(終點),weight(線段粗細)。
2)使用sql語句搜索得到所有具備當前屬性的節(jié)點,并以主表中的點擊率字段從高到低排列。
3)判斷所有節(jié)點數(shù)是否大于20,若不大于則全部添加進節(jié)點列表,并添加所有連線。
4)若節(jié)點數(shù)大于20,先添加點擊率最高的10個節(jié)點進節(jié)點列表,并在剩余節(jié)點中調用隨機函數(shù)生成10個節(jié)點
5)隨機函數(shù)原理則是生成10個0到n-10的節(jié)點(n為所有節(jié)點總數(shù)),得到隨機數(shù)后+10則是所需節(jié)點的下標。
6)添加所有連線,起點均是中間屬性節(jié)點,而終點則是節(jié)點列表中的節(jié)點,遍歷添加即可。
2.2.2 詳細頁節(jié)點生成算法
詳細頁的節(jié)點需要二次查重,節(jié)點省略,還需要對連線進行合理分配起點終點。具體流程如下:
1)使用sql語句搜索得到當前中藥所有分類總數(shù),并將當前中藥作為0號節(jié)點添加至節(jié)點列表。
2)記錄所有分類節(jié)點數(shù)量parentNodes。
3)對每個分類節(jié)點再進行一次搜索,使用sql語句找到當前分類的中藥,當搜索結果數(shù)量小于5時,全部添加,大于等于5時,添加點擊率最高的4個節(jié)點,再添加一個“…”節(jié)點,表示有其他未添加的節(jié)點。
4)當添加節(jié)點時,某些子節(jié)點會和父節(jié)點具有多個相同分類,相同節(jié)點不應多次添加,即需要查重。則每次添加節(jié)點時必須對已有的節(jié)點列表進行遍歷檢查是否存在,若存在則只添加新的連線,而連線的起點則設置為遍歷過程中,搜到重復節(jié)點的下標。
5)當節(jié)點和連線列表填充完畢后,再次記錄節(jié)點列表的總節(jié)點數(shù),目的是得到所有的子節(jié)點數(shù)量記作childNodes,在之后的知識圖譜生成過程中,parentNodes和childNodes將作為重要參數(shù)。
詳細頁節(jié)點生成算法流程如圖3所示。
詳情頁的節(jié)點生成比主頁面和分類頁更復雜,分類頁的生成圖的重點在于判斷總節(jié)點數(shù)后對于節(jié)點的選擇,而詳情頁則是在節(jié)點獲取時的判斷數(shù)量,是否添加,起點和終點的節(jié)點下標,以及分別記錄節(jié)點數(shù)量。
通過節(jié)點生成算法準備好節(jié)點和線后,需要將這些節(jié)點和線數(shù)據(jù)轉換成圖形。這要由D3.js這一類庫完成,腳本語言需要嵌套在html頁中展示,作為WPF設計界面,又可以通過瀏覽器控件訪問html頁。具體流程如下:
1)以流的方式讀入html模板頁,模板頁為html語言編寫,其中所需要的json格式數(shù)據(jù)源以及其他需要通過后臺傳入的參數(shù),用字符串代替。
2)將用節(jié)點生成算法獲取的節(jié)點和連線列表用string拼寫成 json 格式{key:value,key:value,key,value…}。
3)替換json數(shù)據(jù)源,替換重要參數(shù)parentNodes。
4)流的方式寫成html文件,并以當前藥名/分類名命名。
之后,需要對其中的部分參數(shù)進行修改來達到系統(tǒng)最美觀的程度,同時增加部分事件來體現(xiàn)交互性,而KK算法已經(jīng)由D3.js中的force方法實現(xiàn),調用force方法后,修改參數(shù)的值,會得到不同的界面效果。
據(jù)圖4可以看出,單單的平衡可以采用圓面的布局方式,盡可能的使節(jié)點出現(xiàn)在某半徑的圓周上。整體圖形很平衡,但明顯會有大量的交叉線在內部產(chǎn)生。極大的影響了圖的可閱讀性和美觀程度。
力導引布局的方法可以產(chǎn)生相當優(yōu)美的網(wǎng)絡布局,并充分展現(xiàn)網(wǎng)絡的整體結構及其自同構特征。該方法最早由Eades在1984年提出。其基本思想是將網(wǎng)絡看成一個頂點為鋼環(huán),邊為彈簧的物理系統(tǒng),系統(tǒng)被賦予某個初始狀態(tài)以后,彈簧彈力(引力和斥力)的作用會導致鋼環(huán)移動,這種運動直到系統(tǒng)總能量減少到最小值停止。
Kamada和Kawai改進了Eades的彈簧模型,提出KK算法。
圖4 未使用力導引布局的圖
2.4.1 KK算法
D3.js中的force方法提供了KK算法的基本實現(xiàn),由虎克(Hooke)定律,單個彈簧的能量E為:
其中:k是彈簧的彈力常數(shù),x是從未拉伸的長度起的位移。KK算法中的能量寫作:
其中:pv是節(jié)點v的位置向量,kuv是彈力常數(shù),luv是節(jié)點v和節(jié)點u之間理想的彈簧長度。假定在式(2)中,為了使所有的彈力模型只計算一次,那么必須使所有的節(jié)點以有序對的形式出現(xiàn)。模型的力基于kuv和luv值的選擇。彈簧未拉伸的長度定義為:
其中:L是單個邊的理想長度。d(u,v)是節(jié)點v和節(jié)點u之間在圖中對應的距離長度,和節(jié)點之間相隔的邊有關,即從節(jié)點u到節(jié)點v所經(jīng)過的邊數(shù)。對L可用兩種方法定義。一種方法是:
其中:W和H是顯示區(qū)域的寬和高,|V|是圖中節(jié)點的個數(shù),本質則是通過最終面積來確定節(jié)點之間的最佳長度。另一種方法是:
式中:Lo是顯示顯示區(qū)域的一條邊的邊長,diam(G)是圖G的直徑(即相距最長距離節(jié)點對之間邊數(shù))
這種方法稱為用圖的直徑定義理想邊長。對于不同的應用,可以用其他方法定義L。彈力常數(shù)kuv定義為:
其中:K是一個任意的常數(shù)。顯然用(3)和(7)代入到(2)中,得:
2.4.2 KK算法使用
算法本身由腳本文件直接生成,即組成html頁時可以直接將節(jié)點和連線生成,但若要根據(jù)實際情況更優(yōu)化的顯示圖譜,仍需要對參數(shù)進行修改和調試,其中l(wèi)inkDistance即為KK算法中l(wèi)uv,charge則是KK算法中的kuv。
圖5 l=600,k=-800
圖6 l=1 000,k=-800
圖7 l=600,k=-1 200
通過圖5,6,7 3張圖的比較,不難發(fā)現(xiàn),kuv對于圖最終的布局影響并不大,主要體現(xiàn)在了圖生成過程中的速度,以及個邊不相鄰節(jié)點之間的距離,圖7中個別節(jié)點的距離比圖5中的距離大。而luv對最終圖的影響比較大,如圖6,當luv=1 000時,明顯可以看到節(jié)點連線的夾角變大,整體圖的效果比luv=600時顯得松散。這和節(jié)點的數(shù)量本身有關,因此根據(jù)實際需要,節(jié)點總數(shù)量,子節(jié)點數(shù)量的各方面因素決定此處選擇luv=600,kuv=-800。
基于以上技術的分析,本文通過visual studio建立了一個wpf項目。在系統(tǒng)搜索欄中搜索某種中藥名,窗體左側便呈現(xiàn)以該中藥為中心節(jié)點的知識圖譜。通過知識圖譜,可以清楚了解該中藥的性、味、歸經(jīng)情況,還可以找到與該中藥有相似處甚至可替換的其他中藥。從效果圖圖8中可以看出,利用KK算法調整后的圖整體布局平衡,交叉點少。
本文研究了中醫(yī)藥知識圖譜可視化的相關技術,主要包括層析結構設計、節(jié)點生成、html頁面生成和力導引布局4個部分,以此為基礎,最終將網(wǎng)絡上、書本上零散抽象的中醫(yī)藥知識進行整合、分類,并實現(xiàn)了一個高交互性的可視化系統(tǒng)。該系統(tǒng)為用戶提供全面、及時、可靠的知識服務,也為中醫(yī)藥知識圖譜的進一步發(fā)展提供了一些參考。
圖8 結果展示