付子玉:丁香園醫療領域圖譜的構建與應用
- 業務場景介紹
- 醫療圖譜構建
- ACL|SMedBERT
- 工業落地和思考
一、丁香園業務場景概述
丁香園起點是打造一個專業的醫學學術論壇,為醫生、醫學生、醫療從業者等提供一個信息交流的平臺。丁香園的主要用戶是醫療從業人員,會在論壇上發布考博、規培分數線、求助醫療文獻等內容。隨著業務的不斷擴展,發展出了丁香醫生、丁香媽媽等APP,為大眾用戶提供了一個健康信息平臺。
目前丁香園從早期的醫生用戶擴展到了大眾用戶,實現了ToD(To Dcotor),ToC雙核心驅動,業務會覆蓋這兩類人群的日常需求。比如,對醫生為主的醫療從業者來說,會涉及到日常的學術問題、經驗分享、疑難病例的討論以及查閱****品說明書、診療指南等。對大眾用戶來說,包括線上問診、科普知識、健康商城等服務。在2021年,丁香園C端規模達到1.2億,醫生端擁有全國70%的醫生作為注冊用戶。
二、醫療圖譜構建
首先介紹一下丁香園應用到的醫療健康圖譜。醫療健康圖譜構建由專業的醫療團隊來維護,有醫學背景相關同事維護疾病、癥狀、手術、****品等醫學概念以及60多種醫學關系。同時,丁香園nlp組會用一些算法去抽取和意圖分類等工作,利用算法與人工相結合的方式對實體、關系、實體屬性進行擴充。因為丁香園業務模式較多,需要考慮在圖譜應用上如何做遷移、融合工作。
為更好地去分析用戶意圖,構建用戶畫像,在實際工作中我們使用一種Taxonomy概念圖譜。例如,搜索十二指腸潰瘍,丁香醫生會給出一個搜索結果:“十二指腸潰瘍怎么去治療”,它是消化內科的一個疾病,可以將其定義為一個消化內科的概念。在丁香園搜索規培考試,給對應的規培考試內容標注相關的標簽,比如成績查詢、內科的標簽考試答案等。
概念圖譜會以一個四層結構構建:
第一層底層是entity實體層,例如規培考試、十二指腸潰瘍、腹痛等。
往上一層是instance層,也就是文章內容。例如十二指腸潰瘍怎么治療。
concept層是概念層,可以根據文章的用戶點擊行為、搜索行為、內容聚類,抽象到上層的concept概念結構,比如十二指腸潰瘍對應的是消化內科的一種疾病。
最上面一層,建立與業務強相關的topic層。
利用層級關系對長短文本進行多層次、豐富主題的刻畫,去分析、理解用戶的搜索行為。
之前提到了兩種知識圖譜的構建,接下來介紹如何使用算法去優化命名實體識別、關系抽取等。舉一個命名實體識別的例子,如“癥狀性動脈粥樣硬化性椎動脈起始部狹窄的治療”,常規NER可能會把這個識別成三個實體:
- 疾病:“癥狀性動脈粥硬化”
- 身體部位:“椎動脈”
- 癥狀:“狹窄”
但這整個長句是屬于一個完整的疾病。早期抽取的方式會充分地理解句中顯式的詞和詞序信息。近幾年采用一些格子結構做LSTM,把詞的表征和潛在的詞信息整合到字符CRF中去。如2018年Lattice提到把每個字作為詞根或者詞尾加入到模型訓練中。到2019年Lattice LSTM把類似的短語用Lexicon的方式把字和詞構建一個graph,再把graph特征融合到NER。但這種方式的復雜度非常高,而且耗時長。在2020年復旦大學提到FLAT的方式,引入了Transformer結構,利用Transformer的self-attention解決長文本依賴問題。FLAT可以充分利用Transformer格子結構,具備出色的并行化的能力,效率上得到了很大的提升。
圖譜構建中肯定涉及關系抽取工作,早期關系抽取采用pipeline的方式進行,先做實體識別再做關系分類。但是,pipeline的方式可能會造成實體識別錯誤,間接會導致關系抽取也出現問題。借鑒了《A Novel Cascade Binary Tagging Framework for Relational Triple Extraction》文章聯合學習的方式,實現二分標注的框架。該框架對object、relation、subject 做函數映射,而不像以前的方式去做離散的標簽。它分為兩個模塊subject Tagger和 relation-specific object Taggers:subject Tagger先使用一個二分類去識別出subject的起始位置和結束位置,拿到subject去做表示特征,然后根據關系做一個多分類任務。每一個關系,都是一個二分類識別。根據映射得到object起始位置和結束位置,這樣以一種聯合的方式拿到實體關系三元組。
構建概念圖譜首先要解決兩個問題,第一個問題是如何抽取concept,第二個問題是如何構建concept之間的層級關系,這里借鑒了兩篇論文,分別是騰訊的《A User-Centered Concept Mining System for Query and Document Understanding at Tencent》和阿里的《AliCG: Fine-grained and Evolvable Conceptual Graph Construction for Semantic Search at Alibaba》。
在實體抽取方面,主要分為頭部和尾部兩部分。頭部的instance,由于頭部的文章內容豐富,可以用模板去識別。長尾部一直都是比較難的問題,可以通過Phrase Mining,或者數據標注的方式解決。如何構建概念間的層次關系?可以通過用戶的搜索點擊行為去計算文章和概念的關聯程度,根據關聯程度判斷概念之間的層級。
利用concept層次聯合底層的專業醫學實體和上層的業務,構建一個完整的業務圖譜。以貝葉斯模型為基礎去判斷一對一的邊關系,考慮全局的統計量或者文本的局部特征,生成一些多邊的關系。我們借鑒了王仲遠老師的一些相關工作,如MDL的原則等去做concept篩選。例如,論壇帖子、****物、商品信息等可以通過中間的concept層與實體之間進行關聯。
三、SMedBERT
接下來介紹去年丁香園NLP組聯合華師大何曉豐老師團隊在ACL發表的文章《A Knowledge-Enhanced Pre-trained Language Model with Structured Semantics for Medical Text Mining》。這篇文章在醫療垂直領域下首次將知識圖譜的醫學實體和實體的結構化語義信息引入到預訓練模型中。
SMedBERT優化方向主要有兩個,第一個考慮實體類別和關系來豐富語義,第二個是構建knowledge bridge,將有一跳連接關系的鄰居實體加入預訓練模型中。
SMedBERT對于結構信息捕捉,有兩個創新點:
首先是Mention-neighbor Hybrid Attention用來學習捕捉異構實體信息。什么是異構實體信息?圖譜中有一個新冠病毒節點,與它相關的節點有疾病癥狀、治療方案、檢測方法等。將與新冠病毒節點一跳的相關實體取出,根據type和節點node信息融合到encoder層。
第二個創新點是Mention-neighbor Context Modeling,主要是將鏈接實體的上下文信息做mask處理去預測。模型主要由三個模塊組成T-Encoder、K-Encoder、Pre-training Tasks。首先T-Encoder可以挑選出比較重要的相鄰實體,使用方法是類似于PageRank的一種方式。其次K-Encoder進行mask操作,self attention獲得關鍵實體的信息,對mask任務進行融合。
在訓練數據方面,我們收集了約5G大小的中文醫療文本、30億左右的token。在實驗對比上,選擇了openkg、丁香園的KG、丁香園的RE;在Graph Embedding上選用Trans-R;在驗證數據上選擇了四組公開數據集如CHIP、WebMedQA等進行比較;在模型方面選擇了Bert、RoBert、Knowledge-Bert等進行比較。從對比效果上來看準確率有很高的提升,并且在多個任務上都有明顯提升效果,然后對不同模型進行實體Embedding相似性能力比較。
D1、D2、D3,主要對不同程度的鄰實體覆蓋進行劃分。如D2使用了高頻重合的實體,D3是低頻實體去做比較。實驗表明SMedBert對具有結構信息的捕捉能力較強。最終我們得到一個結論,將相鄰相似實體、相關實體的信息引入到語義信息中,在下游任務上可以得到很明顯的提升,其中留下了我們的一些思考:我們現在選擇的鄰居實體都是在一跳或者是兩跳以內的,如果有"farther neighboring"遠端的實體關系該如何應用?未來可以考慮如何更好地從長尾低頻的醫學實體學習語義信息。
四、工業落地與思考
接下來介紹目前丁香園在業務場景的一些應用。
先介紹我們在優化搜索上的底層架構。我們嘗試把用戶使用搜索的語義理解任務拆分成為五個步驟,每個步驟解決實體識別準確性的問題,包括文本糾錯、名詞短語抽取、命名實體識別、實體鏈接、語義理解。我們會通過結構化好的圖譜對語義理解做優化,例如進行意圖識別時,可以把graph embedding的特征拿過來,也可以通過推理的方式獲得相關實體,還可以進行Query聯想,聯想相關的實體詞,例如用戶提到了某個品牌的商品,它的主要功能是什么,有什么類似的商品。
我們利用concept結構圖譜對文本結構化上做了一些提升。文本結構化對于提升搜索效果起到了非常重要的作用,有了concept之后可以幫助我們從抽象的層面完成對文本打標簽的工作,那業界中比較好的方案就是先用TransE之類的知識表示模型,把知識圖譜train出Embedding,然后將這些embedding融合進LDA的模型里面,在模型中,會用vMF分布代替原來的高斯分布去處理實體詞的部分。如此以來,我們就會對一篇如“麻醉不良習慣”的帖子中的討論帖子抽出如“麻醉醫學”和“麻醉的不良習慣”這樣的關鍵詞。
目前Query擴展的問題主要有兩類方法:
第一種,利用query詞和document詞的相關性去構建一個貝葉斯模型,擴展的結果是document詞或document中出現的一些詞組,幫助在召回階段擴大潛在用戶想要的那些文本。
第二種,把它作為一種翻譯模型,思路是從query詞翻譯到document詞。早期比較樸素的方案是用一個EM算法去找兩類詞的對齊關系。現在新的方案都是上神經網絡去train一個生成模型來做這個工作。
有了concept層之后,用一些很簡單的策略就能有不錯的效果,比如我們會直接使用相關性的方式,也就是第一類方法去建模,就可以把原始query向concept層上擴展。比如,“哈薩克斯坦”可以擴展出“新冠疫情”或“不明肺炎”;同樣,在電商場景下,我們可以利用擴展的concept和其他的實體關系做二級擴展,比如“產褥墊”可以擴展出“待產包”,然后再從待產包擴展出“衛生巾”“紙尿褲”。這樣的應用也帶了一點推薦的意思。
接下來介紹語義匹配,早期語義匹配使用雙塔模型Bi-Encoder實現。Bi-Encoder優勢是可以將候選集向量進行離線計算,線上預測只計算Context Encoder。但其中有個問題——把所有的實體信息放到一個固定的向量中去,可能會導致細粒度的語義缺失,無法精準地做匹配。于是,出現了Cross Encoder,它類似Bert預訓練的方式,把兩個句子進行一個拼接,放入Encoder中去,再去打分。這種方式可以達到很好的語義學習效果,但沒辦法實時,復雜度比較高,并且比較慢。
前幾年出現Poly Encoder,將Context Encoder多個向量進行self-attention后融合,這種方式比Bi-Encoder更好地保留豐富的語義信息,又將candidate embedding做好離線計算,再用向量索引方式去做召回和打分。
我們在Poly Encoder之上做了一些改進,例如把SMedBERT引入到表示層,并且引入對比學習的優化,比較經典的是ConSERT和SimCSE,例如美團去年提到的一個對比學習的方法,實際應用中在計算句子相似度的時候會有很高的打分。這樣雖然可以獲得想要的內容,但在召回時不好控制召回的數量,誤差也比較大。加入對比學習后會發現可以更好地解決BERT坍縮問題。
未來挑戰主要有三個方面:
首先,訓練數據成本高,因為醫學領域數據資源比較少,如何降低人工成本形成一個良性的數據閉環是我們首先要做的。
第二,隨著業務的不斷擴展,當出現一個新的業務時數據量會比較少,怎么提升已有圖譜的復用性,歷史相關內容怎么去利用,怎么去做高質量的圖譜融合。
最后,對于長尾低頻的用戶行為,如何更好地理解識別用戶意圖是未來的一個挑戰。
五、Q&A
Q1:SMedBert是否有公開?A1:在GitHub上已經公開。
Q2:Token Embedding后如何與知識圖譜進行融合?A2:通過Trans方式將知識圖譜獲得Graph Embedding表示向量與token Embedding進行拼接。之前提到的Poly Encoder可以把context encoder做整合進行self-attention獲得更多語義信息,再進行下游任務。在過程中不僅做匹配單任務也對多任務進行優化。之前提到的instance做concept聚類,也可以表示學習上的多任務。
Q3:丁香數據來源有哪些?A3:醫學書籍、****品說明書、科普文章等。
今天的分享就到這里,謝謝大家。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。