倪 昊,張 旭,馬 帥,王悅綺,崔建峰
(1.廈門理工學院計算機與信息工程學院,福建 廈門 361024;2.廈門理工學院軟件工程學院,福建 廈門 361024)
隨著醫(yī)療行業(yè)信息化的快速發(fā)展,記錄患者臨床治療信息的電子病歷數(shù)據(jù)逐年增加。電子病歷信息大多以自由文本形式存在,臨床術語復雜多樣且不規(guī)范,無法直接提取信息加以利用[1]。從電子病歷文本中抽取事件信息結構化文本構建醫(yī)療事件數(shù)據(jù)庫,不僅可以提高醫(yī)生臨床診斷的效率,還有利于醫(yī)療科研分析、智能診療、患者畫像構建及病程追蹤的發(fā)展。
事件抽取技術在新聞、財經(jīng)、司法等領域均有廣泛應用[2],在自然語言處理領域,有人先后提出基于模板與規(guī)則、機器學習和深度學習的自動抽取模型用于事件抽取任務的實現(xiàn)。研究早期,Kraus等[3]通過設計大量正則表達式來抽取電子醫(yī)療記錄中的藥品名、劑量等實體,該算法相對簡單,但效率低,錯誤率高。針對這些缺陷,He 等[4]提出了基于機器學習的條件隨機場(conditional random field,CRF)聯(lián)合標簽模型,采用序列標注的方法抽取事件。這種抽取方法雖然比基于規(guī)則的抽取方法效率和準確率更高,但無法提取長文本信息,且通用性較差,識別策略單一。為克服以上缺點,Yan 等[5]提出基于深度學習的BiLSTM-CRF 模型,采用BiLSTM 提取上下文的隱藏特征,再使用CRF層對輸出結果進行約束,該模型可以提取長文本信息,通用性更高,具有強大的自學習能力[6]。但該模型屬于管道式抽取模型,觸發(fā)詞提取的誤差會傳播至論元提取任務,且未充分利用觸發(fā)詞與論元的聯(lián)系[7]。為解決此問題,研究人員提出了聯(lián)合事件抽取模型,如Lu 等[8]提出的端到端抽取模型Text2Event。該模型的所有子任務均處于同一框架中,通過共同學習改善了誤差傳播問題[9],但對于文本中的重復事件抽取效果較差。為解決重復事件提取問題,Sheng 等[10]提出了基于級聯(lián)解碼的聯(lián)合學習模型(novel joint learning framework with cascade decoding for event extraction,CasEE),該模型在重復事件抽取方面取得了良好的效果。但該模型主要面向通用領域,處理電子病歷文本會造成性能損失,且無法提取醫(yī)療事件的發(fā)生狀態(tài),對醫(yī)療事件抽取任務的支持尚有改進空間。
綜上所述,已有的醫(yī)療事件抽取模型存在誤差傳播且重復事件抽取效果不佳的問題,CasEE 雖解決了這2 個問題,但在醫(yī)療術語識別和發(fā)生狀態(tài)提取方面存在缺陷,尚未提出較好的解決辦法。為此,本文提出一種基于CasEE 的醫(yī)療事件聯(lián)合抽取模型,對CasEE 中的編碼層和事件分類器進行優(yōu)化和改進,將編碼層改為MC-BERT[11],實現(xiàn)對醫(yī)療術語的準確編碼,并改造事件分類器,將其用于發(fā)生狀態(tài)的提取。
醫(yī)療事件抽取是醫(yī)學數(shù)據(jù)處理中的一項關鍵任務,目標是從電子病歷中抽取醫(yī)療事件的主體詞、描述詞、解剖部位和發(fā)生狀態(tài)4個成分,其中主體詞、描述詞和解剖部位直接來源于病歷文本,而發(fā)生狀態(tài)分為“確定”“否定”和“不確定”3 種狀態(tài),需根據(jù)文本自行分類判斷。每條電子病歷可能包含一條或多條醫(yī)療事件,將其包含的所有醫(yī)療事件及相關成分逐一抽取,最終把非結構化的病歷文本轉(zhuǎn)化為結構化的病歷數(shù)據(jù)加以存儲。例如,對電子病歷文本“患者無明顯誘因出現(xiàn)尿色加深,如茶水樣,偶有痰中帶血,為鮮紅色,量不等,無全身皮膚瘙癢等不適”進行事件抽取,抽取所得結構化文本如表1 所示。以表1中事件3“無全身皮膚瘙癢”為例,該事件的主體詞為“瘙癢”,描述詞為“全身”,解剖部位為“皮膚”,發(fā)生狀態(tài)為“否定”。
表1 醫(yī)療事件抽取結果實例Table 1 Examples of medical event extraction results
事件抽取任務處理流程如圖1所示。具體抽取步驟如下:第1 步,將輸入的一條電子病歷文本進行詞向量編碼;第2步,將詞向量輸入事件分類器對該病歷所包含的醫(yī)療事件進行分類,確定事件的發(fā)生狀態(tài);第3 步,將提取到的事件類別信息與詞向量相融合,輸入觸發(fā)詞提取器提取觸發(fā)詞(該觸發(fā)詞即為醫(yī)療事件的主體詞);第4 步,將觸發(fā)詞信息嵌入到詞向量并輸入事件論元提取器中,分別對醫(yī)療事件的描述詞和解剖部位進行提?。坏? 步,將輸出結果進行聚合,得到結構化的電子病歷數(shù)據(jù)。
本文模型為聯(lián)合抽取模型,通過層疊指針網(wǎng)絡聯(lián)合進行觸發(fā)詞提取和事件論元提取2 個子任務,可對文本中復雜的事件進行提取。與管道抽取模型相比,聯(lián)合抽取模型可使2個任務損失優(yōu)化的方向得以統(tǒng)一[12]。改進后的醫(yī)療事件抽取模型的結構如圖2所示。
圖2 改進后的醫(yī)療事件抽取模型的結構Fig.2 Improved medical event extraction model structure
本文采用的數(shù)據(jù)集為第七屆中國健康信息處理會議CHIP2021[13]所提供的電子病歷數(shù)據(jù)集CHIPCDEE。該數(shù)據(jù)集共包含2 485條電子病歷文本和與之相應的通過人工標注提取出的結構化數(shù)據(jù)。由于人工標注時部分主體詞已經(jīng)過標準化處理,與原文中所用詞語不一致,且數(shù)據(jù)集包含的數(shù)據(jù)總量較少。本文通過近義詞替換法對電子病歷數(shù)據(jù)進行數(shù)據(jù)增強處理,以提高醫(yī)療事件抽取性能。
數(shù)據(jù)增強共分為3 個步驟:第1 步,篩選出結構化數(shù)據(jù)中與原文中不一致,映射失敗的主體詞,并查找這些詞匯的近義詞;第2步,用近義詞替換未對應的主體詞,將近義替換后的病歷數(shù)據(jù)插入原始數(shù)據(jù)集中,得到增強后的數(shù)據(jù)集;第3步,在模型完成事件抽取后,對結果進行標準術語替換。本文的數(shù)據(jù)增強實例如表2所示。
表2 數(shù)據(jù)增強實例Table 2 Examples of data enhance results
本文以65%、15%、20%的比例將原數(shù)據(jù)劃分為訓練集、驗證集和測試集,且僅對訓練集和驗證集的數(shù)據(jù)進行數(shù)據(jù)增強處理。數(shù)據(jù)分布統(tǒng)計情況如表3所示。
表3 數(shù)據(jù)分布表Table 3 Data distribution 單位:個
原始CasEE 模型難以準確識別病歷中的醫(yī)療術語,為此,本文將原始CasEE 模型的編碼層改為MC-BERT,實現(xiàn)對醫(yī)療術語的準確編碼。輸入的電子病歷文本首先通過詞向量編碼層進行向量化處理,編碼后的向量依次被送入事件分類器、觸發(fā)詞提取器和事件論元提取器。
MC-BERT 編碼層可以處理電子病歷中復雜的語言結構和大量的醫(yī)療術語。MC-BERT 由多個Transformer 組成,是針對中文醫(yī)療任務優(yōu)化改進的預訓練模型,具體結構如圖3 所示。圖3 中,En表示輸入電子病歷中的每一個字符,Trm 表示Transformer 編碼器,hn表示編碼層最終輸出的詞向量。
圖3 MC-BERT模型結構圖Fig.3 MC-BERT model structure
MC-BERT 在預訓練過程中注入了大量醫(yī)療實體和短語,可以更好地對電子病歷進行編碼。具體注入方法為:1)在掩碼語言模型中使用全實體遮蔽方式對詞語進行預測,例如對“布洛芬”等醫(yī)療領域?qū)S袑嶓w詞進行遮蓋,將類似的醫(yī)療實體注入模型;2)在掩碼語言模型中使用全跨度遮蔽方式對一些醫(yī)學相關的短語進行預測,如“頭有一點疼”等短語和醫(yī)療實體“頭痛”有類似的含義,將該類短語作為醫(yī)療實體的擴充注入模型。
事件分類器負責預測醫(yī)療事件的類別,用于后續(xù)對重復事件的提取。為提取醫(yī)療事件的發(fā)生狀態(tài),本文對事件分類器進行改造,將醫(yī)療事件劃分為確定事件、否定事件和不確定事件3類,使其在分類的同時實現(xiàn)發(fā)生狀態(tài)提取功能。該模塊通過注意力機制和相似度匹配實現(xiàn)類別預測。首先,隨機初始化一個類型矩陣C并定義相似度函數(shù)δ,該函數(shù)可以計算類型c與詞向量hi間的相關性得分。其次,分別計算句子中每個詞向量hi與類別c的相關性得分,得出該語句對于該類別的向量表示sc。最后,通過δ函數(shù)計算類型c與sc間的相似度即可預測出事件的類型。具體計算過程為
式(1)~(3)中:W和v為可學習參數(shù);c為類型矩陣C中的一個候選類型;hi為編碼層輸出的詞向量;⊙為哈達瑪乘積,表示符號前后兩矩陣對應元素相乘;N為語句中包含的詞向量總數(shù);σ為sigmoid函數(shù)。
為解決文本中重復事件較多的問題,觸發(fā)詞提取器以類別作為條件,對各類觸發(fā)詞進行分階段抽取。該模塊由條件融合函數(shù)、自注意力層和二進制標記器組成,將事件類型c與詞向量hi通過條件融合函數(shù)φ進行融合,該函數(shù)通過條件層歸一化[14]實現(xiàn),通過該函數(shù),可以獲得包含事件類型信息的詞向量。具體計算過程為
式(4)中:γc和βc分別為根據(jù)條件所動態(tài)生成的增益量和偏置量;μ、σ分別為hi的均值和標準差。
之后,將所得矩陣Gc輸入自注意力層[15]進一步提取隱藏特征得到Zc。自注意力層由多個注意力頭組成,各注意力頭的輸出相互連接,并通過參數(shù)化線性變換得到結果向量。具體計算過程為
式(5)~式(8)中:Gc是由向量組成的矩陣;Zc是由組成的矩陣;WV、WQ、WK為可學習參數(shù)矩陣;dz是矩陣WQ、WK的維度。
為了預測觸發(fā)詞,將自注意力層后接二進制標記器。對于每個字符wi,對其是否對應于觸發(fā)詞的開始或結束位置進行預測。為了獲得觸發(fā)詞t,首先枚舉句子中所有的起始點,再搜索起始點后距離最短的結束點,這兩點之間的詞語即為觸發(fā)詞。具體計算過程為
式(9)~式(10)中:是Zc中的第i個詞向量。通過此種方式,該模型可以根據(jù)類型提取重復的觸發(fā)詞。最后可以得到句中所有類別為c的觸發(fā)詞集合Tc,s。
事件論元提取器分別以事件類別和論元類別為條件,依次提取不同類型的事件論元,以此解決重復論元的提取問題。該模塊的結構與觸發(fā)詞提取器類似,由條件融合函數(shù)、自注意力層和二進制分類器所組成。
為預測與事件觸發(fā)詞t相關的論元,本模塊先對觸發(fā)詞t的開始和結束位置求平均值,再使用條件融合函數(shù)φ將觸發(fā)詞信息嵌入到詞向量中,使其感知到觸發(fā)詞信息。當該向量通過自注意力層后,再通過相對位置編碼[16],將距離觸發(fā)詞的長度嵌入到每個詞向量中得到Zct。具體計算過程為
式(11)~式(13)中:t表示觸發(fā)詞的邊界位置平均值;Gct是由向量組成的矩陣;P為觸發(fā)詞的相對位置。
最后通過二進制標記器來獲得與觸發(fā)詞相對應的論元提取結果。本任務需提取3 種論元,為此,由3個不同的二進制分類器分別對描述詞、解剖部位和發(fā)生狀態(tài)進行解析。
本文所進行的實驗基于Python 3.8語言和Pytorch深度學習框架,操作系統(tǒng)為64位Linux操作系統(tǒng),CPU為Intel(R)Xeon(lice Lake)Platinum 8369R@2.90 GHz,CPU型號為NVIDIA A10,顯存為24 GB。
本文使用精確率(P)、召回率(R)和F1值作為評價指標分別對各模塊的模型性能進行評估,其計算公式為:
式(14)~式(16)中:TP 代表真正例,即實際為正例且被模型預測為正例的屬性數(shù)目;FP 代表假正例,即實際為負例而被模型預測為正例的屬性數(shù)目;FN 代表假負例,即實際為正例而被模型預測為負例的屬性數(shù)目。
本文評價指標使用事件屬性來計算準確率、召回率和F1值,在電子病歷中,若醫(yī)療事件的某個屬性出現(xiàn)多個屬性實體,只有當提取的所有屬性都完全匹配時,才能統(tǒng)計為一個正確預測的樣本。
本實驗所使用的詳細參數(shù)如下:模型層數(shù)L=12,隱藏層維度H=768,采用多頭自注意力機制數(shù)A=16,損失函數(shù)使用交叉熵損失函數(shù),優(yōu)化器采用Adam 優(yōu)化器,采用的編碼層學習率為0.000 02,其他模塊學習率為0.000 1,學習率預熱比率為10%,MC-BERT 隱藏層dropout為0.1,解碼層dropout為0.3,最長序列長度為500,批處理大小為16,epoch 為20。
3.4.1 訓練loss變化和各模塊實驗結果
訓練過程中各模塊的loss 與F1值隨epoch 變化如圖4~圖6 所示。由loss 及F1值變化曲線可知,事件分類器和觸發(fā)詞提取器在epoch=2時即收斂,F(xiàn)1值分別達到94.17%和89.41%,在之后的訓練中沒有明顯變化。而事件論元提取器由于任務更難,收斂速度明顯更慢,F(xiàn)1值在第1~6 個epoch 間穩(wěn)步提升,后續(xù)F1值有所波動,最終在epoch=20時F1值穩(wěn)定在77.73%。
圖4 事件分類器訓練損失與F1值變化曲線Fig.4 Event classifier training loss and F1 value change
圖5 觸發(fā)詞提取器訓練損失與F1值變化曲線Fig.5 Trigger word extractor training loss and F1 value change
圖6 事件論元提取器訓練損失與F1值變化曲線Fig.6 Event argument extractor training loss and F1 value change
使用測試集數(shù)據(jù)測得各模塊的精確率、召回率和F1值見表4。本模型中事件分類器的表現(xiàn)最好,F(xiàn)1值最終達到94.17%,觸發(fā)詞提取器表現(xiàn)次之,F(xiàn)1值達到89.41%,論元提取任務難度較高,因此該模塊表現(xiàn)相對較差,F(xiàn)1值為77.73%,該模型在醫(yī)療事件抽取任務中的整體F1值為57.92%。
表4 各模塊精確率、召回率和F1值的實驗結果Table 4 Experimental results of accuracy,recall and F1 value by module 單位:%
3.4.2 對比實驗
為了驗證模型的有效性,本文選擇了2 種管道式抽取模型和2 種聯(lián)合抽取模型進行對比。其中模型1 和模型2 為管道式模型,分別是基于命名實體識別與關系分類的事件抽取模型和基于多范式融合的醫(yī)療事件抽取模型。模型3、模型4 和模型5 為聯(lián)合抽取模型,分別是端到端(seq2seq)的醫(yī)療事件抽取模型、原始CasEE 模型和本文所提出的模型。所有實驗均在CHIP-CDEE 數(shù)據(jù)集上進行訓練和測試,對比實驗結果見表5。
表5 不同抽取模型效果對比Table 5 Effect of extraction methods compared 單位:%
由表5可知,與管道式模型相比,聯(lián)合抽取模型在召回率上普遍更高。原因是管道式模型將醫(yī)療事件抽取分為幾個割裂的任務進行處理,使下游任務受上游任務誤差的影響較大,存在誤差積累問題[19],且上游任務無法根據(jù)下游任務的反饋調(diào)整參數(shù)權重。例如模型1將事件抽取任務一分為二,先通過BERT-BiLSTM-CRF 模型對文本進行實體識別,再通過BERT-DNN 模型對識別出的實體進行關系分類,得到完整醫(yī)療事件。該方法僅使用關系分類來確定事件觸發(fā)詞和論元間的關系,沒有考慮實體的位置及上下文信息,因此精確率、召回率和總F1值都最低。模型2包含觸發(fā)詞提取、論元提取和極性預測3個模塊,利用了上下文信息,精確率和總F1值比模型1優(yōu)秀,但召回率不如另外兩個聯(lián)合抽取模型。模型3 為seq2seq 模型,使用不同的分隔符來區(qū)分醫(yī)療事件的不同屬性,實現(xiàn)醫(yī)療事件的端到端抽取,召回率比管道式模型更高,達到39.28%,但該模型無法很好地處理電子病歷中的詞語嵌套和詞匯重復的問題,總體效果不如模型4 和模型5。模型4 由于采用了級聯(lián)解碼方法,在解決誤差積累問題的同時,改善了病歷中嵌套事件和重復事件的抽取性能,精確率、召回率和總F1值達到63.28%、51.90%和57.03%。但模型4是針對通用領域設計的,無法準確識別電子病歷中的大量醫(yī)療術語,也無法提取醫(yī)療事件的發(fā)生狀態(tài)。模型5 針對模型4 存在的缺陷,改用了針對生物醫(yī)學文本優(yōu)化的編碼層,同時在訓練時進行了數(shù)據(jù)增強處理,減少了處理電子病歷文本時的性能損失,精確率、召回率和總F1值遠高于模型1、模型2 和模型3。與模型4 相比,除精確率由于數(shù)據(jù)增強的影響下降0.85%外,召回率和總F1值分別比模型4提高了2.13%和0.89%,達到54.03%和57.92%。同時,模型5對原始CasEE 模型的事件分類器進行了改造,將事件分類任務與發(fā)生狀態(tài)提取任務合二為一,從而補全了模型4缺少的發(fā)生狀態(tài)提取功能,總體效果最好。
對比表5中各模型提取醫(yī)療事件發(fā)生狀態(tài)的效果可知,由于醫(yī)療事件發(fā)生狀態(tài)僅有3 種類型,使用分類任務對其進行提取效果較好。模型1、模型2 和模型5 均使用分類任務提取發(fā)生狀態(tài),F(xiàn)1值分別為95.73%、96.30%和94.17%,模型3使用端到端方式提取發(fā)生狀態(tài),易受文本數(shù)據(jù)噪聲的干擾,故F1值相對較低,為64.40%。
3.4.3 不同編碼層對模型性能的影響
為驗證不同編碼層對模型的影響,本文在未經(jīng)數(shù)據(jù)增強的情況下將模型的編碼層替換為其他幾種預訓練語言模型進行對比,分別為BERT 基準模型[20]、中文醫(yī)療預訓練模型PCL-MedBERT 和PCLMedBERT-wwm[21],實驗結果見表6。在將模型的編碼層由MC-BERT 改為BERT-base 后,模型的事件抽取性能下降明顯。因為BERT-base模型是在一般領域的中文語料庫進行預訓練的,在處理中文電子病歷文本時很難處理眾多的專業(yè)詞匯短語。將編碼層改為PCL-MedBERT 模型性能有所提升,說明通過預訓練過程中注入醫(yī)療詞匯,可以更好地對醫(yī)療類實體進行編碼。MC-BERT 在此基礎上通過全跨度遮蔽顯式注入了醫(yī)療類短語,作為編碼層模型性能最好。實驗結果表明,使用MC-BERT 作為模型編碼層有效提升了醫(yī)療事件抽取效果。
表6 不同編碼層對比實驗結果Table 6 Experimental results of coding layers compared 單位:%
3.4.4 數(shù)據(jù)增強對模型性能的影響
為驗證數(shù)據(jù)增強對模型性能的影響,將本文模型在CHIP-CDEE 原數(shù)據(jù)集和經(jīng)增強后的數(shù)據(jù)集上分別進行訓練,實驗結果見表7。經(jīng)過數(shù)據(jù)增強后,模型精確率下降1.77%,說明在事件抽取任務中引入數(shù)據(jù)增強會產(chǎn)生數(shù)據(jù)噪音,降低模型精確率。但模型召回率大幅提升2.08%,使總F1值提升0.49%。實驗結果表明,本文引入數(shù)據(jù)增強改善病歷數(shù)據(jù)量偏少的方案是有效的。
表7 數(shù)據(jù)增強對模型性能影響實驗結果Table 7 Experimental results of effect of enhanced data on model function 單位:%
綜上所述,本文提出的事件抽取模型優(yōu)于其他模型,并補全了發(fā)生狀態(tài)提取功能。事件分類和觸發(fā)詞提取階段F1值較高,召回率也相對較高,引入的MC-BERT 編碼層能有效提升醫(yī)療事件抽取效果。不過模型中論元提取器的召回率和F1值相對其他模塊低20%左右,影響了整體任務的效果。不過對比其他方法,該模型在事件抽取各階段實驗效果仍然更好,最終實驗結果表明,本文提出的模型比傳統(tǒng)醫(yī)療事件抽取模型更具優(yōu)勢。
本文提出了一種中文電子病歷的醫(yī)療事件聯(lián)合抽取模型,該模型通過在編碼層注入醫(yī)療詞匯,并使用類別信息輔助提取事件觸發(fā)詞,解決了中文電子病歷中醫(yī)療術語難以準確識別和醫(yī)療事件發(fā)生狀態(tài)難以提取的問題。同時,對數(shù)據(jù)集進行了數(shù)據(jù)增強處理,解決了電子病歷數(shù)據(jù)量偏少的問題。本文提出的模型在醫(yī)療事件抽取任務中的F1值為57.92%,達到了較高水平。后續(xù)的研究將以取得的結構化病歷數(shù)據(jù)為基礎,探究中文電子病歷中的數(shù)據(jù)挖掘和知識發(fā)現(xiàn)。