業(yè)界盤點|Query理解在搜索中的落地技巧
卷友們好,我是rumor。
前陣子我們總結(jié)了NLP文本相關(guān)性在搜廣推的應(yīng)用,今天我們繼續(xù)來刷Query理解的落地技巧。
Query理解是搜索引擎中的必備模塊,它的主要功能是對Query進行深入理解,保證召回的數(shù)量和最終排序精度。系統(tǒng)中的整個理解模塊通常被稱為QU(Query Understanding)或QP(Query Parser),主要由以下幾部分構(gòu)成:
基礎(chǔ)解析:包括預處理、分詞、詞性識別、實體識別、詞權(quán)重等多個基礎(chǔ)任務(wù) Query改寫:包括糾錯、擴展、同義替換功能,可以進行擴召回 意圖識別:判斷Query的具體類目,便于召回和最終排序
下圖是騰訊搜索的例子,在實際應(yīng)用中每家的實現(xiàn)順序都各有不同,有些子模塊也可以是并行的,最終的輸出多個處理后的Query進行召回,比如原始Query解析后的倒排索引召回、改寫后Query的倒排索引召回、以及向量化召回。

接下來,我們就看看業(yè)界的搜索都是怎么對這些模塊進行優(yōu)化的。
基礎(chǔ)解析
基礎(chǔ)解析包含很多功能,比如騰訊搜索分享的預處理、分詞、詞性識別,以及去停用詞、實體識別和鏈接、詞權(quán)重等。
詞法分析任務(wù)已經(jīng)有很多開源工具了,本來這個模塊對速度的要求就比較高,基本都是采用詞表或者很淺的模型來解決。在實際選擇工具時,更重要的是考慮工具的效率和可控性,包括:
分詞及NER在業(yè)務(wù)數(shù)據(jù)的精度、速度 粒度控制:比如“2021日本奧運會直播”可以切成“2021/日本/奧運會/直播”,也可以切成“2021日本奧運會/直播”,用phrase級別召回會比細粒度更準確,但phrase結(jié)果不夠時還是需要細粒度的結(jié)果補充 自定義詞典、模型迭代的支持:之前我早年用詞向量做檢索式問答的時候,遇到的困境就是雖然詞表配好了,但如果同時配了“奧運”和“奧運會”,有時候還會切成“奧運/會”,這就需要對模型增量訓練,現(xiàn)有工具很多是不支持的 新詞發(fā)現(xiàn):因為涉及建立倒排索引,Query和Doc需要用同一套分詞。但互聯(lián)網(wǎng)總是會出現(xiàn)各種新型詞匯,這就需要分詞模塊能夠發(fā)現(xiàn)新詞,或者用更重的模型挖掘新詞后加到詞典里
除了詞法分析之外,還有個比較重要的模塊是詞權(quán)重。比如“女士牙膏”這個Query,“牙膏”明顯比“女士”要重要,即使無法召回女士牙膏類的內(nèi)容,召回牙膏內(nèi)容也是可以的。
權(quán)重可以用分數(shù)或分類表達,在計算最終相似度結(jié)果時把term weight信息加入召回排序模型中,比如騰訊搜索就給term分成了四類:

對于Term weighting可以有以下方法:
基于統(tǒng)計+詞表:比如根據(jù)doc統(tǒng)計出詞的tfidf,直接存成詞典就行了。但這種方法無法解決OOV,知乎搜索的解決方法是對ngram進行統(tǒng)計,不過ngram仍然無法捕獲長距離依賴、不能根據(jù)上下文動態(tài)調(diào)整權(quán)重 基于Embedding:針對上下文動態(tài)調(diào)整的問題,知乎搜索的迭代方案是用term的向量減去query整個的pooling向量來算term權(quán)重,diff越小詞越重要;騰訊搜索則是用移除term之后的query和原始query的embedding做差值,diff越大詞越重要 基于統(tǒng)計模型:用速度更快的統(tǒng)計分類/回歸模型同樣可以解決上述問題,騰訊搜索采用了term 詞性、長度信息、term 數(shù)目、位置信息、句法依存 tag、是否數(shù)字、是否英文、是否停用詞、是否專名實體、是否重要行業(yè)詞、embedding 模長、刪詞差異度、前后詞互信息、左右鄰熵、獨立檢索占比 ( term 單獨作為 query 的 qv / 所有包含 term 的 query 的 qv 和)、iqf、文檔 idf、統(tǒng)計概率等特征,來預測term權(quán)重。訓練語料可以通過query和被點擊doc的共現(xiàn)詞來制作 基于深度學習模型:騰訊搜索還提出了一種利用其他模型副產(chǎn)物的方式得到term權(quán)重,可以解決長距離依賴問題,就是把帶有attention機制的意圖模型、文本向量化模型的attention矩陣拿出來作為weight。但這種方法個人認為不太可控,畢竟深度模型太過黑盒,有可能換模型之后波動較大
Query改寫
Query改寫是個很重要的模塊,因為用戶的輸入變化太大了,有短的有長的,還有帶錯別字的,如果改寫成更加規(guī)范的query可以很大地提升搜索質(zhì)量。
改寫模塊又可以分為糾錯、擴展、同義替換等多個功能,這個模塊會提前把高頻Query都挖掘好,存儲成pair對的形式,線上命中后直接替換就可以了,所以能上比較fancy的模型。
糾錯
基于Query本身是否有在字典中的詞,騰訊搜索把錯誤分詞了Non-word和Real-word兩類:

對于不同類錯誤有不同的解決方案,比如英文、數(shù)字、拼音的拼寫錯誤,可以利用編輯距離挖掘出改寫的pair;比如拼音漢字混合、漏字、顛倒等可以通過人工pattern生成一批pair。不過更通用的方法還是批量挖掘或生成。
挖掘可以對用戶session、點擊同一個doc的不同query的行為日志進行統(tǒng)計,計算ngram語言模型的轉(zhuǎn)移概率;也可以直接利用業(yè)務(wù)語料上預訓練的BERT,mask一部分之后得到改寫的詞。
當有了第一批pair語料后,就可以用seq2seq的方式來做了。這方面可以做的很fancy,有不少論文。
擴展
用戶的表述不一定總是精確的,有時候會輸入很短的query,或者很模糊的詞,改幾次才知道自己要什么。擴展則起到了「推薦」的作用,可以對搜索結(jié)果進行擴召回、在搜索時進行提示以及推薦相關(guān)搜索給用戶。目的主要是豐富短query的表達,更好捕捉用戶意圖。
Query擴展pair的挖掘方式和糾錯差不多,可以建模為pair對判別或者seq2seq生成任務(wù)。丁香園分別寫過兩篇擴展模型的總結(jié),這里就不再贅述:
除了用模型發(fā)現(xiàn)之外,也可以利用知識圖譜技術(shù),將一些候選少的query擴展到上位詞,或者某種條件下的相關(guān)詞,比如把“能泡澡的酒店”改寫成“帶浴缸的酒店”,普通的相關(guān)性擴展不一定能學到這些知識。
同義替換
同義替換的挖掘主要解決query和doc表述不一致的問題。比如“迪士尼”和“迪斯尼”、“理發(fā)”和“剪發(fā)”,或者英文和中文等,保證能召回到用戶想找的item。
同義詞的判定標準會更嚴格一些,除了在行為日志挖掘,也可以在doc中挖到很多同義pair。但這個模塊面臨的困境是不同垂搜下的標準不一致,比如我們在挖掘教育領(lǐng)域下的同義詞時,“游泳”和“游泳培訓”就是同義的。對于這個問題一方面可以針對不同領(lǐng)域訓練不同模型,但每個領(lǐng)域一個模型不太優(yōu)雅,所以也可以在語料上做文章,比如加一個統(tǒng)一的后綴,教育領(lǐng)域都變成XX培訓,旅游領(lǐng)域都變成XX的地方。
意圖識別
意圖識別模塊通常是一個分類任務(wù),目的是識別用戶要查詢的類目,再輸出給召回和排序模塊,保證最后結(jié)果的類目相關(guān)性。
除了明確的名詞外,很多query都是模糊的,可能有多個類別滿足情況,所以意圖模塊主要是輸出一個類目的概率分布,進行多路召回,讓排序?qū)舆M行匯總。
構(gòu)建意圖分類模型之前,首先是對類目的梳理,因為大廠們的業(yè)務(wù)越來越復雜,類目也隨之越來越多,通常會采用層級式的類目體系,模塊先判斷大類目,再去判斷更細化的類目。
在構(gòu)建模型時,由于這個模塊對速度的要求大于精度,所以一般會有很淺的模型,比如統(tǒng)計方法或者淺層神經(jīng)網(wǎng)絡(luò)。在微信和第四范式的分享中都提到說Fasttext的效果就很好了。在淺層模型下要想提升效果,可以增加更多的輸入信息,比如微信就提供了很多用戶畫像的feature:

實際上,由于類目層級和數(shù)目的增加,光靠一兩個模型是很難同時滿足速度和精度的,在這個模塊少不了詞表和pattern的幫助,比如:
查詢詞語:澳洲[addr]cemony[brand]水乳[product]面霜[sub_product]
查詢pattern: [brand]+[product];[addr]+[product]+[sub_product]
總結(jié)
雖然NLP只有幾個基礎(chǔ)任務(wù),但在最終落地時卻是很復雜的,一個幾十毫秒的Query理解模塊包含著這么多邏輯,需要幾人甚至十幾人的團隊來維護,不僅要上高效率的模型,還需要增加各種策略來解決業(yè)務(wù)問題。
論文刷多了,看一看業(yè)界分享也能增加不少腦洞,maybe效果就差在某個feature上面。


「預訂用戶畫像」
