一、背景介紹
搜索是電商最重要的門面之一,大部分用戶通過搜索來找到他們想要的商品,因此搜索是用戶表達意圖最直接的方式,也是轉(zhuǎn)化率最高的流量來源之一。絕大部分的電商搜索是通過搜索框輸入搜索詞(Query)來完成,因此,搜索詞的詞義解析和意圖理解成為了搜索中的重要一環(huán)。
主流的搜索詞義解析和Query理解需要經(jīng)過糾錯、同義詞替換、分詞、詞性標注、實體識別、意圖識別、詞重要度權(quán)重、丟詞等步驟。以旅游場景下的搜索舉例,如圖1所示,當用戶在搜索框輸入“云南香各里拉”作為Query的時候,首先搜索引擎需要對該搜索詞進行糾錯,這是為了便于后續(xù)步驟正確解析出用戶想要搜索的內(nèi)容;如果有必要,還會進行同義詞替換。然后,對搜索詞進行分詞和詞性標注,識別出“云南”是省,“香格里拉”是城市或者酒店品牌,緊接著會做實體識別,召回“云南”和“香格里拉”在后臺數(shù)據(jù)庫里對應的實體id。
這個時候,出現(xiàn)了一個分歧,“香格里拉”既可能是城市,又可能是酒店品牌。在用戶進行搜索的時候,是否能夠預測出正確的類別和實體,對于搜索結(jié)果的精準展示和提升用戶體驗有重要的意義。因此,我們必須識別出用戶真正想要搜的是什么類別,并找到對應的實體,否則可能在搜索列表頁前排會給出用戶不想要的結(jié)果。從人的先驗知識來看,用戶搜索“云南香格里拉”,很大可能性是想要搜城市。意圖識別步驟,就是為了實現(xiàn)這個功能,識別出用戶真正的搜索意圖是代表城市的“香格里拉”。
后續(xù)就可以進入搜索的召回步驟,召回主要負責的是把和搜索詞意圖相關(guān)的商品或內(nèi)容找出來。前面的步驟獲取了“云南”和“香格里拉”的id,就可以很方便的召回和“云南”和“香格里拉”都相關(guān)的商品或內(nèi)容。但是,有些時候,召回的結(jié)果為空或者過于稀少,這個時候給用戶的體驗不好,因此,在召回的結(jié)果為空或者過于稀少的情況下,往往還需要丟詞和二次召回的操作。此外,有些詞屬于可省略詞,或者對搜索產(chǎn)生干擾的詞,也可以通過丟詞來處理。
所謂丟詞,就是把搜索詞中相對不重要或者聯(lián)系不緊密的詞丟掉,再次召回。那么該如何衡量每個詞的重要程度或者緊密程度?這里就需要引入了Term Weighting的模塊,把每個詞視為term,通過算法或規(guī)則計算每個term的weight,每個term的weight直接決定了term重要度和緊密度的順序。例如,假設(shè)“云南”的term weight是0.2,“香格里拉”的term weight是0.8,那么如果需要丟詞,就應該先丟“云南”,保留“香格里拉”。
圖1 搜索詞義解析和Query理解步驟
傳統(tǒng)的搜索意圖識別會采用詞表匹配,類目概率統(tǒng)計,加上人為設(shè)定規(guī)則。傳統(tǒng)的Term Weighting同樣會采用詞表匹配和統(tǒng)計方法,比如根據(jù)全量商品的標題和內(nèi)容統(tǒng)計出詞的TF-IDF、前后詞互信息、左右鄰熵等數(shù)據(jù),直接存成詞典和分值,提供給線上使用,再根據(jù)一些規(guī)則輔助判斷,比如行業(yè)專有名詞直接給出較高的term weight,助詞直接給出較低的term weight。
但是,傳統(tǒng)的搜索意圖識別和Term Weighting算法無法達到很高的準確率和召回率,特別是無法處理一些較為罕見的搜索詞,因此需要一些新的技術(shù)來提升這兩個模塊的準確率和召回率,以及提升對罕見搜索詞的適應能力。此外,因為訪問頻率較高,搜索詞義解析需要非常快的響應速度,在旅游搜索場景下,響應速度往往需要達到接近個位數(shù)的毫秒級,這對于算法來說是一個很大的挑戰(zhàn)。
二、 問題分析
為了提高準確率和召回率,我們采用深度學習來改進搜索意圖識別和Term Weighting算法。深度學習通過樣本的學習,可以有效解決各種情況下的意圖識別和Term Weighting。此外,針對自然語言處理的大規(guī)模預訓練語言模型的引入,可以進一步強化深度學習模型的能力,減少樣本的標注量,使得原本標注成本較高的深度學習在搜索上應用成為可能。
但是深度學習面臨的問題是,由于模型的復雜度較高,神經(jīng)網(wǎng)絡層數(shù)較深,響應速度沒法滿足搜索的高要求。因此我們采用模型蒸餾和模型壓縮來減少模型的復雜度,在略微降低準確率和召回率的情況下減少深度學習模型的耗時,以此保證較快的響應速度和較高的性能。
三、意圖識別
類目識別是意圖識別的主要組成部分。意圖識別中的類目識別是搜索詞query經(jīng)過分詞后,對分詞結(jié)果打上所屬類目并給出對應概率值的方法。解析用戶的搜索詞的意圖有利于分析用戶的直接搜索需求,從而輔助提升用戶體驗。例如用戶在旅游頁面搜索 “云南香格里拉”,獲取到用戶輸入的“香格里拉”對應的類目是“城市”,而不是“酒店品牌”,引導后續(xù)檢索策略偏向城市意圖。
在旅游場景下,用戶輸入的類目存在歧義的搜索詞占總量約11%,其中包含大量無分詞的搜索詞。“無分詞”是指經(jīng)過分詞處理后無更細化的切分片段,“類目存在歧義”是指搜索詞本身存在多種可能的類目。例如用戶輸入“香格里拉”,無更細化的切分片段,且對應類目數(shù)據(jù)中存在“城市”、“酒店品牌”等多個類目。
如果搜索詞本身是多個詞的組合,則可以通過搜索詞自身上下文明確類目,優(yōu)先會以搜索詞本身作為識別目標。如果單從搜索詞本身不能明確所屬類目,我們會優(yōu)先追加該用戶不相同的最近歷史搜索詞,以及最近商品類目點擊記錄,若無上述信息則追加定位站,作為補充語料。原始搜索詞經(jīng)過處理獲得待識別的Query R。
最近幾年,預訓練語言模型在很多自然語言處理任務中大放光彩。在類目識別中,我們利用預訓練模型的訓練網(wǎng)絡參數(shù),獲取含上下文語義的字特征Outputbert;使用字詞轉(zhuǎn)換模塊,字特征結(jié)合位置編碼:
獲取到分詞對應的字符片段,如:
代表第i個分詞對應的長度為li的字特征。基于字符片段Wi,字詞轉(zhuǎn)換模塊聚合出每個詞的特征Hwi。聚合手段可以是最大值池化max-pooling、最小值池化min-pooling、均值池化mean-pooling等方式,實驗得到最大池化效果最佳。模塊輸出為搜索詞R的詞特征OutputR;通過并行分類器對搜索詞的詞特征OutputR中各個片段給出類目數(shù)據(jù)庫中涵蓋的匹配類目,并給出對應類目的匹配概率。
圖2 類目識別整體結(jié)構(gòu)示意圖
類目識別模型是基于BERT-base 12層模型,由于模型過大,不滿足線上運行的響應速度要求,我們對模型進行了知識蒸餾(Knowledge Distillation),將網(wǎng)絡從大網(wǎng)絡轉(zhuǎn)化成一個小網(wǎng)絡,保留接近于大網(wǎng)絡的性能的同時滿足線上運行的延遲要求。
原先訓練好的類目識別模型作為teacher網(wǎng)絡,將teacher網(wǎng)絡的輸出結(jié)果作為student網(wǎng)絡的目標,訓練student網(wǎng)絡,使得student網(wǎng)絡的結(jié)果p接近q ,因此,我們可以將損失函數(shù)寫成:
這里CE是交叉熵(Cross Entropy),symmetricalKL是對稱KL散度(Kullback–Leibler divergence),y是真實標簽的one-hot編碼,q是teacher網(wǎng)絡的輸出結(jié)果,p是student網(wǎng)絡的輸出結(jié)果。
圖3 知識蒸餾示意圖
經(jīng)過知識蒸餾,類目識別最終仍然可以達到較高的準確率和召回率,同時可以做到整體響應時間的95線為5ms左右。
經(jīng)過類目識別之后,還需要經(jīng)過實體鏈接等步驟,完成最終的意圖識別過程。具體內(nèi)容可以參見??《攜程實體鏈接技術(shù)的探索及實踐》??一文,本文不再闡述。
四、 Term Weighting
對于用戶輸入的搜索詞,不同的term對于用戶的核心語義訴求有著不同的重要性。在搜索的二次召回排序中需要重點關(guān)注重要性高的term,同時在丟詞的時候可以忽略重要性低的term。通過計算用戶輸入搜索詞的各個term weight,來二次召回出最接近用戶意圖的產(chǎn)品,提升用戶體驗。
首先,我們需要尋找線上用戶真實的反饋數(shù)據(jù)作為標注數(shù)據(jù)。用戶在搜索框的輸入和聯(lián)想詞點擊情況一定程度上反映了用戶對于搜索短語中詞語的重視程度,因此我們選用聯(lián)想詞輸入和點擊數(shù)據(jù),加以人工篩選和二次標注,作為Term Weighting模型的標注數(shù)據(jù)。
在數(shù)據(jù)預處理方面,我們所能獲得的標注數(shù)據(jù)為短語及其對應的關(guān)鍵詞,這里為了使權(quán)重的分配不過于極端,給定非關(guān)鍵詞一定量小的權(quán)重,并將剩余權(quán)重分配給關(guān)鍵詞的每個字上,如果某一短語在數(shù)據(jù)中出現(xiàn)了復數(shù)次,且對應的關(guān)鍵詞不同,則會根據(jù)關(guān)鍵詞的頻率對這些關(guān)鍵詞的權(quán)重進行分配,并進一步分配每個字的權(quán)重。
模型部分主要嘗試BERT作為特征提取的方法,并進一步對每個term的權(quán)重進行擬合。對于給定的輸入,將其轉(zhuǎn)化為BERT所能接收的形式,將通過BERT后的張量再通過全連接層進行壓縮,得到一維的向量后進行Softmax處理,并用該向量對結(jié)果的權(quán)重向量進行擬合,具體模型框架如下圖所示:
圖4 Term Weighting模型框架
由于中文BERT基于字符,因此需要將每個term中的所有字的權(quán)重進行求和,從而最終得到term的權(quán)重。
在整個模型框架中,除去一些訓練的超參數(shù),能調(diào)整的部分主要包含兩個部分:一是通過BERT產(chǎn)生Embedding時,可以選擇BERT最后一層,或者綜合BERT的第一層和最后一層的方式產(chǎn)生Embedding;二是在損失函數(shù)的選擇上,除去使用MSE損失衡量預測權(quán)重與實際權(quán)重之間差距之外,也嘗試使用非重要詞的預測權(quán)重的和作為損失進行計算,但這種損失更適合只有單個關(guān)鍵詞的情況使用。
模型最終是以小數(shù)的形式輸出每個term weight,例如[“上海”、“的”、“迪士尼”]的term weight結(jié)果為[0.3433,0.1218,0.5349]。
該模型是為搜索服務的,有嚴格的響應速度要求。由于BERT模型整體比較大,在推理部分很難達到響應速度要求,因此類似于類目識別模型,我們對訓練好的BERT模型進行進一步的蒸餾處理,以達到符合線上的要求。在此項目中,通過少數(shù)幾層transformer去擬合BERT-base 12層transformer的效果,最后以損失可以接受的一部分性能的情況下,使得模型整體的推理速度快了10倍左右。最終,Term Weighting線上服務整體的95線可以達到2ms左右。
五、 未來與展望
采用深度學習后,旅游搜索對于較為罕見的長尾搜索詞,詞義解析能力有了較大的提升。在目前的線上真實搜索場景,深度學習方法一般選擇與傳統(tǒng)的搜索詞義解析方法相結(jié)合,這樣既可以保證頭部常見搜索詞的性能穩(wěn)定,又可以加強泛化能力。
未來,搜索詞義解析致力于給用戶帶來更好的搜索體驗,隨著硬件技術(shù)和AI技術(shù)的更新?lián)Q代,高性能計算和智能計算越來越成熟,搜索詞義解析的意圖識別和Term Weighting未來會往更高性能的目標發(fā)展。此外,更大規(guī)模的預訓練模型和旅游領(lǐng)域的預訓練模型有助于進一步提升模型的準確率和召回率,更多用戶信息和知識的引入有助于提升意圖識別的效果,線上用戶的反饋和模型迭代有助于提升Term Weighting的效果。這些都是我們后續(xù)會嘗試的方向。
除了意圖識別和Term Weighting之外,搜索的其他功能,比如詞性標注、糾錯等,在滿足響應速度要求的前提下未來也可以采用深度學習技術(shù),來實現(xiàn)更強大的功能和更優(yōu)秀的效果。