深度學習是如何幫助攜程機票客服提高對話效率的

一、背景介紹

作爲一家“以客戶爲中心”的服務型企業,攜程一直以來都在旅行服務上下了很大的功夫。從成爲第一家設立大規模聯絡中心的公司,到開辦中國旅遊業首個客服節,服務已經成爲了攜程最核心的競爭優勢。快速的服務響應能給旅客帶來更好的出遊體驗。

對於機票在線客服而言,如何在部分聊天內容中快速判斷客人問詢的意圖,進而提供解決方案或者引導客人自助操作,成爲了一個十分重要的問題。

當客人進入機票客服聊天界面後,是有兩個對話階段的。

一個是機器對話階段。這個時候還沒有接通人工客服,是機器客服在引導客人自助解決問題。機器客服,也叫機器管家,會提供一些常見的問題,用戶點擊問題後獲得對應的解答。

但是常見問題不一定是客人想要的問題,這個時候就需要人工客服出場了,即進入第二個對話階段:人工對話階段。

在人工對話階段,會有客服人員解答客人的疑惑。但事實上,很多客人在機器對話階段就已經描述了自己遇到的問題,而接通人工客服後,客服可能還需要先翻看客人之前的描述,這個過程比較耗時,效率低而且對客人的體驗不好。因此我們需要在接通人工客服前先對客人描述的內容做一次總結,這樣客服就可以預知客人想了解什麼,並且提前尋找解決方案。

在實際建模過程中,由於機票場景的複雜性,要想模型有非常好的效果,既需要對機票的業務知識有很深的理解,又需要對機票客服對客人的服務習慣有很好的認識。例如當碰到客人的問題是“我要退票”時,客服更關心客人爲什麼退票,是航班延誤導致了退票,能否幫客人獲得補償?還是日期訂錯導致的退票,能否提醒客人直接改簽?

這就要求我們在建模過程中,把對機票業務的理解融入到模型之中,除了基本的文本挖掘模型之外,還要設計一套針對機票業務場景的模型調用方案,以實現模型的定製化,這部分既是我們模型效果提升的重點,也是提高服務質量的關鍵。

接下來我們會從分析問題着手,分享怎樣一步步去解決問題,以及一些注意事項和總結。內容主要包括:理解問題的本質、文本的預處理、樣本平衡和文本等長處理、模型框架、模型訓練方式、模型效果、線上的定製化等。

二、理解問題的本質

開始解決問題之前需要先弄懂問題的實質,因爲我們的處理對象是文本,因此這是一個NLP(自然語言處理)問題,而NLP要解決的問題主要有:

  • 文本聚類

例如:我們會根據一些關鍵詞的出現次數對用戶聚類,劃分不同的用戶羣等。

  • 文本分類

例如:對評論內容分類,區分是正向評論或負向評論等。

  • 文本生成

例如:機器翻譯等。

我們要解決的問題實質上是一個文本多分類問題,因爲我們要把用戶描述的內容對應到一些標準問題上,這些標準問題(也叫業務點)是客人常問的幾百個問題,並且這些業務點已經有了比較標準的解決方案。

值得注意的是,比較常見的問題通常有非常多的樣本,相比而言,那些不常見的問題可能就只有很少的樣本,因此樣本不平衡在我們的問題中尤爲突出,後續我們會談到解決方案。

在下一步的建模之前先對我們的樣本做一些基本描述:我們用到的樣本量爲30萬+,對應的標籤類別數爲400+,其中不同類別對應的樣本量極不平衡,樣本比的最大差距在3000:1以上。

三、文本的預處理

機器學習建模過程都要有一個預處理的過程,甚至是整個建模工作的核心,NLP問題同樣不例外。因此我們需要先對文本數據做一些預處理。

一段文本從構成來看,可以簡單分爲中文、英文、特殊字符,由於我們用到的是客人的聊天數據,中文和英文居多,因此這裏把其他文字、標點符號、表情符號等都認爲是特殊字符,接下來這三部分也分別做相應的處理。

3.1 中文的處理

中文的處理主要包括:簡繁體轉換、分詞。

a. 簡繁體轉換

通常把繁體轉簡體,這裏推薦使用HanLP模塊;

b.分詞

指的把一句話切割成不同的詞,分詞的作用在於提供先驗信息。例如“派出所有人嗎”,這句話是有兩種切分方式的,對於我們而言,使用哪種切分方式既取決於我們已有的知識(哪些字組合起來是一個詞),也取決於當前的語境(哪種詞彙組合出現的可能性最大)。

而分詞其實就是提供這樣一種先驗信息,即提前指出哪些字應該組合起來形成詞,一句話的哪種拆分方式最常用。這裏我們推薦使用jieba或HanLP模塊,兩個模塊之中更加推薦HanLP。

3.2 英文的處理

英文的處理主要包括:大小寫轉換、詞根還原、誤拼轉換等。

a. 大小寫轉換

可以全部轉爲小寫或者全部轉爲大寫。

b. 詞形還原

指把英文詞彙還原成爲一般形式,例如複數還原爲單數,過去時還原爲原始形態等等。

c. 誤拼轉換

可以針對一些高頻誤拼或者縮寫的詞可以做一下還原,統一成原始形態。

3.3 特殊字符的處理

特殊字符主要是一些標點符號和表情符號等,這類字符需要過濾掉。可以考慮過濾掉除有效字符(中文、英文、數字)外的所有其他字符,需要注意的是句子中的標點符號(通常是逗號、句號)由於起到分割句子的作用,因此可以考慮不做剔除。

需要注意的是,文本預處理中絕大部分處理的目的都是爲了降維,即通過把同一個詞的不同形式還原,縮小最終詞彙量。

四、其他處理

4.1 樣本平衡

前面提到過,我們的數據有非常明顯的樣本不均衡問題,由於最終的評估指標是準確率,因此需要先對樣本不均衡做處理、這裏我們的做法是對樣本量過少的類別進行重採樣,但要注意採樣時需要設置合適的比例。

4.2 文本的等長處理

在將文本投入模型之前,需要把分詞後的句子轉化爲相同長度的向量,這就意味着過長的句子我們需要截取,過短的句子需要在句子前或句子後補零,那麼多長才是合適的呢?

這要看分佈,例如我們發現絕大部分句子包含的有效詞組都在N個以內,因此我們可以設置最終輸入的長度爲N。

五、模型框架

模型框架包括文本向量化和模型結構兩部分。

5.1 文本向量化

文本向量化指的是把文本表示爲數值向量,才能投入模型進行數值計算,這裏有兩種做法,一種是詞袋模型(BOW),以所有樣本中出現的詞爲詞典,統計每個詞出現的次數,這樣就能把一句話轉化爲一個向量,向量的長度等於詞典大小,向量中的數值就是詞頻。

很顯然,這種做法忽略了詞的順序,並且生成的向量帶有高維度、高稀疏性的特點,那麼怎樣才能利用詞的順序信息呢?我們把每個詞都表示一個向量,這樣把整句向量化時就可以保留詞的順序信息,這就是詞向量模型。

詞向量模型基於分佈假說,即上下文相似的詞,語義也應該相似,這樣根據詞的上下文關係構建模型,訓練後就將每個詞都表示成了一個向量,這方面比較常用的方法有Word2Vec、GloVe、Bert等。

詞向量可以這樣理解:當我們把詞表示成one-hot形式後,通過乘上一個嵌入矩陣(Embedding Matrix)就可以得到詞向量,而不管是採用無監督或有監督的詞向量模型,其最終目標都是爲了獲得這個嵌入矩陣和對應的詞向量。

5.2 模型結構

模型結構這裏我們主要講兩種比較常用的模型,TextCNN模型和Bi-GRU模型。

TextCNN模型

TextCNN模型由Yoon Kim於2014年提出,是將原本常用於圖像領域的CNN模型應用於NLP領域,主要結構如下:

a. 卷積窗的高度

卷積核的高度通常設置爲3、4、5,代表一次覆蓋多少個單詞。

b. 卷積的方向

卷積時通常使用一維卷積,即只沿着高度這一個方向卷積,如果使用二維卷積,需要限制卷積窗口的寬度始終等於詞向量的長度,等價於一維卷積。

c. 卷積通道 (Channels)

將卷積窗口作用於不同的詞向量矩陣,例如Word2Vec和GloVe,也可以是靜態詞向量和動態詞向量

d. 池化層(Pooling)

通常使用Max Pooling或K-Max Pooling。

TextCNN的優勢是可以充分利用並行優勢,並且也擁有很好的效果,缺點是池化操作會丟失位置信息,並且模型的可解釋性不強。

Bi-GRU模型

Bi-LSTM由Schuster,Paliwal等人於1997年提出,Bi(Bidirectional)是雙向的意思,就是同時使用時序數據的前向及反向信息。GRU由Cho等人於2014年提出,主要是將LSTM的遺忘門(Forget Gate)和輸入門(Input Gate)合併成爲單一的更新門(Update Gate)。

Bi-GRU的優點是可以捕捉到較長時間的信息,使用雙向GRU相比單向GRU有更強的表達能力,而GRU相比於LSTM有更少的參數,因而可以更快收斂。缺點是由於時序結構的特點,並行效率很低。

六、模型訓練方式

模型訓練方式大體上分爲兩種,靜態詞向量方式和動態詞向量方式。

6.1 靜態詞向量

指的是預訓練詞向量後固定起來,在訓練模型的過程中詞向量不再更新,這種方式在數據量很少時會有比較好的效果,因爲預訓練的詞向量帶來了額外的有用信息。

6.2 動態詞向量

指的是預訓練詞向量或生成詞向量後,在後面的訓練過程中也要更新,在數據量很大的情形下,這種方式最終會生成比較適用於當前數據集的詞向量。

七、模型效果

我們使用一塊GPU做訓練,並且比較了不同模型的效果,結果如下:

模型 主要結構 每輪訓練時長 準確率
TextCNN Filters=128
Kernel size=【3,4,5】
104s 91.07%
LSTM Units=300 953s 90.9%
Bi-LSTM Units=150 1700s 92.3%
Bi-GRU Units=150 1440s 91.29%

需要注意的是,由於參數量的差別,此處的準確率對比並不嚴謹,但可以看出在使用GPU的情況下,TextCNN擁有非常短的訓練時長,並且取得了不錯的效果。

八、線上定製化

模型的離線效果只代表了線下理想場景中的預估結果,而在線上實際調用時,還需要針對機票的業務場景設計專門的調用方案,以做到針對機票場景的“定製化”。

在實際使用時,我們經常會碰到這樣的場景:客人在描述一個問題時會說很多句話,並且穿插一些和業務無關的語氣詞、感謝詞等,例如:“你好”、“謝謝”、“嗯嗯”、“麻煩啦”等等。在這種場景下,我們第一步要做的就是過濾無意義的內容,只將包含業務點的句子投入模型。

8.1 無意義句子的識別

過濾無意義句子的一個傳統方法就是把無意義的關鍵詞加入正則表達式中,使用正則表達式過濾掉包含這些關鍵詞的整句話,但這種做法的缺點是無法窮舉所有的無意義詞彙組合,此外,如果是包含業務點的句子含有無意義詞彙,使用這種過濾方式會丟失整個業務點。

在這裏我們使用了一種無意義程度算法,做法如下:

a. 先把無意義的關鍵詞寫入正則表達式,使用正則表達式對原句正則提取;

b. 把正則提取的詞彙按順序拼接起來,形成一個整句;

c. 將拼接後的句子和原句計算相似度(使用編輯距離),根據相似度計算的結果設置一個閾值,從而剔除掉無意義句子。

使用這種無意義程度算法,我們可以靈活的調整閾值,既可以保留機票的業務點,又能過濾無意義句子。

在實際工作中,任何機器學習模型都應該是爲當前的業務場景定製的,只有適合機票業務場景的模型,才能發揮更大的價值。因此我們也針對模型的應用場景做了專門的優化。

8.2 針對機票業務場景的優化

由於我們的模型最終是爲一線客服提供參考,因此評判輸出結果是否合格的核心標準就是:模型結果是否有助於客服判斷客人潛在意圖,是否能夠作爲直接參考,來幫助客服快速解決客人的問題。

前面提到過,在機票場景下,有一些問題對應的樣本量非常多,原因是這些問題在客人的訂票流程中非常常見。

例如“我要改簽”就是比較常見的一個問題,儘管這是個常見的問題,但背後可能有複雜的原因,客人可能是遇到航班延誤想要改簽,也可能是日期訂錯想要改簽,甚至是一些其他的服務問題導致的改簽需求,這時客服就更希望能瞭解客人的改簽原因,以便更好的幫助到客人。在這種場景下,當我們判斷出當前的業務點是“我要改簽”時,就需要從前面的句子中追溯到上一個業務點,把這兩個業務點同時展示給客服。

此外我們還做了其他針對機票場景的細節調整,這些調整都需要對機票業務點有比較深的理解,使模型最終做到了“定製化”。經過這部分調整後,模型的線上準確率由91%提升到了97%以上。

九、總結

最後,我們做一下簡單的總結,整理一下建模過程中的注意事項。

分詞

由於分詞模塊通常都是使用的98年人民日報語料庫,其包含的單詞及詞頻不一定適用於你的數據集,因此建議維護一套自有的詞庫。

樣本

在訓練過程中,預測錯誤的樣本(Bad Case)非常重要,分析預測錯誤的樣本並做相應的調整對提升我們模型效果有很大的幫助,同時,對樣本做平衡處理也會對模型有很大的影響。

訓練方式

訓練方式部分我們推薦使用動態詞向量的方式,因爲只有這樣最終得到的詞向量才更適合你的數據。

模型結構

值得一提的是,TextCNN是非常好用的入門模型,更快的訓練速度及不錯的效果保證了你可以很快得到一個基準結果(Baseline),在這個結果的基礎上你可以進行調參操作或嘗試使用更復雜的模型。

防止過擬合

由於深度學習模型很容易過擬合,因此Dropout對於你的模型來說是必備的。

針對業務場景的調整

無論是傳統的統計模型、機器學習模型,或是機器學習比較火的一個分支——深度學習,乃至人工智能(AI)技術,都是爲了從數據中尋找當前場景背後的規律,因此都應該植根於應用場景,針對應用場景做數據的分析、整理、模型選擇以及後期的優化。

作者介紹

李元上,攜程機票研發部高級數據分析師,擅長結合業務經驗設計模型方案。目前負責攜程值機選座算法設計、機票客服會話機器人的模型開發工作,關注新技術在項目中的應用價值。

本文轉載自公衆號攜程技術中心(ID:ctriptech)。

原文鏈接

https://mp.weixin.qq.com/s?__biz=MjM5MDI3MjA5MQ==&mid=2697269173&idx=2&sn=b6b848336f1dbfbbf0cce22f40f3e8a8&chksm=8376f081b4017997a025dd1c1d39d339978495ae6e981d6b8b9b823f8da3c1d3650bf5c6af91&scene=27#wechat_redirect

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章