常炳國 劉清星
(湖南大學信息科學與工程學院 湖南 長沙 410082)
非結構化數據已經逐漸成為數據挖掘領域的研究熱點之一[1],而醫學文本作為非結構化文本數據的一個重要組成部分,對其進行挖掘,將推動醫學技術的發展。醫學文本相似度分析主要是計算實時醫學文本與各個歷史醫學文本之間的相似程度,從中挖掘出一些相似度高的成功病例,以供醫生在診斷結果或治療方法上進行參考。
CT報告是醫學文本數據的一類,是病人進行CT檢查后得到的文本式診斷報告,其主要內容包括醫生對影像所見描述和根據所見及醫生的經驗得出的診斷建議結果。肝CT檢查是診斷慢性肝病過程中對肝部、腹部等部位進行掃描的檢查項,對于慢性肝病的診斷靈敏度極高[2]。醫生根據肝CT影像圖片,對肝臟以及肝臟相關器官大小、形狀等各方面進行綜合描述,進而給出適當的診斷意見。而隨著醫療數據的不斷增加,CT報告中,高相似度的CT檢查所見文本之間具有高相似度診斷意見,所以經驗豐富的醫生的診斷意見對于經驗不足的醫生來說具有極大的參考價值,這可以在一定程度上減少他們的誤診率。
醫學自然語言處理發展以來,不管是實體識別、信息抽取還是相似度計算[3-4],其基礎都是分詞。盡管中文自然語言處理已經有了比較大的發展,但由于醫學語言自身的特征,中科院的NLPIR[5]、復旦大學的FNLP[6]等通用的分詞工具在處理專業領域分詞方面不能達到令人滿意的效果。此外,國內中文醫學術語標準化進程不足,國外UMLS[7]等也缺乏對中文的支持。
論文在研究慢性肝病醫學詞庫基礎上,運用網絡爬蟲技術獲取相關網站醫學詞匯以及自定義否定詞匯表,構建了包含約6 000個醫學詞匯的慢性肝病CT報告分詞詞庫。運用基于詞庫與最大匹配規則相結合的分詞算法,對肝CT報告文本進行分詞處理。利用Doc2Vec深度學習算法獲取CT報告文本分詞表的句向量,并計算句向量之間的余弦相似度作為CT報告文本相似度。
本文所處理的CT報告數據來自某三甲醫院去敏感信息后的真實CT報告。CT報告采用自然語言進行的文本描述,報告句式結構是描述對象和對描述對象的描述詞,包括方位詞、副詞、固定結構以及大量的專業詞匯和否定詞匯,如“未見明顯異常、不規則縮小”等。論文就CT報告的檢查所見描述信息進行文本相似度計算與應用實驗。表1列出CT報告的句式結構。

表1 CT報告句式結構
相似度分析過程包括構建詞庫以及對文本進行相似度計算兩個部分,而相似度計算基于詞典分詞并進行調參等處理,最后得出相似度top前n的文本,整體流程如圖1所示。

圖1 CT報告相似度分析整體流程
2.2.1 構建詞庫
針對CT報告文本專業性強的特點,直接利用分詞算法進行分詞,會出現很多醫學上關鍵詞以及文本中的否定詞匯無法被識別,分詞效果極差。因此,為了提高分詞準確率以及保證分詞結果能以最大粒度切分,本文通過自定義醫學詞庫來構建分詞詞庫,其主要由三大部分組成:醫學專業詞庫、醫學否定詞詞庫以及停用詞詞庫。
醫學專業詞庫分為三個部分:通過“網絡爬蟲”爬取醫學網站得到的解剖學等專業詞匯,從現存醫學標準詞庫(SNOMED CT[8]與“搜狗醫學詞庫”)中提取的關鍵詞匯以及影像科醫生總結出來的常見的對肝CT進行描述的專業詞匯。其中每一個詞匯都進行了詞性以及詞頻的標注,如“肝內外膽管 nz 300”,“肝內外膽管”是一個醫學專業詞匯,nz代表其他專有名詞,300代表詞頻。
醫學否定詞詞庫包括兩大部分,一個部分是具有否定性質的專業詞庫和具有否定性質的修飾詞詞匯。例如:“異常強化灶”、“欠光整”、“未見”、“無”等。
停用詞詞庫包括在報告文本中具有高頻率,但是其實際意義又不大的詞。它主要包括了介詞、副詞、語氣助詞、連詞等,通常這種詞的自身并沒有明確意思,只有當把它們放到一個完整的句子中才會起到一定的作用,例如“大約”、“及”、“一個”等。
在構建的詞庫過程中,醫學專業詞庫和醫學否定詞詞庫會合并去重形成一個用作分詞的自定義詞庫,而停用詞詞庫作為分詞中需要過濾的過濾詞詞庫使用。
2.2.2 數據預處理
正文在進行分詞之前,要對原始數據進行三個方面的預處理。第一,要去掉每條文本記錄中含有的回車符,然后以一條記錄為一句,把所有的文本數據導入到同一個文本文件中,每條文本記錄之間以回車符分隔。第二,根據自定義的停用詞詞庫,將第一步所形成的文本文件中的“大約”、“一”等停頓詞去掉,將“×”等特殊符號替換成電腦可識別的“*”等符號。第三,為了提高文本相似度,在對文本進行分詞之后,根據自定義含否定性質的修飾詞詞庫,將含有否定性質詞的短句去掉。例如:“左側腎盞見一小結節狀致密影”和“左側腎盞未見一小結節狀致密影”,去停用詞后分別為“左側腎盞見小結節狀致密影”和“左側腎盞未見小結節狀致密影”,這兩句話除了“見”和“未見”兩個字的區別,其他完全一樣,但它們的意思完全相反,相似度為零,所以在預處理時會將含有“未見”等否定修飾詞的短句去掉。
2.2.3 分詞算法
在分詞之前必須要對數據進行預處理,將各條文本數據去換行符等停用詞后,以一條數據為一行的方式將全部數據記錄導入一個文本文件里,因此一位病患的CT報告文本在文本文件里對應的是一句。分詞的方法有很多,主要分為三大類:基于理解的分詞方法、基于規則的分詞方法和基于統計的分詞方法[9]。因為已經構建好了比較完善的自定義詞庫,所以本文采用改進的規則與統計相結合的方法來對文本進行分詞,該方法主要是在基于最大逆向匹配算法的結巴分詞算法[10]基礎上進行改進,改進后效果明顯優于結巴分詞。
在文獻[11]的研究中,對句子進行正向最大匹配和逆向最大匹配切分,然后對切分后的兩種結果進行比較,提出了歧義檢測成功和歧義檢測失敗兩個概念。即這兩種方式切分的結果有90%的概率重合且正確,有約9.0%的概率其中必有一個的結果是正確的,稱為歧義檢測成功,而兩種切分結果都是錯的或者重合后是錯的,只有約1.0%的可能性,稱為歧義檢測失敗。本文基于自定義詞典,結合兩種不同的切分方法切分得到兩種分詞結果,對其進行以下處理:若它們的分詞個數不一樣,則將數量較少的分詞結果作為最終分詞結果;若它們分詞個數不一樣,但分詞結果一樣,則返回任意一個切分結果,分詞結果不一樣,則比較兩個結果中單字的個數,返回單字少的結果。以切分“左側腎盞未見小結節狀致密影”為例,此時設置的最大詞長為“4”,如表2所示。

表2 分詞算法示例
針對慢性肝病CT報告文本數據短、專業性強的特點,在對CT報告文本進行分詞之后,選用深度學習doc2vec算法對其進行句向量表示,再計算句向量之間的余弦值來確定其相似度。
2.3.1 詞向量
自然語言處理(NLP)的問題要轉化為計算機能夠處理的相關機器學習問題,首先要處理的事情是將自然語言這些文字符號語言進行數字化處理。One-hot Representation是最常用的詞表示方法,它采用稀疏矩陣的方式,給每個詞分配一個數字 ID,用一個很長的向量來表示每個詞。矩陣的總維度就是詞表大小,當前詞維度標為1,其他表示為0。例如:“乙肝”表示為 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …],“肝硬化”表示為 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]。但是這種方法最大的弊端在于:只能表示詞本身而不會考慮語義距離,即任意兩個詞之間都沒有聯系的。例如:“乙肝”和“肝硬化”同屬于慢性肝病,但是這兩個向量中來看這兩個詞毫無關聯。此外,由于稀疏矩陣高維的表示,可能會帶來維度災害。
由此,本文采用分布式表示的方法來表示詞向量[12]。它是一種低維空間的密集表示方法,這種方法的優點在于便于在詞本身的基礎上,從語義上計算相關或相似的詞之間的距離,例如:肝臟[0.792, -0.177, -0.107, 0.109, -0.542, …],每個維度上的數值代表著它與其他詞之間的關聯度。這種低維空間的表示法不但解決了高維數稀疏矩陣帶來的災難問題,并且還能通過詞之間距離的計算來挖掘詞與詞之間的關聯度,例如:“乙肝”和“感冒”的距離會遠遠小于“乙肝”和“肝硬化”。
2.3.2 Word2Vec算法進行詞向量分析
基于分布式表示方式,本文利用深度學習的思想,采用Word2Vec算法[13],通過訓練將文本內容中的每個詞映射成K維實數向量(K為超參數),再通過詞之間的距離(比如cosine相似度、歐氏距離等)來得出在向量空間上的相似度,從而得出詞之間在語義上的相似度。它采用的是一個三層(輸入層、投影層、輸出層)的神經網絡,在對語言模型進行建模的同時來獲得詞在向量空間上的詞向量表示。而基于Log-Bilinear語言模型中的Hierarchical Softmax,Word2Vec有兩種不同的模型進行語言建模:連續詞袋模型CBOW(Continuous Bag of Words)和Skip-gram模型。其中,CBOW模型的目標是根據相鄰詞向量來預測中間詞的概率,而Skip-gram模型剛好相反,它是根據中間詞來預測相鄰詞的概率,主要是通過在語料庫上的不斷迭代,計算出詞向量。
以CBOW預測詞Ct出現的概率為例,其優化目標函數的條件概率函數如下:
P(Ct|context)=p(Ct-n,Ct-n-1,…,Ct+n)
(1)
式中:Ct-n到Ct+n是2n個詞Ct的上下文context,以One-hot方式進行表示并組合成|W|2n維詞向量稀疏矩陣D,|W|是文本中所有詞集合的大小。如圖2所示,神經網絡模型的輸入層節點就是矩陣D中的行向量D(t-n)到D(t+n),而在投影層會將這2n維向量進行求和累加,形成2n×2n維的向量x,并通過激活函數tanh的計算得到一個向量y,y是一個|W|×1維的向量,它的每一個元素yi代表都代表著下一個詞Ci的未歸一化概率。

圖2 CBOW三層神經網絡結構模型
然后,在輸出層上使用softmost函數進行歸一化處理,得到t,公式如下:
t=a+Ktanh(b+Hx)
(2)
式中:a表示投影層到輸出層的偏置向量,矩陣K是投影層到輸出層的權重,矩陣H是輸入層到投影層的權重,b是輸入層到投影層的偏置向量。
最后,在輸出層會對應形成一棵以語料庫中出現過的詞為葉子結點、以各詞在語料庫中出現次數為權值的huffman樹,并輸出Ct的詞向量。
Skip-gram模型與CBOW很相似,只是Skip-gram模型不是選取2n個上下文作為輸入層的輸入,而是直接以當前詞為樣本中心,恒等投影到投影層,最終在輸出層得到一棵huffman樹。
由此可知,通過三層神經網絡模型進行語言建模,根據上下文信息進而獲得詞向量表示,使得語義信息在詞本身的基礎上變得更加豐富。
2.3.3 Doc2Vec算法進行詞向量分析
基于Word2Vec詞向量表示模型對詞的維度進行語義分析,文獻[14]提出了Doc2Vec模型,該模型主要是對可變長度文本的上下文進行語義分析,并對文本進行句向量表示。而以此模型為基礎,最后通過文本句向量計算文本各段落之間的距離就可以得到其相似度。
相對Word2Vec的兩種CBOW模型與Skip-grim模型,Doc2Vec模型也存在兩種語言建模方法:Distributed Memory(PV-DM) 模型和 Distributed Bag of Words(PV-DBOW)模型。PV-DM模型在CBOW模型的基礎上進行改進,即在給定上下文和段落向量的情況下預測單詞的概率。而PV-DBOW 模型則是基于Skip-grim模型,在僅給定段落向量的情況下預測段落中一組隨機單詞的概率。
Doc2Vec的兩種語言模型在Word2Vec的兩種語言模型的基礎上做以下兩個改進:一個是會在訓練過程中給訓練語料庫中的每一個句子都新增一個唯一的編號(PI),這個編號和句子中的詞一樣,會先被映射成一個向量(PV)。在之后投影層的計算里,會將PV和句子的詞向量進行累加或者連接,作為輸出層歸一化函數softmax的輸入。在整個訓練過程中,每個句子的PI是保持不變的,而且它們共享著同一個PV,這就相當于每次在預測單詞或者上下文的概率時,都利用了整個句子的語義進行分析。另一個是會在進行預測階段重新給待預測的句子分配一個編號(PI),而此時的詞向量以及輸出層中歸一化函數softmax的參數保持訓練時得到的參數不變,然后利用梯度下降法訓練所有參數,使其待收斂后,即得到待預測句子的PV。如圖3所示,以PV-DM模型的訓練過程為例。

圖3 PV-DM模型訓練過程
PV-DBOW模型的訓練過程和Skip-gram模型的很相似,不同的是根據文檔向量來預測上下文單詞出現的概率。在實驗中會將由Doc2Vec算法的兩種模型訓練而來的詞向量進行拼接使用。
2.3.4 相似度計算
由Doc2Vec得到經過處理的醫療文本每個句子的句向量之后,接下來就是計算句向量之間的距離,從而匹配出與預測句子最相似的句子。本文采用計算兩句向量之間余弦值的方法來確定句向量之間的距離,從而確定每個句子之間的相似度,同樣地在對句向量進行余弦值計算的時候,每個句子都會被分配一個唯一的ID。那么,對于兩個n維的向量S和T,S=(s1,s2,…,sn)和T=(t1,t2,…,tn),其余弦值的計算公式是:
(3)
計算得到的余弦值是一個大于等于0、小于等于1的數,用這個數就可以表示每個文本之間的相似程度。本文進行多次實驗后,給相似度設置了一個閾值,輸出top前n個具有醫學參考價值文本。
實驗研究選擇某三甲醫院6 900份真實的肝病影像報告,包括5 100份CT報告,1 800份超聲檢查報告。
對實驗參數進行設置,通過反復調節,選擇詞向量的維度為18、訓練窗口為9即上下文的選詞個數為9時,相對其他組合的參數來說,在算法執行過程中具有較好的分類性能,且算法時間復雜度最小。當迭代次數為30時,對一個文本進行多次相似度計算所得的相似文本結果較穩定。在計算余弦相似度時,其閾值設置為0.7時,獲得的相似文本對醫生給出診斷意見具有較高的參考價值。
基于自定義的醫療詞庫,在結巴分詞的基礎上對分詞算法進行改進,改進后算法的準確率以及召回率明顯高于結巴分詞。將自定義詞庫兩種算法之中進行分詞比較,如表3所示。

表3 分詞算法比較
其中,召回率指的是正確的分詞個數與分詞標答的比值,而準確率指的是正確的分詞個數與分詞結果的比值,但是由于它們屬于此消彼長的關系,所以采用F值來綜合判定并比較它們的效果,計算公式如下:

(4)
可見,改進后分詞的效果要比結巴分詞的效果要好,且它的準確率達到了87 %,這為下一步醫療文本相似度的計算打下了良好的基礎。
實驗研究應用于醫院影像科室,醫生將患者CT檢查所得輸入到相應的文本框,當點擊相應的按鈕,便可獲取與輸入文本相似度為70 %(默認閾值)的所有文本以及這些文本相對應的病人信息和給出診斷意見醫生的名字,或者醫生也可以手動設置相似度閾值和診斷醫生的名字,來獲取相應條件的所有慢性肝病CT報告。當不進行條件篩選時,初診醫生和審核醫生的默認值是無。主界面如圖4所示。

圖4 應用主界面
為了能夠更好獲取統計信息,把實驗數據分成標準文本集和測試文本集兩個部分。標準集包括350條慢性肝病CT報告,測試集包括1 050條慢性肝病CT報告構成的匹配集和5 500條CT報告與超聲波報告混合構成的噪音數據集。其中,1 050條匹配數據是由人工整理而成,它與350條標準集都分別對應有3條具有95 %以上的相似度文本數據。
具體的實驗方法是:依次從標準文本集中取出第j條數據(0≤j≤349),計算它與測試文本集的相似度,獲取出最大相似度top-3的文本,將這3條文本數據與匹配集對應的3條文本進行比較,記下相同的條數nj作為正確的條數,最后通過如下公式計算準確率R值:
(5)
本文分別用三種不同的相似度算法對實驗數據進行分析并比較,在對各個算法調定參數之后,對其分別進行了五次實驗,而且為了保證算法的區分能力,每次實驗后都會隨機打亂匹配集與噪音集各條文本數據之間的順序再進行下一次實驗。表4對實驗結果及準確率進行展示,其中用于對比的三種算法分別是基于IF-IDF的詞頻統計算法[15-16]、基于潛在狄利克雷分配LDA(Latent Dirichlet Allocation)的主題模型分析算法[17]以及本文的算法。

表4 實驗結果對比
如表5所示,對表4中五次實驗的時間進行記錄,平均每條數據花費時長是指每次實驗所取500條數據進行匹配的平均每條花費時長,平均時長是指五次實驗平均每條數據花費的時長。

表5 實驗結果花費時長對比 s
對實驗結果進行分析,傳統的基于TF-IDF統計算法在計算文本相似度時只是基于詞頻進行統計,并不會對上下文的語義進行分析,而慢性肝病的CT報告文本長度短、專業詞匯多,且用于描述各條影像所見的詞匯也大多相同,所以其得到的準確率很低,也很不穩定,最后的平均準確率只有45.9 %,但所花費的時間卻是最少的?;贚DA模型的相似度算法主要是通過識別語料庫中的所潛在隱藏的主題信息來計算文本相似度,雖然在詞頻統計的基礎上新增了對文檔之間的語義分析,但是本文中所分析的慢性肝病CT報告之間隱藏的主題信息差別不是很大,因此所得結果的穩定性雖相對有所提高,但準確度不高,最后準確率為63.6 %。由于此算法也要計算TF、IDF值,所以在時間的花費也大大提高了。而本文所用算法,在詞向量的分布式處理、語義分析等方面都有很好的處理,每次實驗所得的結果相對來說都很穩定,平均準確率達到了90.8 %,因此相對來說時間代價也提高了。從時間維度來講,三種算法都用準確率換取了花費的時長,但是從準確率上來看,花費的時間代價是值得的。
本文利用慢性肝病CT報告的數據特征,研究慢性肝病醫學詞庫基礎上,構建了包含約6 000個醫學詞匯的慢性肝病CT報告分詞詞庫。運用基于詞庫與最大匹配規則相結合的分詞算法進行分詞,然后利用Doc2Vec深度學習算法以及余弦相似度算法,匹配歷史CT報告文本中相似度大于設置閾值的報告用于參考。本文整理分析了6 900份某三甲醫院真實的影像科檢查報告,通過實驗得出,基于自定義詞庫及改進的分詞算法,分詞準確率達到了87 %,而通過對比分析,基于Doc2Vec的相似度算法性能明顯優于傳統的基于TF-IDF的統計算法和基于隱含狄利克雷主題模型 (LDA)算法。最后,此實驗在醫院真實場景進行了應用,輔助醫生給出診斷意見。