杜曾貞,唐東昕,解丹*
(1.湖北中醫藥大學信息工程學院,武漢 430065;2.貴州中醫藥大學第一附屬醫院,貴陽 550001)
問診是醫生診斷中極為重要的一環,但在疫情期間,面對面的醫患溝通容易帶來醫患交叉感染的風險,而智能問診的興起正是為了解決這一問題。在智能問診過程中可通過模擬醫生機器人與患者進行簡單對話,以此減少醫務人員與感染者的接觸,為診療過程增添一道安全屏障,同時節約大量的醫療資源。在智能問診的過程中,醫生通常無法根據患者所說的一句話確定其患病信息,可能需要主動反問來明確患者的意圖。醫生通過評估患者闡述的可信度,決定是回答患者的問題還是向患者提出反問以弄清他們的需求。選擇合適的反問對于提升醫患對話效率尤為重要,既可以減少醫生的診斷時間,又可提高患者的就診效率。表1 顯示了一個常見的醫患問診對話實例,可以看到在第2 輪和第3 輪的對話中,醫生并未對患者的咨詢作出回答,而是提出了一個反問。本文旨在研究面對患者的提問時,醫生如何提出反問,包括確定是否需要提出問題,以及提出怎樣的反問。

表1 醫患問診對話實例Tab.1 Question-answer example between a doctor and a patient
本文以“春雨醫生”(https://www.chunyuyisheng.com)中的問答對話作為數據源,抓取了10 萬余個醫患問答,提出了一個面向智能問診的基于深度神經網絡的方法來解決醫生反問生成問題,一共包括回答分類、問題觸發、反問生成和評估4 個環節。在進入主流程前首先要建立數據集,分為數據獲取和數據預處理兩個步驟。回答分類是對醫生在對話中作出的陳述進行分類,同時可以構造進行問題觸發和反問生成所需要的數據集。良好的對話是有前瞻性的,在問題觸發部分,使用不同的對話選取方式來判斷醫生是否需要提出問題,提出的問題應充分考慮了醫患之間的對話。反問生成是在醫生需要提問時選擇合適方法提出一個問題,本文不考慮醫生需要回答的情況。評估則是對生成的反問結果進行綜合評價,具體流程如圖1 所示,其中,文本循環神經網絡(Text Recurrent Neural Networks,TextRNN)表示基于長短期記憶(Long Short-Term Memory,LSTM)網絡的分類模型,雙向文本循環神經網絡(Text Recurrent Neural Network-BLSTM,TextRNN-B)表示基于雙向長短期記憶(Bi-directional Long Short-Term Memory,BLSTM)網絡的分類模型。

圖1 反問生成流程Fig.1 Flowchart of rhetorical question generation
2020 年伊始,新型冠狀病毒肺炎在全國范圍內爆發,各地的疾控機構紛紛開啟線上醫療咨詢服務[1],為此暴露出了一些問題:醫生全天超負荷工作仍無法滿足問診的需求量;患者的表述不清,造成了醫生接診效率低下等問題,所以,建立一個高效的智能問診平臺成為了疫情期間的剛需。
醫患問答在診療過程中是不可或缺的環節,醫生通過問答了解患者的病情并進行診斷。智能問答用計算機來模擬人,讓機器通過對人類語言的分析,自動回復用戶所詢問的問題[2]。當前在互聯網大環境下已經出現了越來越多的智能問答應用,比如以互聯網語料和用戶的聊天日志數據為基礎的微軟“小冰、小娜、Rinna、Ruuh”等,蘋果手機里的Siri 以及用戶搜索日志為基礎的百度語音助手等[3]。相比之下,醫學領域智能問答研究起步較晚,由于醫生具有很強的專業知識,用計算機來模擬醫生,在實現上具有一定困難,目前仍處于探索發展階段。國外醫學領域的問答系統有基于傳統檢索技術的問答系統MedQA(Medical Question Answering)[4]、AskHERMES[5],以及基于語義技術的問答系統MEANS[6]、AskCuebee[7]等。隨著醫學問答領域的發展,研究人員也逐漸開始對中文問答系統進行研究,例如Yin 等[8]通過提取互聯網上的數據為有健康需求的人開發了問答系統;田迎等[9]發明了基于知識圖譜的自動問答系統,可以有效回答抑郁癥相關問題。疫情爆發后,喬宇等[10]研發了智能問答機器人系統,應用于疫情期間的公眾咨詢;湯人杰等[11]研究了基于醫療知識圖譜的智能輔助問診,可以在疫情期間做到無接觸問詢,實時響應。另外,國內還出現了一些比較有名的醫學信息服務類網站,如尋醫問藥網、快速問醫生等,但中文醫學問答系統研究仍然占比較少。本文主要研究中文語言環境下醫學領域的智能問答。
反問生成過程中醫生向患者提問的過程與神經機器翻譯中的翻譯過程原理相似。神經機器翻譯的研究已經得到了自然語言處理(Natural Language Processing,NLP)界的廣泛關注,它通過構建復雜的神經網絡,運用大量的語料訓練,使得該網絡能夠實現上下文的精確翻譯[12]。目前,較為著名的神經機器翻譯項目有:谷歌公司開源的基于TensorFlow的神經翻譯網 絡(Google’s Neural Machine Translation,GNMT)[13]、Facebook AI 研究院開源的基于卷積神經網絡的神經機器翻譯模型Fairseq[14]以及由Yoon Kim 和哈佛大學自然語言處理研究組開發的開源神經機器翻譯(Open-Source Neural Machine Translation,OpenNMT)框架[15]。由周海林等[16]對谷歌神經機器翻譯質量現狀的分析發現,GMNT 系統在翻譯時出現的問題較多,比如只翻譯出了字面含義而沒有結合整個句子的含義、句子理解錯誤而導致翻譯出錯以及出現漏譯原文的情況;而Fairseq 實現的模型已被包含在OpenNMT 提供的預置模型里[14]。另外,牛向華等[17]使用蒙漢平行數據在開源系統OpenNMT 上訓練的效果較好。因此本文將利用OpenNMT 模型進行反問生成。
回答分類是為了解決分類問題,可以采用常見的分類算法TextRNN 和TextCNN 等。對于TextRNN,在對每個單詞進行矢量化后,單詞向量進入LSTM 層,這里使用標準LSTM。每個LSTM 單元的隱藏層輸出作為輸入傳遞到平均池層。平均池運算可以用來平均LSTM 單元輸出的隱藏層狀態,從而獲得統一的語句特征表示。通過Softmax 分類層得到類別分布概率向量,并以概率值最高的類別作為最終的預測結果[18]。另外,標準LSTM 也可以替換為BLSTM,其基本思想是將每個序列向前和向后呈現為兩個單獨的隱藏狀態,以分別獲得過去和未來的信息[19],如圖2 所示。

圖2 TextRNN-B基本流程Fig.2 Basic flowchart of TextRNN-B
對于TextCNN,在卷積層,使用不同大小的卷積核,卷積得到的feature maps 會具有不同的向量維度,因此在池化層中,可以使用1-max-pooling 方法通過提取每個feature map 中的最大值來表征該特征向量。將每個特征向量經過1-maxpooling 池化得到的值拼接起來,即為池化層最終的輸出向量。在進入全連接層(Fully Connected layer,FC)之前,需要進行Dropout 操作來避免過擬合。全連接層設置可以參照傳統卷積神經網絡,第1 層采用ReLU(Rectified Linear Units)作為激活函數,第2 層則使用Softmax 分類函數來進行分類[20]。
盡管TextRNN 和TextCNN 已經取得了很新的研究成果,但多義性等問題也帶來了很多限制[21]。雙向變形編碼器(Bidirectional Encoder Representation from Transformers,BERT)是最近提出的一種語言預訓練模型[22],是近年來最成功的文本分類深層神經網絡模型之一。該模型使用雙向Transformer 模型結構對大型的未標記語料庫進行預訓練,然后通過對下游任務進行微調的方式在一些NLP 任務(例如分詞、命名實體識別、情感分析和問題解答)上展現模型優異性能[23]。包括兩個階段:首先,BERT 對大量文本進行預訓練,無監督的目標是進行語言建模和下一句預測;接下來,預先訓練好的網絡會在特定任務的標記數據上進行微調[24]。
在使用BERT 進行文本分類的過程中,BERT 模型首先會對輸入進行編碼,轉為模型需要的編碼格式,使用輔助標記符[CLS]和[SEP]來表示句子的開始和分隔,然后根據輸入得到對應的詞向量。得到整體的詞向量后,應用單句分類模型進行學習,如圖3 所示,最終根據Softmax 分類器得到結果。

圖3 使用BERT處理的單句分類模型Fig.3 Single sentence classification model with BERT
開源神經機器翻譯是一種用于機器翻譯的方法,為了提高效率、可讀性和通用性,它已經被完全重寫。該技術已經成為自然語言處理領域的一種有效方法,運用在對話、句法分析、摘要等領域。OpenNMT 中的序列到序列(Sequence to Sequence,Seq2Seq)模型適用于端到端開放域的對話生成[25]。例如,Qiu 等[26]在Seq2Seq 基本體系結構的基礎上,進行各種擴展,以解決安全響應問題;Serban 等[27]為多回合的對話建立模型,可以用于任何具有層次結構的序列生成任務;Li 等[28]建立強化學習模型以產生與人類產生的對話無法區分的響應序列,生成開放域對話。因此,使用基于Seq2Seq的OpenNMT 模型進行反問生成。
OpenNMT 使用Seq2Seq 呈現一個單詞序列到另一個單詞序列的神經機器轉換。通過對概率進行建模來獲取翻譯的條件語言建模視圖,給定源句子x1:S的目標句子w1:T的概率為,其中分布用θ參數化。使用基于注意力的編碼?解碼器架構來估計這種分布[15]。源編碼器循環神經網絡(Recurrent Neural Network,RNN)將每個源字映射到一個字向量,并將其處理成一系列隱藏向量h1,h2,…,hS。目標解碼器將 之前生成的單 詞(w1,w2,…,wt-1)的RNN 隱藏表示與源隱藏向量相結合,以預測每個可能的下一個單詞的分數。然后使用Softmax 層來產生下一個字分布p(wt|w1:t-1,x;θ)。源隱藏向量通過一個池化層來影響分布,該層根據每個源詞對目標預測進行加權。為了使訓練語料的負對數似然最小化[29],對整個模型進行了端到端的訓練,展開的網絡如圖4 所示。

圖4 神經機器翻譯原理Fig.4 Principle of neural machine translation
3.1.1 數據獲取
原始的醫患問答對話文本來自醫患交流平臺——“春雨醫生”上的問答論壇。論壇分為14 個一級科室,每個一級科室下分有若干個二級科室,并帶有疾病分類。為了盡可能多地理解不同疾病情境下的語義環境,本文抓取了一級和二級科室對應的經典問答對話,共計100 210 個對話,將數據集命名為D-P QA。每個問答對都包括醫生與患者之間的一輪或幾輪對話。圖5 展示了某個醫患對話的部分內容。

圖5 問答論壇中的醫患對話實例Fig.5 QA example between a doctor and a patient on QA forum
3.1.2 數據預處理
傳統的中文文本處理通常需要刪除停用詞來減少文本冗余,但本文并沒有刪除停用詞,原因在于問題表達的特殊性。停用詞是問題中非常重要的部分,若刪除“呢”和“嗎”這類停用詞,將對問題分類造成影響。對于D-P QA 進行處理時,刪除了少于一輪的問答和被認為無效的對話,例如某些對話沒有談及與病情相關的內容。在刪除冗余空間和重復數據后最終剩余91 047 個對話。
3.2.1 機器評估
回答分類和問題觸發主要解決分類問題。使用準確率Accuracy 來評估TextCNN 和TextRNN 模型,在分類實驗中應該盡量實現更高的準確率,減小錯誤迭代的可能性。為了在長句中獲得更好的分類效果,在問題觸發環節將TextRNN 模型中的標準LSTM 替換為BLSTM 單元,其模型稱為BLSTMQuD,用F1-micro、F1-macro 和Accuracy 這3 個指標來評估其有效性。基于BERT 的分類模型稱為BERT-QuD,用兩個指標來評估其有效性:F1 和Accuracy。在問題生成實驗中使用雙語評估替補(Bilingual Evaluation Understudy,BLEU)[30]和困惑度(Perplexity,PPL)[31]兩個評測指標。BLEU 具有語言獨立性、易計算性,可以表明一個句子的詞匯、短語順序的準確性;PPL 的值與句子長度無關,可以用來評估任何長度的句子的合理性[32]。
3.2.2 人工評價
在自然語言生成中,由于沒有統一的評估模型,因此在問題生成實驗中除了進行機器自動評估,還需與人工評價相結合。
隨機選取每種方式產生的500 個問題,連同上下文分配給多位評委。按照0~3 分的打分標準:0 分表示得到的句子不是反問句;1 分表示生成的句子是一個反問句,但不符合上下文語境;2 分是指生成的句子是一個反問句且能很好地表達語義關系;3 分是指生成的句子是一個具有語境關聯性的問題,并且表達非常準確。最后計算出平均分,得分越高表示生成的問句質量越好。
在問題分類中,使用Python 開源的Gensim 工具,選擇Skip-gram 算法來訓練100 維Word2vec 模型,最終得到9 086個漢字(包括漢字、數字、標點符號等)的詞向量表示,并將其應用到TextRNN 和TextCNN 模型中,優化算法為Adam,隱藏層大小為100。
在BLSTM-QuD 模型中,直接使用已有的詞向量代替獨立訓練所需要的詞向量,使用的中文詞向量已經通過各種不同的表示(密集和稀疏)、上下文特征(單詞、N-Gram、字符等)和Wikipedia zh 的語料庫進行了訓練,是一個300 維的352 217 個漢字的詞向量表示。在BERT-QuD 模型中,采用Google 提供的BERT-Base 預訓練模型。BERT-Base 模型一共12 層,有768 個隱單元,12 個Attention head,110 MB 個參數。在本文的醫患問答中,使用6 種不同的選取方式來模擬問題觸發的情景。第一種方式稱為Window-top,是選取醫生所說的每個問題前的所有問答作出判斷;第二種方式稱為Window-last-q,是選取醫生所說的每兩個問題(包括后一個問題)之間的所有問答內容作出判斷;另外四種方式是分別選取每個問題前的1 個、3 個、5 個和10 個問答內容作出判斷,稱為Window-1、Window-3、Window-5、Window-10,選取到的所有問答內容均不包括當前的問題。最后在醫生提出問題的地方標記“Y”標簽,在醫生作出回答的地方標記“N”標簽。采用這六種選取方式后,分別得到28 萬、28 萬、30 萬、28萬、24 萬和24 萬個數據,其中2 萬個數據作為測試集,1 萬個數據作為驗證集,剩余數量的數據集作為訓練集。
在問題生成模型的OpenNMT 框架中,網絡參數如下:編碼?解碼器為Transformer,編碼器類型為雙向循環神經網絡(Bi-directional Recurrent Neural Network,BRNN),RNN 類型為門循環單元(Gate Recurrent Unit,GRU),字向量大小為200,編碼?解碼器層數為2,RNN 大小為200,批大小為8。
由于原始數據集中沒有分類標簽,因此第一步工作是在數據集中創建分類標簽。通常,在醫患問答中,患者是提出問題的人,而醫生作出陳述。本文關注的是醫生的陳述,因此不對患者所說的話進行分類。醫生在對話中的任何陳述可被視為一個分類問題,被分為兩類,一類是問句(即反問),一類是回答。然而,在問答中,并不是所有的問句都以問號結尾,所以有必要先對醫生的回答進行分類。一旦在對話中找到問題的標簽,就會檢測出問題在對話中的位置(稱為問題觸發),并使用OpenNMT 模型生成反問。
3.4.1 回答分類
對于數據集數量的選取,分別選用1 000、2 000、5 000、10 000、20 000、30 000 這幾種不同的數值進行測試,選擇所得準確率最高的數值作為數據集數量。實驗如下:在數據集中隨機選取相應數值的醫生所說的句子,人工標注句子的類型。例如,在表1 中,“孩子是兩個眼睛視力不好還是一只呢?”是一個問題,將其歸類為“Q”;“弱視是指視力要比健康眼差。”是一個回答,將其歸類為“A”。然后使用TextCNN 和TextRNN 方法對醫生所說的話進行分類,準確率見表2。

表2 不同數據集選取的準確率測試結果 單位:%Tab.2 Accuracy test results of different selected datasets unit:%
由表2 的數據可以看出,當選取10 000 個句子進行實驗時,準確率最高,因此選取10 000 個醫生所說的話,使用TextCNN 和TextRNN 方法對其進行分類,準確率分別為89.20%和96.00%。使用TextCNN 進行分類的失敗實例中,“說你身上有單純皰疹病毒?”(例①)與“是不是尖銳濕疣?你要發照片過來看。”(例②)這兩句話本應被分為“Q”類,但TextCNN 將它們分為“A”類。在進行分類時,如果包含兩個句子(例②),其中只有一個是問題,那么整個句子也應被分為“Q”類。或許在停用詞不明顯(例①)或者在問題之后有一個非問題的情況下(例②),TextCNN 無法準確分類,而同樣的問題在使用TextRNN 方法時沒有出現。因此,選用TextRNN 方法對整個數據集中醫生所說的句子進行分類。最后得到一個帶標簽的數據集,其中,每個對話至少有兩輪,平均每個對話有十輪,每個對話至少有一個反問。
3.4.2 問題觸發
在回答分類后需要確定在何種情況下醫生會提出反問。分別使用Window-top、Window-last-q、Window-1、Window-3、Window-5 和Window-10 這六種選取方式,基于BLSTM-QuD和BERT-QuD 兩種分類模型進行實驗,結果見表3。從表3實驗結果來看,使用BERT-QuD 模型總體比使用BLSTM-QuD模型的準確率高。實驗結果表明,與傳統的詞向量相比,BERT 預訓練模型能更好地表達詞的語義信息。其次,基于BERT-QuD 模型且使用Window-last-q 方式的準確率更高。這表明,醫患問答中醫生根據其所說的每兩個問題之間的所有問答內容更容易提出問題。

表3 基于六種選取方式的問題觸發檢測結果對比Tab.3 Comparison of question trigger detection results based on six selection methods
3.4.3 反問生成
根據之前的內容,已經確定了醫生將在何種情況下提出反問,現將預測醫生提出的問題的內容。分別使用六種選取方式(選取的問答內容都包含了當前的問題),將前一輪或幾輪問答和最后一個反問作為問答對運用到OpenNMT 模型中進行訓練,用BLEU-1、BLEU-2、BLEU-4 和PPL 這幾個自動評價指標來評估。另外,對于對話生成,預測概率最高的問題并不是最終目標,能夠產生上下文相關、達到語義相關性才應該是對話生成的真正目的,因此,選用兩位評委對生成的反問進行人工評價,并計算兩位評委打分的平均得分,如表4 所示。

表4 基于六種選取方式的反問生成結果對比Tab.4 Comparison of rhetorical question generation results based on six selection methods
從表4 可以看出,使用Window-top 方式所得到的PPL 最小,BLEU-1、BLEU-2、BLEU-4 均為最高。在人工評價結果中,雖然使用Window-last-q 方式得到3 分的比例最高,但是使用Window-top 方式所得的平均得分最高。另外,發現Window-1 方式優于Window-3,Window-3 方式優于Window-5,Window-5 方式優于Window-10,表明上文越短(“長短”指對話次數的多少)結果越好;但使用Window-top 方式比Window-last-q 方式要好,這是因為當上文較短時,模型能夠更好地抓住上文的中心語義,從而產生更合適的問題。但若上文過長,如采用Window-top 方式,則可以結合多方面的語義來考慮生成問題,從而使生成的反問更貼合現實。
由于Window-last-q 是最合適的問題觸發方式,現使用Window-last-q 和Window-top 方式在同一個對話中進行具體實例的比較。兩個實例如表5 所示,從表5 可以看出,由于上文的長度(對話次數)不同,使用Window-top 和Window-last-q兩種方式預測的問題的語義也有所不同。在實例1 中,使用Window-top 生成的問題更接近實際情況,但在實例2 中,使用Window-last-q 方法生成的問題更接近實際情況。

表5 反問生成的兩個實例Tab.5 Two examples of rhetorical question generation between a doctor and a patient
根據以上分析,可以提出假設:如果是短上文,最好使用Window-top 方式生成問題;如果是一個包含五個或更多句子的長上文,則最好使用Window-last-q 方式生成問題。對于長上文,Window-last-q 方式效果更好,因為它可以忽略與當前問題無關的遠處的噪聲,例如醫生在這種醫患問答環境中已經建立的診斷。在實例2 中,由于最近的一句話證實了“弱視”的診斷,推斷它已經持續了一段時間,所以沒必要使用Window-top方式生成問題。這是受醫生描述癥狀第一句話的噪聲影響,因為癥狀通常會被詢問其持續時間。這表明醫患問答中的醫生可以根據對話的長度來決定如何提出問題。
根據以上假設,隨機選取1 000 個對話。一半的對話是短上文,少于5 個句子;另一半是長上文,多于5 個句子。使用Window-top 和Window-last-q 方式分別生成問題。然后進行人工評價,如果Window-top 方式比Window-last-q 方式更適合于預測問題,則得1 分,否則得0 分。結果如表6 所示,表明了短上文和長上文的得分占比。這初步證實了之前的假設,即Window-top 方式適用于短上文語境下的問題生成,而Window-last-q 方式適用于長上文語境下的問題生成。但也有些反例,這些反例存在的原因有待進一步研究。

表6 短上文與長上文的得分占比 單位:%Tab.6 Score proportion of short context and long context unit:%
本文提出了一個適用于智能問診的反問生成方法,該方法利用深度神經網絡技術解決了醫生如何通過合理的反問來提高醫患對話效率的問題。在研究過程中,收集了一個醫學咨詢領域的大型中文對話數據集,使用BERT 來檢測問題觸發,并使用OpenNMT 模型生成問題。還設計了六種問答選取方式來模擬對話語境,研究表明本方法有效可行,并且不同的問答選取方式對于反問生成質量有較大影響。例如,當考慮醫生所說的每兩個問題之間的所有問答內容時,適合觸發問題,考慮醫生所說的每個問題前的所有問答內容時則更適合生成反問。這是因為在觸發問題時會考慮對話內容的語義信息,在生成問題時會考慮已有對話內容的長度。由于在醫患問答中病人信息的描述通常集中在第一句話,若不考慮初始描述去生成問題將會導致信息缺失的問題。值得一提的是,考慮對話上文的長度去選取合適的方式生成反問,更容易生成質量好的問題。另外,在問題生成的結果中仍然存在泛化問題,比如在同一個對話中,不同的觸發問題位置生成的問題語義容易相似,從而導致對話效率低下,這些是今后將需要考慮的問題。