陶妍心,楊 濤**,謝佳東,趙 靜,董海艷,胡孔法
(1. 南京中醫(yī)藥大學人工智能與信息技術(shù)學院 南京 210023;2. 南京大經(jīng)中醫(yī)藥信息技術(shù)有限公司 南京 210023)
處方用藥是中醫(yī)臨床診療的核心與基礎(chǔ)。用藥是否準確、配伍是否精當將直接影響臨床療效。長期以來,名老中醫(yī)的臨床用藥規(guī)律是中醫(yī)臨床研究的熱點之一。如何從大量醫(yī)案中挖掘名老中醫(yī)的治療經(jīng)驗,已經(jīng)成為中醫(yī)傳承與發(fā)展的重要方向。隨著信息技術(shù)的發(fā)展,越來越多的算法(如關(guān)聯(lián)規(guī)則、聚類分析、復雜網(wǎng)絡(luò)等)被應用到醫(yī)案挖掘中,極大地提高了醫(yī)案分析和整理的效率。在眾多方法中,復雜網(wǎng)絡(luò)以其處理復雜問題的獨特優(yōu)勢,得到中醫(yī)學術(shù)界越來越多的關(guān)注。社團發(fā)現(xiàn)作為復雜網(wǎng)絡(luò)范圍內(nèi)的一種社團檢測方法,可以通過聚集具有相同特點或表現(xiàn)出協(xié)調(diào)性的節(jié)點,從而挖掘網(wǎng)絡(luò)中的隱含知識[1-2]。將社團發(fā)現(xiàn)運用到中藥社團發(fā)現(xiàn)上,可以從醫(yī)案數(shù)據(jù)中挖掘有價值的中藥組合,進而總結(jié)名老中醫(yī)的臨床用藥規(guī)律,將對名老中醫(yī)經(jīng)驗傳承提供技術(shù)支撐。
復雜網(wǎng)絡(luò)是目前中醫(yī)病證用藥規(guī)律研究不可或缺的一種強有力工具,其中社團發(fā)現(xiàn)算法是根據(jù)“高內(nèi)聚、低耦合”原則,從復雜網(wǎng)絡(luò)中尋找聯(lián)系相對緊密的節(jié)點的方法。目前,社團發(fā)現(xiàn)在生物醫(yī)學、管理學、社會學等諸多領(lǐng)域均得到廣泛應用。學者們針對不同結(jié)構(gòu)的復雜網(wǎng)絡(luò),提出了多種社團發(fā)現(xiàn)算法,例如基于譜分析的算法[3-4]、基于模塊度優(yōu)化的算法[5-6]、層次聚類算法[7-8]、Girvan-Newman(GN)分裂法[9-10]等。
近年來,社團發(fā)現(xiàn)逐漸被引入到中醫(yī)藥領(lǐng)域,學者們通過將社團發(fā)現(xiàn)技術(shù)應用到對中藥社團提取中,極大地提高了中醫(yī)學病癥用藥規(guī)律發(fā)現(xiàn)效率。例如,李昕[11]等利用社團發(fā)現(xiàn)算法分析中藥治療肝炎肝硬化的用藥規(guī)律,發(fā)現(xiàn)代償期的治法以健脾益氣、養(yǎng)血疏肝、化瘀軟堅為主,失代償期的治法以健脾益氣、行氣利水、化瘀軟堅為主,為進一步指導臨床用藥提供了一定的理論指導;杜寧林[12]等利用社團發(fā)現(xiàn)算法分析中醫(yī)臨床的新藥組成,并構(gòu)建平臺集成算法實現(xiàn)基于臨床實際數(shù)據(jù)的中藥安全性分析、混淆因素分析、中藥七情分析和核心有效復方發(fā)現(xiàn)等新藥發(fā)現(xiàn)分析應用;史琦[13]等利用社團發(fā)現(xiàn)算法分析冠心病患者四診信息分布模式,并以1 480 例經(jīng)冠狀動脈造影確診為冠心病患者的70項四診信息為數(shù)據(jù)集進行實驗,發(fā)現(xiàn)網(wǎng)絡(luò)以度值較大的“倦怠乏力”、“健忘”和“腰膝酸軟”為中心,周圍輻射狀依次排列著反映氣虛、陰虛、血瘀、痰濁、陽虛、熱蘊、氣滯、脾虛的四診信息節(jié)點的組合網(wǎng)絡(luò)等。
在眾多的社團發(fā)現(xiàn)算法中,GN 算法是最常用的方法之一[14]。其通過分類統(tǒng)計所有出現(xiàn)在同一對象中的元素,兩兩相連構(gòu)造完全圖,在圖中通過循環(huán)剔除邊介數(shù)高的邊對初始社團進行劃分。利用GN 算法分析中藥數(shù)據(jù),能夠發(fā)現(xiàn)部分中藥社團,但由于采用了全連接組網(wǎng)方式,將所有出現(xiàn)在同一方劑中的中藥兩兩相連,導致計算復雜度的提升,冗余連接增加,影響后續(xù)社團發(fā)現(xiàn)效果。
鑒于此,本文提出一種綜合運用關(guān)聯(lián)網(wǎng)絡(luò)與層次聚類的中藥社團發(fā)現(xiàn)算法HCD,運用關(guān)聯(lián)網(wǎng)絡(luò)改進了傳統(tǒng)中藥組網(wǎng)方式,并運用自頂向下分裂的層次聚類劃分社團。在降低傳統(tǒng)算法時間復雜度的同時,增強了中藥社團發(fā)現(xiàn)結(jié)果的準確度。為了驗證算法的有效性,本文將HCD 應用到結(jié)腸癌醫(yī)案分析,提取名老中醫(yī)診治結(jié)腸癌的核心中藥社團,并對結(jié)果進行分析和討論。
(1)關(guān)聯(lián)度(Double Confidence Relation,DCR)
假設(shè)存在兩個中藥節(jié)點X,Y,則節(jié)點X,Y間的關(guān)聯(lián)度定義如下:
圖1 算法流程
其中,dis(X,Y)是中藥對(X,Y)的出現(xiàn)頻率,dis(X)和dis(Y)則分別是單獨中藥X和Y的出現(xiàn)頻率。
(2)邊權(quán)比(Betweenness Value,BV)
其中betweenness為邊介數(shù),value為邊權(quán)值。
其中σst(v)表示經(jīng)過節(jié)點v 的s →t 的最短路徑條數(shù),σst表示s →t的最短路徑條數(shù)。
HCD 算法包括中藥矩陣構(gòu)建、關(guān)聯(lián)網(wǎng)絡(luò)構(gòu)造、邊權(quán)比網(wǎng)絡(luò)轉(zhuǎn)換、社團分裂四個核心步驟(如圖1所示)。
①中藥矩陣構(gòu)建
掃描中藥數(shù)據(jù),得到不含重復的總中藥集合。遍歷原數(shù)據(jù)集,對比總中藥集,取行為中藥,列為方劑號。在同一方劑中,中藥出現(xiàn)則置1,未出現(xiàn)則置0,構(gòu)成中藥0-1矩陣,以此作為計算準備。
②關(guān)聯(lián)網(wǎng)絡(luò)構(gòu)造
利用矩陣運算分別計算兩味中藥的分別出現(xiàn)次數(shù)以及其共同出現(xiàn)次數(shù),按照關(guān)聯(lián)度計算公式得到兩味中藥節(jié)點間關(guān)聯(lián)度,重復上述步驟得到所有節(jié)點兩兩之間的關(guān)聯(lián)度,為組網(wǎng)作準備;通過遍歷所有的中藥組合,將中藥輸入節(jié)點集、取關(guān)聯(lián)度與閾值進行比對,大于閾值者將兩節(jié)點構(gòu)成的邊輸入邊集并將關(guān)聯(lián)度作為該邊權(quán)值,小于或等于閾值則排除,構(gòu)成關(guān)聯(lián)網(wǎng)絡(luò)。
③邊權(quán)比網(wǎng)絡(luò)轉(zhuǎn)換
首先,將關(guān)聯(lián)網(wǎng)絡(luò)的邊集與節(jié)點集作為數(shù)據(jù)集輸入,為邊權(quán)比網(wǎng)絡(luò)轉(zhuǎn)換做準備;其次,將網(wǎng)絡(luò)中各節(jié)點分別作為源節(jié)點,計算各邊從節(jié)點到源節(jié)點的經(jīng)過最短路徑的次數(shù)之和,即各邊邊介數(shù)的計算;最后,將邊介數(shù)除以對應權(quán)值計算出各邊的邊權(quán)比,并將其作為權(quán)值構(gòu)成邊權(quán)比網(wǎng)絡(luò)。
④社團分裂
層次聚類即對數(shù)據(jù)集采用某種方法逐層地進行分解或者匯聚,直到分出的最后一層的所有的類別數(shù)據(jù)滿足要求為止。本文采用自頂向下分裂的層次聚類劃分社團。首先,將邊權(quán)比網(wǎng)絡(luò)的帶權(quán)邊集與節(jié)點集作為數(shù)據(jù)集輸入,為社團劃分做準備;其次,找出所有邊中邊權(quán)比最高的邊并將其從網(wǎng)絡(luò)中移除;然后,重復上述過程直到網(wǎng)絡(luò)中所有邊都被刪除,即每個節(jié)點都是一個社團為止,得到最終的分裂樹即為劃分結(jié)果。最后,通過計算不同閾值下社團劃分的模塊度,選擇模塊度最高的劃分作為最優(yōu)結(jié)果。
HCD(data,confidence)
INPUT:原始方劑數(shù)據(jù)集,閾值
OUTPUT:不同中藥社團
DISCRIPTION:輸入原始方劑數(shù)據(jù)集,將其轉(zhuǎn)化為由中藥編號為行,方劑編號為列構(gòu)成的中藥0-1 矩陣,以便計算單種中藥出現(xiàn)頻數(shù)與組合中藥出現(xiàn)頻數(shù)。再通過計算兩兩節(jié)點間的DCR并與閾值作比較,大于閾值者以DCR作權(quán)值輸入邊集,其余剔除。依據(jù)帶權(quán)邊數(shù)據(jù)集與節(jié)點集構(gòu)建中藥網(wǎng)絡(luò),再通過不斷剔除邊權(quán)比高的邊并循環(huán),得出最終分裂樹,即社團劃分結(jié)果
PROCESS:
1: import numpy as np
2: import pandas as pd
3: for foo in data:#data為原始方劑數(shù)據(jù)集
4: clean.append( foo)
5: clean = list(set(clean)) #clean 為無重復中藥種類集
6: for i in range(len(data)):
7: for j in range(len(clean[ j])):
8: if clean[j]in data[i]:
9: fangji.append("1")
10: else:
11: fangji.append("0")
12: array.append( fangji) #fangji 為單個方劑的臨時集合
13: array = np.array(array,dtype = 'int') #array為中藥0-1矩陣
14: for x,y in range(len(array)): #單次分別取x,y兩種中藥
15: numberx = np.sum(arrayx[:,x]) #numberx為矩陣中x列中藥的出現(xiàn)次數(shù)
16: numbery = np.sum(arrayy[:,y]) #numbery為矩陣中y列中藥的出現(xiàn)次數(shù)
17: numberxy = np.sum(np.multiply(arrayx[:,x],arrayy[:,y]))#numberxy 為中藥0-1 陣中x 和y 列中藥共同出現(xiàn)的次數(shù)
18: Confidencex = numberxy/numberx
19: Confidencey = numberxy/numbery
20: if Confidencex > Confidencey:
21: DCRxy = Confidencex
22: else:
23: DCRxy = Confidencey
24: if DCRxy > confidence#DCRxy為xy關(guān)聯(lián)度
25: value = DCRxy#value為邊的權(quán)值集
26:add nodes into vertex
27:add edge and value into edges #使用邊集edge與權(quán)值集value逐步創(chuàng)建帶權(quán)邊集edges
28:vertex = list(set(vertex))#vertex為去重節(jié)點集
29:create network with vertex and edges#依據(jù)邊和節(jié)點集創(chuàng)建中藥節(jié)點網(wǎng)絡(luò)
30:do{
31: caculate betweenness in edges #計算所有邊的邊介數(shù)betweenness
32: caculate BV in edges #計算所有邊的邊權(quán)比BV
33: select maxBV#選擇最大邊權(quán)比
34: remove edges[index(maxBV)]#移除邊權(quán)比最高的邊
圖2 GN劃分模塊度變化曲線
圖3 HCD劃分模塊度變化曲線
35: k = len(edges)#k為邊集中剩余邊數(shù)
36:}while(k!= 0)#k為0時跳出循環(huán)
本研究納入的病案資料為國醫(yī)大師周仲瑛工作室數(shù)據(jù)庫中記錄的結(jié)腸癌顯效及有效醫(yī)案969 診次,涉及269例患者。醫(yī)案采集時間為2005年1月至2015年12月。為了更好地進行分析,本文對醫(yī)案中的中藥數(shù)據(jù)進行了清洗,過程如下:
第一步,參照《中國藥典》對病案中的中藥進行規(guī)范化處理,包括藥名拆分、藥名規(guī)范化等,例如“丹皮參”拆分為“丹皮”和“丹參”兩味藥,“南北沙參”拆分為“南沙參”和“北沙參”,“白夕利”改為“白蒺藜”,“蛇舌草石上柏”拆分為“蛇舌草”和“石上柏”等。
第二步,運用正則表達式對數(shù)據(jù)進行過濾。首先,按照逗號對各方劑進行拆分,其次,將方劑中所用中藥名與別名表進行比對,統(tǒng)一規(guī)范化藥名,去空值、異常值。
為了驗證本文算法的有效性,將HCD 算法與經(jīng)典的社團發(fā)現(xiàn)算法GN進行比較,具體如下:
①使用GN算法進行社團劃分。
提取數(shù)據(jù)集中中藥節(jié)點,選取所有出現(xiàn)在同一藥方中的藥對進行共現(xiàn)概率計算,大于閾值則該邊保留并將其共現(xiàn)概率作為權(quán)值加入邊集,其余剔除。將組建的網(wǎng)絡(luò)圖輸出為節(jié)點集與邊集。通過不斷從邊集中剔除邊權(quán)比最高的邊進行中藥社團發(fā)現(xiàn)。閾值自0.1-1 以步長0.1 作自增長(若結(jié)果過低則將范圍縮小至原給定區(qū)域的1/10,即閾值自0.01-0.1 以步長0.01作自增長),比較不同閾值下的GN 社團劃分結(jié)果并依據(jù)模塊度對結(jié)果進行評判。
②使用HCD算法進行社團劃分。
依據(jù)3.2 中的HCD 算法流程對數(shù)據(jù)集進行劃分,得到社團劃分結(jié)果。設(shè)定閾值自0.1-1 以步長0.1 作自增長,比較不同閾值下的HCD 劃分結(jié)果并依據(jù)模塊度對結(jié)果進行評判。
③分別選取步驟①和②中模塊度最高的結(jié)果進行橫向比較并給出評價。
①閾值自0.1-1 以步長0.1 作自增長變化情況下GN算法劃分社團模塊度變化如圖2(a)所示。
從圖2(a)中可以看出:GN 劃分社團的模塊度隨閾值變化總體幅度較小,難以辨別明顯特征,故選擇將閾值變化范圍縮小至1/10,即閾值自0.01 起,以步長0.01 作增長,0.1 為封頂進行觀察,結(jié)果如圖2(b)所示。從圖2(b)中可以看出:GN 劃分社團的模塊度最大值低于0.006,且模塊度曲線取值整體偏低。
②閾值自0.1-1 以步長0.1 作自增長變化情況下HCD算法劃分社團模塊度變化(見圖3)。
圖4 GN算法與HCD算法組網(wǎng)結(jié)果對比
表1 GN與HCD劃分社團結(jié)果模塊度對比
表2 中藥社團劃分情況Top 10
從圖3 中可以看出:HCD 劃分社團的模塊度曲線在閾值區(qū)間[0.5,0.8]內(nèi)取值持續(xù)高于0.8,且模塊度曲線取值整體較高,并于閾值區(qū)間[0.1,0.8]表現(xiàn)出隨閾值增長趨于穩(wěn)定。進一步對比HCD 和GN 模塊度(見表1),可以看出HCD模塊度較GN有大幅度提升。
③最高模塊度時GN算法與HCD算法組網(wǎng)結(jié)果分別如圖4(a)及圖4(b)所示。
從圖4(a)中可以看出:由GN 劃分的傳統(tǒng)網(wǎng)絡(luò)存在邊數(shù)過多、各節(jié)點間聯(lián)系較為凌亂、社團內(nèi)部聯(lián)系不緊密、社團外部聯(lián)系不稀疏等現(xiàn)象,整體而言社團劃分合理性較差[15];從圖4(b)中可以看出,由HCD 劃分的關(guān)聯(lián)網(wǎng)絡(luò)邊數(shù)較少,各節(jié)點間聯(lián)系清晰,同一社團內(nèi)部節(jié)點聯(lián)系較為緊密,不同社團外部聯(lián)系較為稀疏,社團劃分較為合理[16]。
④最高模塊度下HCD 算法劃分社團結(jié)果中藥物最多的社團有10 味中藥,較少的為2 位中藥,其中中藥數(shù)量排在前10的社團如表2所示。
從不同閾值情況下GN 算法劃分社團模塊度變化曲線(見圖2)可以看出,由于GN 算法采用全連接組網(wǎng)方式,將所有出現(xiàn)在同一方劑內(nèi)的中藥節(jié)點兩兩相連,并未剔除誤差節(jié)點與出現(xiàn)概率過小的邊,雖然增加了所成完全圖網(wǎng)絡(luò)中的邊數(shù)與節(jié)點數(shù),但也導致了時間復雜度的提升與誤差概率的增高,故采用GN 算法劃分社團的模塊度存在整體偏低的現(xiàn)象。從不同閾值情況下HCD 算法劃分社團模塊度變化曲線(見圖3)以及GN 與HCD 劃分社團結(jié)果模塊度對比(見表1)可以看出,HCD 采用關(guān)聯(lián)組網(wǎng)方式,擇取關(guān)聯(lián)度大于閾值的邊加入網(wǎng)絡(luò),故所成關(guān)聯(lián)網(wǎng)絡(luò)中不存在關(guān)聯(lián)過小的邊,整體而言降低了所成網(wǎng)絡(luò)的誤差率,因此社團劃分模塊度較高,且隨閾值增大曲線起伏逐漸平緩,不存在起伏過大或模塊度整體結(jié)果偏低的問題。此外,從GN 算法取最高模塊度時構(gòu)建的網(wǎng)絡(luò)(見圖4(a))中可以看出,所有存在聯(lián)系的節(jié)點全部在內(nèi),導致中藥節(jié)點與邊過于繁密且較為凌亂,難以找到清晰的中藥社團結(jié)構(gòu),并存在大多數(shù)中藥被劃分入同一社團的問題。而從最高模塊度下HCD 所劃分社團網(wǎng)絡(luò)(見圖4(b))中可以看出,中藥社團結(jié)構(gòu)清晰,存在聯(lián)系的節(jié)點大多被劃分入同一社團,不存在中藥節(jié)點與邊過于繁密的問題。
在表1 最高模塊度下HCD 算法的社團劃分結(jié)果中,如社團1“黨參,焦白術(shù),茯苓,炙甘草,生薏苡仁,澤漆,半枝蓮,蛇舌草,雞血藤,仙鶴草”中的“黨參,焦白術(shù),茯苓,炙甘草”為補氣健脾四君子湯,生薏苡仁健脾祛濕,澤漆行水消腫,半枝蓮,蛇舌草清熱解毒,藥理研究有抗癌作用,雞血藤補血活血,仙鶴草收斂止血、截瘧止痢,整方攻補兼施,病證結(jié)合用藥;社團2生地黃,丹皮,水牛角片,紫草,狗舌草”中的“水牛角,生地黃,丹皮”即為《外臺秘要》中記載犀角地黃湯主要配比,水牛角清熱解毒,生地黃,赤芍清熱滋陰,丹皮涼血止血,加之“紫草,狗舌草”,整方清熱解毒,涼血化瘀,且具抗腫瘤功效;社團8“半夏,陳皮”即為化痰基礎(chǔ)方二陳湯的基本配比。二陳湯被宋代《太平惠民和劑局方》記錄在內(nèi),具有燥濕化痰、理氣和中的功效;社團9“黃連,吳茱萸”為左金丸的藥物組成,黃連多而吳茱萸少,辛開苦降,可瀉肝經(jīng)痞熱,使熱從下達,有清瀉肝火之效,同時可治療肝火橫逆,脅痛吞酸噯腐,濕熱下痢、泄瀉。社團4、5、6 中,“紫花地丁,半邊蓮”內(nèi)兩味藥便常相輔為用,為半邊蓮地丁茶中標準配比。半邊蓮地丁茶出自《中醫(yī)良藥良方》,其性味甘平,可利水消腫解毒,而“商陸,黑丑”亦可滲濕行水,使腹水由小便外解,從而達到治療肝硬化腹水一癥的效用,此外“訶子,石榴皮”兩者皆為收斂固澀類藥,有中醫(yī)專家認為訶子、石榴皮除有收斂固澀之功外,尚有苦泄下氣之效,不僅可用于虛證腹瀉,亦可用于實證腹瀉,臨床只要配伍得當,對于各種腹瀉均可起到良好的止瀉效果[17],皆可達到防治結(jié)腸癌的功效。
綜上所述,運用HCD 算法進行的中藥社團發(fā)現(xiàn)結(jié)果符合中醫(yī)評價標準,且符合專家經(jīng)驗。HCD 算法將關(guān)聯(lián)網(wǎng)絡(luò)和層次聚類相結(jié)合,通過計算節(jié)點間基于雙向置信度的關(guān)聯(lián)度構(gòu)造關(guān)聯(lián)網(wǎng)絡(luò),解決了不均衡情況下的單向依賴關(guān)系,在保證中藥初始網(wǎng)絡(luò)精簡有效的基礎(chǔ)上,運用基于邊權(quán)比的層次聚類方法對網(wǎng)絡(luò)進行劃分,能夠較好地解決中藥社團劃分問題。
本文通過對過往人們所使用的探索中醫(yī)用藥規(guī)律的方法進行思考,分析復雜網(wǎng)絡(luò)社團發(fā)現(xiàn)方法對探索用藥規(guī)律的重要意義,探究傳統(tǒng)社團發(fā)現(xiàn)方法應用于中藥社團發(fā)現(xiàn)上的種種不足,提出了一種新型的中藥社團發(fā)現(xiàn)算法HCD,從醫(yī)案中的中藥配伍規(guī)律分析入手,通過矩陣運算、關(guān)聯(lián)網(wǎng)絡(luò)、層次聚類等方法,建立相應的中藥社團發(fā)現(xiàn)算法HCD,利用模塊度對各閾值下的結(jié)果進行評價,選擇模塊度最高的中藥網(wǎng)絡(luò),最后對社團劃分的結(jié)果進行評價。利用該算法對中醫(yī)醫(yī)案方藥進行分析,成功提取了不同中藥社團,結(jié)果符合專家經(jīng)驗。本文提出的中藥社團發(fā)現(xiàn)算法HCD 具有原理簡單、易于實現(xiàn)等特點,可以為廣大中醫(yī)藥臨床和科研工作者提供便捷、高效、易用的中藥社團發(fā)現(xiàn)工具,提高中醫(yī)臨床醫(yī)案研究的效率,為名老中醫(yī)用藥經(jīng)驗傳承提供方法學參考。