導(dǎo)讀:Query 理解 ( QU,Query Understanding ),簡單來說就是從詞法、句法、語義三個(gè)層面對(duì) query 進(jìn)行結(jié)構(gòu)化解析。這里 query 從廣義上來說涉及的任務(wù)比較多,最常見的就是我們?cè)谒阉飨到y(tǒng)中輸入的查詢?cè)~,也可以是 FAQ 問答或閱讀理解中的問句,又或者可以是人機(jī)對(duì)話中用戶的聊天輸入。本文主要介紹在搜索中的 query 理解,會(huì)相對(duì)系統(tǒng)性地介紹 query 理解中各個(gè)重要模塊以及它們之間如何 work 起來共同為搜索召回及排序模塊服務(wù),同時(shí)簡單總結(jié)個(gè)人目前了解到業(yè)界在各個(gè)模塊中的一些實(shí)現(xiàn)方法。
01
相關(guān)概念
1. NLP
自然語言處理 ( NLP,Natural Language Processing ) 是集語言學(xué)、統(tǒng)計(jì)學(xué)、計(jì)算機(jī)科學(xué),人工智能等學(xué)科于一體的交叉領(lǐng)域,目標(biāo)是讓計(jì)算機(jī)能在處理理解人類自然語言的基礎(chǔ)上進(jìn)一步執(zhí)行結(jié)構(gòu)化輸出或語言生成等其他任務(wù),其涉及的基礎(chǔ)技術(shù)主要有:詞法分析、句法分析、語義分析、語用分析、生成模型等。諸如語音識(shí)別、機(jī)器翻譯、QA 問答、對(duì)話機(jī)器人、閱讀理解、文本分類聚類等任務(wù)都屬于 NLP 的范疇。
這些任務(wù)從變換方向上來看,主要可以分為自然語言理解 ( NLU,Natural Language Understanding ) 和自然語言生成 ( NLG,Natural Language Generation ) 兩個(gè)方面,其中 NLU 是指對(duì)自然語言進(jìn)行理解并輸出結(jié)構(gòu)化語義信息,而 NLG 則是多模態(tài)內(nèi)容 ( 圖像、語音、視頻、結(jié)構(gòu)/半結(jié)構(gòu)/非結(jié)構(gòu)化文本 ) 之間的相互生成轉(zhuǎn)換。
一些任務(wù)同時(shí)涵蓋 NLU 和 NLG,比如對(duì)話機(jī)器人任務(wù)需要在理解用戶的對(duì)話內(nèi)容 ( NLU 范疇 ) 基礎(chǔ)上進(jìn)行對(duì)話內(nèi)容生成 ( NLG 范疇 ),同時(shí)為進(jìn)行多輪對(duì)話理解及與用戶交互提示這些還需要有對(duì)話管理模塊 ( DM,Dialogue Management ) 等進(jìn)行協(xié)調(diào)作出對(duì)話控制。本文要介紹的搜索 query 理解大部分模塊屬于 NLU 范疇,而像 query 改寫模塊等也會(huì)涉及到一些 NLG 方法。
2. 搜索引擎
在介紹搜索 query 理解之前,先簡單介紹下搜索引擎相關(guān)知識(shí)。除了傳統(tǒng)的通用搜索 Google、Baidu、Bing 這些,大部分互聯(lián)網(wǎng)垂直產(chǎn)品如電商、音樂、應(yīng)用市場、短視頻等也都需要搜索功能來滿足用戶的需求查詢,相較于推薦系統(tǒng)的被動(dòng)式需求滿足,用戶在使用搜索時(shí)會(huì)通過組織 query 來主動(dòng)表達(dá)訴求,為此用戶的搜索意圖相對(duì)比較明確。但即便意圖相對(duì)明確,要做好搜索引擎也是很有挑戰(zhàn)的,需要考慮的點(diǎn)及涉及的技術(shù)無論在深度還是廣度上都有一定難度。
一個(gè)基本的搜索系統(tǒng)大體可以分為離線挖掘和在線檢索兩部分,其中包含的重要模塊主要有:Item 內(nèi)容理解、Query 理解、檢索召回、排序模塊等。整個(gè)檢索系統(tǒng)的目標(biāo)可以抽象為給定 query,檢索出最能滿足用戶需求的 item,也即檢索出概率:P(Ii|Q) 最大的 item Ii。
根據(jù)貝葉斯公式展開:
其中 P(Ii) 表示 item 的重要程度,對(duì)應(yīng) item 理解側(cè)的權(quán)威度、質(zhì)量度等挖掘,P(Q|Ii) 表示 item Ii 能滿足用戶搜索需求 Q 的程度,對(duì) query 分詞后可以表示為:
P(Q|Ii)=P(t1,...,tn|Ii)
這部分概率對(duì)應(yīng)到基于 query 理解和 item 理解的結(jié)果上進(jìn)行 query 和 item 間相關(guān)性計(jì)算,同時(shí)涉及到點(diǎn)擊調(diào)權(quán)等排序模塊。
① 離線挖掘
在離線側(cè),我們需要做一些基礎(chǔ)的離線挖掘工作,包括 item 內(nèi)容的獲取、清洗解析、item 內(nèi)容理解 ( 語義 tag、權(quán)威度計(jì)算、時(shí)間因子、質(zhì)量度等 )、用戶畫像構(gòu)建、query 離線策略挖掘、以及從搜索推薦日志中挖掘 item 之間的語義關(guān)聯(lián)關(guān)系、構(gòu)建排序模型樣本及特征工程等。進(jìn)行 item 內(nèi)容理解之后,對(duì)相應(yīng)的結(jié)構(gòu)化內(nèi)容執(zhí)行建庫操作,分別構(gòu)建正排和倒排索引庫。其中,正排索引簡單理解起來就是根據(jù) itemid 能找到 item 的各個(gè)基本屬性及 term 相關(guān) ( term 及其在 item 中出現(xiàn)的頻次、位置等信息 ) 的詳細(xì)結(jié)構(gòu)化數(shù)據(jù)。
相反地,倒排索引就是能根據(jù)分詞 term 來找到包含該 term 的 item 列表及 term 在對(duì)應(yīng) item 中詞頻、位置等信息。通常會(huì)對(duì)某個(gè) item 的 title、keyword、anchor、content 等不同屬性域分別構(gòu)建倒排索引,同時(shí)一般會(huì)根據(jù) item 資源的權(quán)威度、質(zhì)量度等縱向構(gòu)建分級(jí)索引庫,首先從高質(zhì)量庫中進(jìn)行檢索優(yōu)先保證優(yōu)質(zhì)資源能被檢索出來,如果高質(zhì)量檢索結(jié)果不夠再從低質(zhì)量庫中進(jìn)行檢索。為了兼顧索引更新時(shí)效性和檢索效率,一般會(huì)對(duì)索引庫進(jìn)行橫向分布式部署,且索引庫的構(gòu)建一般分為全量構(gòu)建和增量更新。常見的能用于快速構(gòu)建索引的工具框架有 Lucene 全文檢索引擎以及基于 Lucene 的 Solr、ES ( Elastic Search ) 等。
除了基本的文本匹配召回,還需要通過構(gòu)建 query 意圖 tag 召回或進(jìn)行語義匹配召回等多路召回來提升搜索語義相關(guān)性以及保證召回的多樣性。
② 在線檢索
線上執(zhí)行檢索時(shí)大體可以分為基礎(chǔ)檢索 ( BS ) 和高級(jí)檢索 ( AS ) 兩個(gè)過程,其中 BS 更注重 term 級(jí)別的文本相關(guān)性匹配及粗排,AS 則更注重從整體上把控語義相關(guān)性及進(jìn)行精排等處理。以下面這個(gè)框圖為例,介紹下一個(gè)相對(duì)簡單的在線檢索過程。對(duì)于從 client 發(fā)起的線上搜索請(qǐng)求,會(huì)由接入層傳入 SearchObj ( 主要負(fù)責(zé)一些業(yè)務(wù)邏輯的處理 ),再由 SearchObj 傳給 SearchAS ( 負(fù)責(zé)協(xié)調(diào)調(diào)用 qu、召回和排序等模塊 ),SearchAS 首先會(huì)去請(qǐng)求 SearchQU 服務(wù) ( 負(fù)責(zé)搜索 query 理解 ) 獲取對(duì) query 理解后的結(jié)構(gòu)化數(shù)據(jù),然后將這些結(jié)構(gòu)化數(shù)據(jù)傳給基礎(chǔ)召回模塊 BS,BS 根據(jù)切詞粒度由粗到細(xì)對(duì)底層索引庫進(jìn)行一次或多次檢索,執(zhí)行多個(gè)索引隊(duì)列的求交求并拉鏈等操作返回結(jié)果。
同時(shí) BS 還需要對(duì)文本、意圖 tag、語義召回等不同路召回隊(duì)列根據(jù)各路召回特點(diǎn)采用多個(gè)相關(guān)性度量 ( 如:BM25 文本相似度、tag 相似度、語義相關(guān)度、pagerank 權(quán)威度、點(diǎn)擊調(diào)權(quán)等 ) 進(jìn)行 L0 粗排截?cái)嘁员WC相關(guān)性,然后再將截?cái)嗪蟮亩嗦氛倩剡M(jìn)行更精細(xì)的 L1 相關(guān)性融合排序,更復(fù)雜一些的搜索可能會(huì)有 L0 到 LN 多層排序,每層排序的側(cè)重點(diǎn)有所不同,越高層次 item 數(shù)變得越少,相應(yīng)的排序方法也會(huì)更復(fù)雜。
BS 將經(jīng)過相關(guān)性排序的結(jié)果返回給 SearchAS,SearchAS 接著調(diào)用 SearchRank 服務(wù)進(jìn)行 ctr/cvr 預(yù)估以對(duì) BS 返回的結(jié)果列表進(jìn)行 L2 重排序,并從正排索引及摘要庫等獲取相應(yīng) item 詳情信息進(jìn)一步返回給 SearchObj 服務(wù),與此同時(shí) SearchObj 服務(wù)可以異步去請(qǐng)求廣告服務(wù)拉取這個(gè) query 對(duì)應(yīng)的廣告召回隊(duì)列及競價(jià)相關(guān)信息,然后就可以對(duì)廣告或非廣告 item 內(nèi)容進(jìn)行以效果 ( pctr、pcvr、pcpm ) 為導(dǎo)向的排序從而確定各個(gè) item 內(nèi)容的最終展示位置。
最后在業(yè)務(wù)層一般還會(huì)支持干預(yù)邏輯以及一些規(guī)則策略來實(shí)現(xiàn)各種業(yè)務(wù)需求。在實(shí)際設(shè)計(jì)搜索實(shí)驗(yàn)系統(tǒng)時(shí)一般會(huì)對(duì)這些負(fù)責(zé)不同功能的模塊進(jìn)行分層管理,以上面介紹的簡單檢索流程為例主要包括索引召回層、L0 排序截?cái)鄬?、L1 相關(guān)性融合排序?qū)?、L2 效果排序?qū)?、SearchAS 層、業(yè)務(wù)層等,各層流量相互正交互不影響,可以方便在不同層進(jìn)行獨(dú)立的 ABtest 實(shí)驗(yàn)。
當(dāng)然,具體實(shí)現(xiàn)搜索系統(tǒng)遠(yuǎn)比上面介紹的流程更為復(fù)雜,涉及的模塊及模塊間的交互會(huì)更多,比如當(dāng)用戶搜索 query 沒有符合需求的結(jié)果時(shí)需要做相關(guān)搜索 query 推薦以進(jìn)行用戶引導(dǎo)、檢索無結(jié)果時(shí)可以根據(jù)用戶的畫像或搜索歷史做無結(jié)果個(gè)性化推薦等,同時(shí)和推薦系統(tǒng)一樣,搜索周邊涉及的系統(tǒng)服務(wù)也比較龐雜,如涉及日志上報(bào)回流、實(shí)時(shí)計(jì)算能力、離/在線存儲(chǔ)系統(tǒng)、ABtest 實(shí)驗(yàn)平臺(tái)、報(bào)表分析平臺(tái)、任務(wù)調(diào)度平臺(tái)、機(jī)器學(xué)習(xí)平臺(tái)、模型管理平臺(tái)、業(yè)務(wù)管理后臺(tái)等,只有這些平臺(tái)能 work 起來,整個(gè)搜索系統(tǒng)才能正常運(yùn)轉(zhuǎn)起來。
③ 多模語義搜索
隨著資源越來越豐富,如何讓用戶從海量的信息及服務(wù)資源中能既準(zhǔn)確又快速地找到訴求變得越來越重要,如2009年百度提出的框計(jì)算概念目標(biāo)就是為了能更快更準(zhǔn)地滿足用戶需求。同時(shí),隨著移動(dòng)互聯(lián)網(wǎng)的到來,用戶的輸入方式越來越多樣,除了基本的文本輸入檢索,實(shí)現(xiàn)通過語音、圖片、視頻等內(nèi)容載體進(jìn)行檢索的多模態(tài)搜索也變得越來越有必要。由于用戶需求的多樣或知識(shí)背景不同導(dǎo)致需求表達(dá)的千差萬別,要做到極致的搜索體驗(yàn)需要漫長的優(yōu)化過程,畢竟目前真正的語義搜索還遠(yuǎn)未到來。
02
Query 理解
從前面的介紹可以知道,搜索三大模塊的大致調(diào)用順序是從 query 理解到檢索召回再到排序,作為搜索系統(tǒng)的第一道環(huán)節(jié),query 理解的結(jié)果除了可以用于召回也可以給排序模塊提供必要的基礎(chǔ)特征,為此 QU 很大程度影響召回和排序的質(zhì)量,對(duì) query 是進(jìn)行簡單字面上的理解還是可以理解其潛在的真實(shí)需求很大程度決定著一個(gè)搜索系統(tǒng)的智能程度。目前業(yè)界的搜索 QU 處理流程還是以 pipeline 的方式為主,也即拆分成多個(gè)模塊分別負(fù)責(zé)相應(yīng)的功能實(shí)現(xiàn),pipeline 的處理流程可控性比較強(qiáng),但存在缺點(diǎn)就是其中一個(gè)模塊不 work 或準(zhǔn)確率不夠會(huì)對(duì)全局理解有較大影響。為此,直接進(jìn)行 query-item 端到端地理解如深度語義匹配模型等也是一個(gè)值得嘗試的方向。
1. Pipeline 流程
搜索 Query 理解包含的模塊主要有:query 預(yù)處理、query 糾錯(cuò)、query 擴(kuò)展、query 歸一、聯(lián)想詞、query 分詞、意圖識(shí)別、term 重要性分析、敏感 query 識(shí)別、時(shí)效性識(shí)別等。以下圖為例,這里簡單介紹下 query 理解的 pipeline 處理流程:線上來一個(gè)請(qǐng)求 query,為緩解后端壓力首先會(huì)判斷該 query 是否命中 cache,若命中則直接返回對(duì)該 query 對(duì)應(yīng)的結(jié)構(gòu)化數(shù)據(jù)。若不命中 cache,則首先會(huì)對(duì) query 進(jìn)行一些簡單的預(yù)處理,接著由于 query 糾錯(cuò)可能會(huì)用到分詞 term 信息進(jìn)行錯(cuò)誤檢測等先進(jìn)行 query 分詞并移除一些噪音符號(hào),然后進(jìn)行 query 糾錯(cuò)處理,一些情況下局部糾錯(cuò)可能會(huì)影響到上下文搭配的全局合理性,為此還可能會(huì)需要進(jìn)行二次糾錯(cuò)處理。
對(duì) query 糾錯(cuò)完后可以做 query 歸一、擴(kuò)展及聯(lián)想詞用于進(jìn)行擴(kuò)召回及幫助用戶做搜索引導(dǎo)。接著再對(duì) query 做分詞及對(duì)分詞后的 term 做重要性分析及緊密度分析,對(duì)無關(guān)緊要的詞可以做丟詞等處理,有了分詞 term 及對(duì)應(yīng)的權(quán)重、緊密度信息后可以用于進(jìn)行精準(zhǔn)和模糊意圖的識(shí)別。除了這些基本模塊,有些搜索場景還需要有對(duì) query 進(jìn)行敏感識(shí)別及時(shí)效性分析等其他處理模塊。最后還需要能在 cms 端進(jìn)行配置的人工干預(yù)模塊,對(duì)前面各個(gè)模塊處理的結(jié)果能進(jìn)行干預(yù)以快速響應(yīng) badcase 處理。
當(dāng)然,這個(gè) pipeline 不是通用的,不同的搜索業(yè)務(wù)可能需要結(jié)合自身情況做 pipeline 的調(diào)整定制,像百度這些搜索引擎會(huì)有更為復(fù)雜的 query 理解 pipeline,各個(gè)模塊間的依賴交互也更為復(fù)雜,所以整個(gè) QU 服務(wù)最好能靈活支持各個(gè)模塊的動(dòng)態(tài)熱插拔,像組裝樂高積木一樣進(jìn)行所需模塊的靈活配置,下面對(duì)各個(gè)模塊做進(jìn)一步詳細(xì)的介紹。
2. Query 預(yù)處理
Query 預(yù)處理這個(gè)模塊相對(duì)來說比較簡單,主要對(duì) query 進(jìn)行以下預(yù)處理從而方便其他模塊進(jìn)行分析:
全半角轉(zhuǎn)換:將在輸入法全角模式下輸入的 query 轉(zhuǎn)換為半角模式的,主要對(duì)英文、數(shù)字、標(biāo)點(diǎn)符號(hào)有影響,如將 "wechat123" 全角輸入轉(zhuǎn)成半角模式下的 "wechat 123"。
大小寫轉(zhuǎn)換:統(tǒng)一將大寫形式的字母轉(zhuǎn)成小寫形式的。
繁簡體轉(zhuǎn)換:將繁體輸入轉(zhuǎn)成簡體的形式,當(dāng)然考慮到用戶群體的差異以及可能存在繁體形式的資源,有些情況還需要保留轉(zhuǎn)換前的繁體輸入用于召回。
無意義符號(hào)移除:移除諸如火星文符號(hào)、emoji 表情符號(hào)等特殊符號(hào)內(nèi)容。
Query 截?cái)啵簩?duì)于超過一定長度的 query 進(jìn)行截?cái)嗵幚怼?/p>
3. Query 分詞
① 分詞技術(shù)
Query 分詞就是將 query 切分成多個(gè) term,如:"手機(jī)淘寶"切分成"手機(jī) 淘寶"兩個(gè) term。分詞作為最基礎(chǔ)的詞法分析組件,其準(zhǔn)確性很大程度影響 QU 后面的各個(gè)處理,如分詞及對(duì)應(yīng)詞性信息可以用于后續(xù)的 term 重要性分析和意圖識(shí)別等多個(gè)模塊。同時(shí),QU 的分詞及其粒度需要與 item 側(cè)索引構(gòu)建的分詞及粒度保持一致,從而才能進(jìn)行有效地召回。目前分詞技術(shù)相對(duì)來說已經(jīng)比較成熟,主要做法有基于詞典進(jìn)行前后向最大匹配、對(duì)所有成詞情況構(gòu)造 DAG、hmm/crf 序列標(biāo)注模型以及深度學(xué)習(xí)模型+序列標(biāo)注等。
目前無論學(xué)術(shù)界還是工業(yè)界開放的分詞工具或服務(wù)還是比較多的,如主要有騰訊內(nèi)部的 QQSeg、百度 LAC、Jieba 分詞、清華 THULAC、北大 pkuseg、中科院 ICTCLAS、哈工大 PyLTP、復(fù)旦 FNLP、Ansj、SnowNLP、FoolNLTK、HanLP、斯坦福 CoreNLP、Jiagu、IKAnalyzer 等。這些分詞工具在功能和性能上會(huì)存在一定的差異,具體使用時(shí)要結(jié)合業(yè)務(wù)需求定制選擇,需要考慮的點(diǎn)主要包括:切詞準(zhǔn)確性、粒度控制、切詞速度、是否帶有 NER、NER 識(shí)別速度、是否支持自定義詞典等,由于沒對(duì)所有這些分詞工具做各項(xiàng)性能指標(biāo)的具體評(píng)測,這里暫時(shí)不做過多的比較。
在搜索中的 query 切詞一般會(huì)做粒度控制,分為細(xì)粒度和 phrase 粗粒度兩個(gè)級(jí)別,比如 query "下載深海大作戰(zhàn)"按 phrase 粗粒度切分可以為"下載 深海大作戰(zhàn)",按細(xì)粒度切分為"下載 深海 大 作戰(zhàn)"。在進(jìn)行召回時(shí)可以優(yōu)先用 phrase 粗粒度的切詞結(jié)果進(jìn)行召回能得到更精準(zhǔn)相關(guān)的結(jié)果同時(shí)減少多個(gè) term 拉鏈合并的計(jì)算量。當(dāng) phrase 粗粒度分詞進(jìn)行召回結(jié)果不夠時(shí),可以采用拆分后的細(xì)粒度分詞進(jìn)行二次重查擴(kuò)召回。
② 新詞發(fā)現(xiàn)
一般來說,使用已有的開源切詞工具已經(jīng)有比較好的切分精度了,但是對(duì)于一些新出現(xiàn)的網(wǎng)絡(luò)詞匯可能不能及時(shí)識(shí)別覆蓋,尤其是對(duì)于一些垂直搜索有比較多業(yè)務(wù)專名詞的情況,這時(shí)候需要對(duì)這些未登錄詞做新詞發(fā)現(xiàn)。一些切詞工具自帶有新詞發(fā)現(xiàn)功能,比如 Jieba 采用 HMM 進(jìn)行新詞發(fā)現(xiàn)。此外簡單地,可以采用基于統(tǒng)計(jì)的方法來進(jìn)行新詞發(fā)現(xiàn),通過統(tǒng)計(jì)語料中的詞語 tfidf 詞頻、凝聚度和自由度等指標(biāo)來進(jìn)行無監(jiān)督新詞挖掘,當(dāng)詞語的凝聚度和自由度達(dá)到一定閾值且已有分詞不能切分到一起時(shí)可以人工評(píng)估后加進(jìn)詞庫。其中凝聚度即點(diǎn)互信息:
用于衡量兩個(gè) term 共現(xiàn)的概率,兩個(gè) term 經(jīng)常出現(xiàn)在一起,則可以將它們組合成一個(gè)詞語整體的可能性也更大。自由度取 term 左右鄰熵的較小值:
Freedeg=min(entropy(wleft),entropy(wright))
衡量當(dāng)前 term 左右兩邊字集合的隨機(jī)程度,如果左右字集合越隨機(jī)則這個(gè) term 獨(dú)立成詞的可能性也更大。還有的做法是對(duì) query 進(jìn)行切詞后構(gòu)建詞之間的關(guān)系矩陣,然后進(jìn)行矩陣分解,得到各個(gè)詞在主特征空間的投影向量,通過投影向量計(jì)算詞之間的相似度并設(shè)定相應(yīng)閾值構(gòu)造0-1切分矩陣,基于該矩陣進(jìn)行是否成詞的判斷。再有就是可以將新詞發(fā)現(xiàn)轉(zhuǎn)化為序列標(biāo)注問題,訓(xùn)練 BiLSTM-CRF、BERT-CRF 等模型預(yù)測成詞的起始、中間及結(jié)束位置,或者轉(zhuǎn)化為 ngram 詞在給定句子語境中是否成詞或不成詞二分類問題。
4. 緊密度分析
Term 緊密度,主要用于衡量 query 中任意兩個(gè) term 之間的緊密程度,如果兩個(gè) term 間緊密度比較高,則這兩個(gè) term 在召回 item 中出現(xiàn)的距離越近相對(duì)來說越相關(guān)。以相鄰的兩個(gè) term 為例,由于分詞工具本身存在準(zhǔn)確率問題,某兩個(gè) term 可能不會(huì)被分詞工具切分到一起,但它們之間的關(guān)系比較緊密,也即緊密度比較高,如果在召回時(shí)能將在 item 中同時(shí)出現(xiàn)有這兩個(gè) term 且出現(xiàn)位置挨在一起或比較靠近的 item 進(jìn)行召回,相關(guān)性會(huì)更好。
以前面的搜索 query "下載深海大作戰(zhàn)"為例,經(jīng)分詞工具可能切分成"下載 深海 大 作戰(zhàn)",但其實(shí)"大"和"作戰(zhàn)"的緊密度很高,從文本相關(guān)性角度來看,召回"喵星大作戰(zhàn)" app 要一定程度比"大人物作戰(zhàn)"會(huì)更相關(guān)。當(dāng)然,在 query 中并不是兩個(gè) term 的距離越近緊密度越高,可以通過統(tǒng)計(jì)搜索 log 里 term 之間的共現(xiàn)概率來衡量他們的緊密程度。
在進(jìn)行召回時(shí),傳統(tǒng)的相關(guān)性打分公式如 OkaTP、BM25TP、newTP、BM25TOP 等在 BM25 基礎(chǔ)上進(jìn)一步考慮了 proximity 計(jì)算,但主要采用兩個(gè) term 在 item 中的距離度量,如:
有了 query 中的 term 緊密度,在召回構(gòu)造查詢索引的邏輯表達(dá)式中可以要求緊密度高的兩個(gè) term 需共同出現(xiàn)以及在 proximity 計(jì)算公式中融合考慮進(jìn)去,從而保證 query 中緊密度高的兩個(gè) term 在 item 中出現(xiàn)距離更近更相關(guān)。
5. Term 重要性分析
考慮到不同 term 在同一文本中會(huì)有不一樣的重要性,在做 query 理解及 item 內(nèi)容理解時(shí)均需要挖掘切詞后各個(gè) term 的重要性,在進(jìn)行召回計(jì)算相關(guān)性時(shí)需要同時(shí)考慮 query 及 item 側(cè)的 term 重要性。如對(duì)于 query "手機(jī)淘寶",很明顯 term "淘寶"要比"手機(jī)"更重要,為此賦予"淘寶"的權(quán)重應(yīng)該比"手機(jī)"高。Term 重要性可以通過分等級(jí)或0.0~1.0的量化分值來衡量,如下圖的 case 所示我們可以將 term 重要性分為4個(gè)級(jí)別,重要性由高到低分別是:核心詞、限定詞、可省略詞、干擾詞。對(duì)于重要級(jí)別最低的 term 可以考慮直接丟詞,或者在索引庫進(jìn)行召回構(gòu)造查詢邏輯表達(dá)式時(shí)將對(duì)應(yīng)的 term 用 "or" 邏輯放寬出現(xiàn)限制,至于計(jì)算出的在 query 和 item 內(nèi)容中的 term 重要性分值則可以用于召回時(shí)計(jì)算基礎(chǔ)相關(guān)性,如簡單地將 BM25 公式:
中 term 在 item 及 query 中的詞頻 tf(t)、qf(t) 乘上各自的 term 權(quán)重。
其中 item 內(nèi)容側(cè)的 term 重要性可以采用 LDA 主題模型、TextRank 等方法來挖掘,至于 query 側(cè)的 term 重要性,比較容易想到的方法就是把它視為分類或回歸問題來考慮,通過訓(xùn)練 svm、gbdt 等傳統(tǒng)機(jī)器學(xué)習(xí)模型即可進(jìn)行預(yù)測。模型樣本的構(gòu)造除了進(jìn)行人工標(biāo)注還可以通過用戶的搜索點(diǎn)擊日志來自動(dòng)構(gòu)造。大概做法是將某個(gè) query 對(duì)應(yīng)搜索結(jié)果的用戶點(diǎn)擊頻次作為同時(shí)出現(xiàn)在 query 及搜索結(jié)果 title 中相應(yīng) term 的重要性體現(xiàn),首先通過共同點(diǎn)擊信息或二部圖方法對(duì) query 進(jìn)行聚類,再將一個(gè) query 對(duì)應(yīng)有不同點(diǎn)擊 title 以及同一 term 在簇內(nèi)不同 query 中的點(diǎn)擊 title 頻次結(jié)果加權(quán)考慮起來,同時(shí)排除掉一些搜索 qv 比較不置信的 query 及 title 對(duì)應(yīng)的結(jié)果,最后將累計(jì)頻次進(jìn)行歸一化及分檔得到樣本對(duì)應(yīng) label。
至于特征方面,則可以從詞法、句法、語義、統(tǒng)計(jì)信息等多個(gè)方向進(jìn)行構(gòu)造,比如:term 詞性、長度信息、term 數(shù)目、位置信息、句法依存 tag、是否數(shù)字、是否英文、是否停用詞、是否專名實(shí)體、是否重要行業(yè)詞、embedding 模長、刪詞差異度、前后詞互信息、左右鄰熵、獨(dú)立檢索占比 ( term 單獨(dú)作為 query 的 qv / 所有包含 term 的 query 的 qv 和)、iqf、文檔 idf、統(tǒng)計(jì)概率:
以及短語生成樹得到 term 權(quán)重等。
其中刪詞差異度的做法是先訓(xùn)練得到 query 的 embedding 表示,然后計(jì)算移除各個(gè) term 之后的 query 與原 query 的 embedding 相似度差值用于衡量 term 的重要性,如果移除某個(gè) term 之后相似度差異很大,代表這個(gè) term 比較重要。而短語生成樹的做法是通過從搜索 session 序列及搜索點(diǎn)擊行為中挖掘出 query 之間的相關(guān)關(guān)系按 query 長度降序自頂向下進(jìn)行構(gòu)造得到,其中樹的邊和結(jié)點(diǎn)均有一定的權(quán)重。
這里假設(shè)在一定共現(xiàn)關(guān)系情況下越短的 query 越是整體意圖的核心表達(dá),所以和越下層結(jié)點(diǎn)連接越多的 term 重要性越大,僅和較上層或根結(jié)點(diǎn)有連接的 term 重要性相對(duì)較小,通過用 iqf 等初始化葉子結(jié)點(diǎn),然后自底向上進(jìn)行結(jié)點(diǎn)分值計(jì)算并進(jìn)行多輪迭代使得 term 權(quán)重相對(duì)穩(wěn)定。如下圖所示 query "好玩的5v5策略競技游戲"構(gòu)造的短語生成樹示例。
分類回歸的方法很好地利用了用戶的點(diǎn)擊行為反饋,通過精細(xì)的特征工程往往能得到比較好的結(jié)果。還有的方法就是利用深度學(xué)習(xí)模型來學(xué)習(xí) term 重要性,比如通過訓(xùn)練基于 BiLSTM+Attention 的 query 意圖分類模型或基于 eq2Seq/Transformer 訓(xùn)練的 query 翻譯改寫模型得到的 attention 權(quán)重副產(chǎn)物再結(jié)合其他策略或作為上述分類回歸模型的特征也可以用于衡量 term 的重要性。
6. 搜索引導(dǎo)
受限于用戶的先驗(yàn)知識(shí)的參差不齊或輸入設(shè)備引入的噪音,用戶輸入的 query 可能不足以表達(dá)用戶真正的需求進(jìn)而影響用戶搜到想要的結(jié)果。為此,除了保證搜索結(jié)果的相關(guān)性,一個(gè)完善的搜索引擎還需要給用戶提供一系列搜索引導(dǎo)功能,以減少用戶的搜索輸入成本,縮短用戶找到訴求的路徑。搜索引導(dǎo)按功能的不同主要可以分為:搜索熱詞、搜索歷史、query 改寫、搜索聯(lián)想詞,一些電商等垂搜可能還帶有類目屬性等搜索導(dǎo)航功能。由于搜索熱詞及搜索歷史功能相對(duì)比較好理解,這里不做過多闡述。
① Query 改寫
Query 改寫這個(gè)概念比較泛,簡單理解就是將源 query 改寫變換到另一個(gè) query。按照改寫功能的不同,query 改寫可以分為 query 糾錯(cuò)、query 歸一、query 擴(kuò)展三個(gè)方向。其中 query 糾錯(cuò)負(fù)責(zé)對(duì)存在錯(cuò)誤的 query 進(jìn)行識(shí)別糾錯(cuò),query 歸一負(fù)責(zé)將偏門的 query 歸一變換到更標(biāo)準(zhǔn)且同義的 query 表達(dá),而 query 擴(kuò)展則負(fù)責(zé)擴(kuò)展出和源 query 內(nèi)容或行為語義相關(guān)的 query 列表推薦給用戶進(jìn)行潛在需求挖掘發(fā)現(xiàn)。
Query 糾錯(cuò):
Query 糾錯(cuò),顧名思義,也即對(duì)用戶輸入 query 出現(xiàn)的錯(cuò)誤進(jìn)行檢測和糾正的過程。用戶在使用搜索過程中,可能由于先驗(yàn)知識(shí)掌握不夠或輸入過程引入噪音 ( 如:語音識(shí)別有誤、快速輸入手誤等 ) 輸入的搜索 query 會(huì)存在一定的錯(cuò)誤。如果不對(duì)帶有錯(cuò)誤的 query 進(jìn)行糾錯(cuò),除了會(huì)影響 QU 其他模塊的準(zhǔn)確率,還會(huì)影響召回的相關(guān)性及排序的合理性,最終影響到用戶的搜索體驗(yàn)。
除了搜索場景,query 糾錯(cuò)還可以應(yīng)用于輸入法、人機(jī)對(duì)話、語音識(shí)別、內(nèi)容審核等應(yīng)用場景。不同的業(yè)務(wù)場景需要解決的錯(cuò)誤類型會(huì)不太一樣,比如 ASR 語音識(shí)別主要解決同諧音、模糊音等錯(cuò)誤,而輸入法及搜索等場景則需要面臨解決幾乎所有錯(cuò)誤類型,如同諧音、模糊音 ( 平舌翹舌、前后鼻音等 )、混淆音、形近字 ( 主要針對(duì)五筆和筆畫手寫輸入法 )、多漏字等錯(cuò)誤。根據(jù) query 中是否有不在詞典中本身就有錯(cuò)誤的詞語 ( Non-word ),可以將 query 錯(cuò)誤類型主要分為 Non-word 和 Real-word 兩類錯(cuò)誤。
其中,Non-word 錯(cuò)誤一般出現(xiàn)在帶英文單詞或數(shù)字的 query 中,由于通過輸入法進(jìn)行輸入,不會(huì)存在錯(cuò)誤中文字的情況,所以中文 query 如果以字作為最小語義單元的話一般只會(huì)存在 Real-word 錯(cuò)誤,而帶英文數(shù)字的 query 則可能存在兩類錯(cuò)誤。下圖對(duì)這兩大類的常見錯(cuò)誤類型進(jìn)行歸類及給出了相應(yīng)的例子。
從原理上,Query 糾錯(cuò)可以用噪音信道模型來理解,假設(shè)用戶本意是搜索 Qreal,但是 query 經(jīng)過噪音信道后引進(jìn)了一定的噪音,此時(shí)糾錯(cuò)過程相當(dāng)于構(gòu)建解碼器將帶有噪音干擾的 query Qnoise 進(jìn)行最大去噪還原成 Qdenoise,使得 Qdenoise≈Qreal。
對(duì)應(yīng)的公式為:
其中 P(Qdenoise) 表示語言模型概率,P(Qnoise|Qdenoise) 表示寫錯(cuò)概率,進(jìn)行糾錯(cuò)一般都是圍繞著求解這兩個(gè)概率來進(jìn)行的。
糾錯(cuò)任務(wù)主要包含錯(cuò)誤檢測和錯(cuò)誤糾正兩個(gè)子任務(wù),其中錯(cuò)誤檢測用于識(shí)別錯(cuò)誤詞語的位置,簡單地可以通過對(duì)輸入 query 進(jìn)行切分后檢查各個(gè)詞語是否在維護(hù)的自定義詞表或挖掘積累的常見糾錯(cuò) pair 中,若不在則根據(jù)字型、字音或輸入碼相近字進(jìn)行替換構(gòu)造候選并結(jié)合 ngram 語言模型概率來判斷其是否存在錯(cuò)誤,這個(gè)方法未充分考慮到上下文信息,可以適用于常見中文詞組搭配、英文單詞錯(cuò)誤等的檢測。進(jìn)一步的做法是通過訓(xùn)練序列標(biāo)注模型的方法來識(shí)別錯(cuò)誤的開始和結(jié)束位置。
至于錯(cuò)誤糾正,即在檢測出 query 存在錯(cuò)誤的基礎(chǔ)上對(duì)錯(cuò)誤部分進(jìn)行糾正的過程,其主要包括糾錯(cuò)候選召回、候選排序選擇兩個(gè)步驟。在進(jìn)行候選召回時(shí),沒有一種策略方法能覆蓋所有的錯(cuò)誤類型,所以一般通過采用多種策略方法進(jìn)行多路候選召回,然后在多路召回的基礎(chǔ)上通過排序模型來進(jìn)行最終的候選排序。
對(duì)于英文單詞錯(cuò)誤、多漏字、前后顛倒等錯(cuò)誤可以通過編輯距離度量進(jìn)行召回,編輯距離表示從一個(gè)字符串變換到另一個(gè)字符串需要進(jìn)行插入、刪除、替換操作的次數(shù),如 "apple" 可能錯(cuò)誤拼寫成 "appel",它們的編輯距離是1。由于用戶的搜索 query 數(shù)一般是千萬甚至億級(jí)別的,如果進(jìn)行兩兩計(jì)算編輯距離的話計(jì)算量會(huì)非常大,為此需要采用一定的方法減小計(jì)算量才行。比較容易想到的做法是采用一些啟發(fā)式的策略,如要求首字 ( 符 ) 一樣情況下將長度小于等于一定值的 query 劃分到一個(gè)桶內(nèi)再計(jì)算兩兩 query 間的編輯距離,此時(shí)可以利用 MapReduce 進(jìn)一步加速計(jì)算。
當(dāng)然這種啟發(fā)式的策略可能會(huì)遺漏掉首字 ( 符 ) 不一樣的 case,如在前面兩個(gè)位置的多漏字、顛倒等錯(cuò)誤。還有的辦法就是利用空間換時(shí)間,如對(duì) query 進(jìn)行 ngram 等長粒度切分后構(gòu)建倒排索引,然后進(jìn)行索引拉鏈的時(shí)候保留相似度 topN 的 query 作為候選。又或者利用編輯距離度量滿足三角不等式 d(x,y)+d(y,z)≥d(x,z) 的特性對(duì)多叉樹進(jìn)行剪枝來減少計(jì)算量。
首先隨機(jī)選取一個(gè) query 作為根結(jié)點(diǎn),然后自頂向下對(duì)所有 query 構(gòu)建多叉樹,樹的邊為兩個(gè)結(jié)點(diǎn) query 的編輯距離。給定一個(gè) query,需要找到與其編輯距離小于等于 n 的所有 query,此時(shí)自頂向下與相應(yīng)的結(jié)點(diǎn) query 計(jì)算編輯距離 d,接著只需遞歸考慮邊值在 d-n 到 d+n 范圍的子樹即可。如下圖所示需要查找所有與 query "十面埋弧"編輯距離小于等于1的 query,由于"十面埋弧"與"十面埋伏"的編輯距離為1,此時(shí)只需考慮邊值在1-1到1+1范圍的子樹,為此"十面埋伏怎么樣"作為根結(jié)點(diǎn)的子樹可以不用繼續(xù)考慮。
對(duì)于等長的拼音字型錯(cuò)誤類型還可以用 HMM 模型進(jìn)行召回,HMM 模型主要由初始狀態(tài)概率、隱藏狀態(tài)間轉(zhuǎn)移概率及隱藏狀態(tài)到可觀測狀態(tài)的發(fā)射概率三部分組成。如下圖所示,將用戶輸入的錯(cuò)誤 query "愛奇義"視為可觀測狀態(tài),對(duì)應(yīng)的正確 query "愛奇藝"作為隱藏狀態(tài),其中正確 query 字詞到錯(cuò)誤 query 字詞的發(fā)射關(guān)系可以通過人工梳理的同諧音、形近字混淆詞表、通過編輯距離度量召回的相近英文單詞以及挖掘好的糾錯(cuò)片段對(duì)得到。
至于模型參數(shù),可以將搜索日志中 query 進(jìn)行采樣后作為樣本利用 hmmlearn、pomegranate 等工具采用 EM 算法進(jìn)行無監(jiān)督訓(xùn)練,也可以簡單地對(duì)搜索行為進(jìn)行統(tǒng)計(jì)得到,如通過 nltk、srilm、kenlm 等工具統(tǒng)計(jì)搜索行為日志中 ngram 語言模型轉(zhuǎn)移概率,以及通過統(tǒng)計(jì)搜索點(diǎn)擊日志中 query-item 及搜索 session 中 query-query 對(duì)齊后的混淆詞表中字之間的錯(cuò)誤發(fā)射概率。訓(xùn)練得到模型參數(shù)后,采用維特比算法對(duì)隱藏狀態(tài)序列矩陣進(jìn)行最大糾錯(cuò)概率求解得到候選糾錯(cuò)序列。
進(jìn)一步地,我們還可以嘗試深度學(xué)習(xí)模型來充分挖掘搜索點(diǎn)擊行為及搜索 session 進(jìn)行糾錯(cuò)候選召回,如采用 Seq2Seq、Transformer、Pointer-Generator Networks 等模型進(jìn)行端到端的生成改寫,通過引入 attention、copy 等機(jī)制以及結(jié)合混淆詞表進(jìn)行受限翻譯生成等優(yōu)化,可以比較好地結(jié)合上下文進(jìn)行變長的候選召回。
另外結(jié)合 BERT 等預(yù)訓(xùn)練語言模型來進(jìn)行候選召回也是值得嘗試的方向,如在 BERT 等預(yù)訓(xùn)練模型基礎(chǔ)上采用場景相關(guān)的無監(jiān)督語料繼續(xù)預(yù)訓(xùn)練,然后在錯(cuò)誤檢測的基礎(chǔ)上對(duì)錯(cuò)誤的字詞進(jìn)行 mask 并預(yù)測該位置的正確字詞。Google 在2019年提出的 LaserTagger 模型則是另辟蹊徑將文本生成建模為序列標(biāo)注任務(wù),采用 BERT 預(yù)訓(xùn)練模型作為 Encoder 基礎(chǔ)上預(yù)測各個(gè)序列位置的增刪留標(biāo)簽,同樣適用于 query 糾錯(cuò)這種糾錯(cuò)前后大部分文本重合的任務(wù)。
另外,愛奇藝在同一年提出的適用于繁簡體中文拼寫檢糾錯(cuò)的 FASPell 模型嘗試在利用 BERT 等預(yù)訓(xùn)練語言模型生成糾錯(cuò)候選矩陣 ( DAE ) 的基礎(chǔ)上結(jié)合生成候選的置信度及字符相似度對(duì)候選進(jìn)行解碼過濾 ( CSD ) 出候選糾錯(cuò)目標(biāo),在中文糾錯(cuò)任務(wù)上也取得了一定進(jìn)展。
在多路召回的基礎(chǔ)上,可以通過從詞法、句法、語義及統(tǒng)計(jì)特征等多個(gè)方面構(gòu)造特征訓(xùn)練 GBDT、GBRank 等排序模型將預(yù)測出最優(yōu)的糾錯(cuò)候選。由于進(jìn)行多路糾錯(cuò)候選召回計(jì)算量相對(duì)比較大且直接進(jìn)行線上糾錯(cuò)會(huì)存在較大的風(fēng)險(xiǎn),可以在離線挖掘好 query 糾錯(cuò) pair 后按搜索 qv 優(yōu)先進(jìn)行對(duì)頭中部 query 進(jìn)行人工審核準(zhǔn)入,然后放到線上存儲(chǔ)供調(diào)用查詢。線上應(yīng)用時(shí),當(dāng) QU 識(shí)別到用戶輸入 query 存在錯(cuò)誤并進(jìn)行相應(yīng)糾錯(cuò)后,對(duì)于不那么置信的結(jié)果可以將糾錯(cuò)結(jié)果透傳給召回側(cè)進(jìn)行二次檢索使用,對(duì)于比較置信的糾錯(cuò)結(jié)果可以直接展示用糾錯(cuò)后 query 進(jìn)行召回的結(jié)果并給到用戶搜索詞確認(rèn)提示 ( 如下圖所示 ),如果糾錯(cuò) query 不是用戶真實(shí)意圖表達(dá)的話,用戶可以繼續(xù)選擇用原 query 進(jìn)行搜索,此時(shí)用戶的反饋行為也可以用于進(jìn)一步優(yōu)化 query 糾錯(cuò)。
Query 擴(kuò)展:
Query 擴(kuò)展,即通過挖掘 query 間的語義關(guān)系擴(kuò)展出和原 query 相關(guān)的 query 列表。Query 列表的結(jié)果可以用于擴(kuò)召回以及進(jìn)行 query 推薦幫用戶挖掘潛在需求,如下圖在百度搜索"自然語言處理"擴(kuò)展出的相關(guān)搜索 query:
搜索場景有豐富的用戶行為數(shù)據(jù),我們可以通過挖掘搜索 session 序列和點(diǎn)擊下載行為中 query 間的語義關(guān)系來做 query 擴(kuò)展。如用戶在進(jìn)行搜索時(shí),如果對(duì)當(dāng)前搜索結(jié)果不滿意可能會(huì)進(jìn)行一次或多次 query 變換重新發(fā)起搜索,那么同一搜索 session 內(nèi)變換前后的 query 一般存在一定的相關(guān)性,為此可以通過統(tǒng)計(jì)互信息、關(guān)聯(lián)規(guī)則挖掘等方法來挖掘搜索 session 序列中的頻繁共現(xiàn)關(guān)系。
或者把一個(gè)用戶搜索 session 序列當(dāng)成文章,其中的每個(gè) query 作為文章的一個(gè)詞語,作出假設(shè):如果兩個(gè) query 有相同的 session 上下文,則它們是相似的,然后通過訓(xùn)練 word2vec、fasttext 等模型將 query 向量化,進(jìn)而可以計(jì)算得到 query 間的 embedding 相似度。
對(duì)于長尾復(fù)雜 query,通過 word2vec 訓(xùn)練得到的 embedding 可能會(huì)存在 oov 的問題,而 fasttext 由于還考慮了字級(jí)別的 ngram 特征輸入進(jìn)行訓(xùn)練,所以除了可以得到 query 粒度的 embedding,還可以得到字、詞粒度的 embedding,此時(shí)通過對(duì)未登錄 query 切詞后的字、詞的 embedding 進(jìn)行簡單的求和、求平均也可以得到 query 的 embedding 表示。還可以參考 WR embedding 的做法進(jìn)一步考慮不同 term 的權(quán)重做加權(quán)求平均,然后通過減去主成分的映射向量以加大不同 query 間的向量距離,方法簡單卻比較有效。
至于搜索點(diǎn)擊下載行為,可以通過構(gòu)建 query-item 的點(diǎn)擊下載矩陣,然后采用協(xié)同過濾或 SVD 矩陣分解等方法計(jì)算 query 之間的相似度,又或者構(gòu)建 query 和 item 之間的二部圖 ( 如下圖示例 ),若某個(gè) query 節(jié)點(diǎn)和 item 節(jié)點(diǎn)之間存在點(diǎn)擊或下載行為則用邊進(jìn)行連接,以 ctr、cvr 或歸一化的點(diǎn)擊下載次數(shù)等作為連接邊的權(quán)重,然后可以訓(xùn)練 swing、simrank/wsimrank++ 等圖算法迭代計(jì)算 query 間的相似度,也可以采用 Graph Embedding 的方法來訓(xùn)練得到 query 結(jié)點(diǎn)間的 embedding 相似度。
更進(jìn)一步地,我們還可以利用搜索點(diǎn)擊下載行為構(gòu)造弱監(jiān)督樣本訓(xùn)練基于 CNN/LSTM/BERT 等子網(wǎng)絡(luò)的 query-item 語義匹配模型得到 query 和 item 的 embedding 表示,如此也可以計(jì)算 query pair 間的 embedding 相似度。對(duì)于將 query 進(jìn)行 embedding 向量化的方法,可以先離線計(jì)算好已有存量 query 的 embedding 表示,然后用 faiss 等工具構(gòu)建向量索引,當(dāng)線上有新的 query 時(shí)通過模型 inference 得到對(duì)應(yīng)的 embedding 表示即可進(jìn)行高效的近鄰向量檢索以召回語義相似的 query。
在給用戶做搜索 query 推薦時(shí),除了上面提到的跟用戶當(dāng)前輸入 query 單點(diǎn)相關(guān) query 推薦之外,還可以結(jié)合用戶歷史搜索行為及畫像信息等來預(yù)測用戶當(dāng)前時(shí)刻可能感興趣的搜索 query,并在搜索起始頁等場景進(jìn)行推薦展示。此時(shí),可以通過 LSTM 等網(wǎng)絡(luò)將用戶在一段 session 內(nèi)的搜索行為序列建模為用戶 embedding 表示,然后可以通過構(gòu)建 Encoder-Decoder 模型來生成 query,或采用語義匹配的方法將用戶 embedding 及 query embedding 映射到同一向量空間中,然后通過計(jì)算 embedding 相似度的方法來召回用戶可能感興趣的 query。
Query 歸一:
Query 歸一和 query 糾錯(cuò)在概念上容易混淆,相較于 query 糾錯(cuò)是對(duì)存在錯(cuò)誤的 query 進(jìn)行糾正,query 歸一則主要起到對(duì)同近義表達(dá)的 query 進(jìn)行語義歸一的作用。一些用戶的 query 組織相對(duì)來說比較冷門,和 item 側(cè)資源的語義相同但文字表達(dá)相差較大,直接用于召回的話相關(guān)性可能會(huì)打折扣,這時(shí)如果能將這些 query 歸一到相對(duì)熱門同義或存在對(duì)應(yīng)資源的 query 會(huì)更容易召回相關(guān)結(jié)果。如將"騰訊臺(tái)球"歸一到"騰訊桌球","華仔啥時(shí)候出生的?"、"劉德華出生年月"、"劉德華什么是出生的"這些 query 都可以歸一到"劉德華出生日期"相對(duì)標(biāo)準(zhǔn)的 query。其中涉及到的技術(shù)主要有同義詞挖掘及語義對(duì)齊替換,如"華仔"對(duì)應(yīng)的同義詞是"劉德華","啥時(shí)候出生的"對(duì)應(yīng)的同義詞是"出生日期"。
同義詞的挖掘是一個(gè)積累的過程,最直接的獲取方式是利用業(yè)界已經(jīng)有一些比較有名的知識(shí)庫,如英文版本的 WordNet、中文版本的知網(wǎng) HowNet、哈工大的同義詞詞林等,或者可以利用一些開放的中文知識(shí)圖譜 ( 如:OpenKG、OwnThink 等 ) 或從抓取百度/維基百科站點(diǎn)數(shù)據(jù)然后提取出其中的別名、簡稱等結(jié)構(gòu)化信息直接獲得,對(duì)于百科中無結(jié)構(gòu)化數(shù)據(jù)可以簡單通過一些模板規(guī)則 ( 如:"XX俗稱XX"、"XX又名XX"等 ) 來提取同義詞。同時(shí),還可以在知識(shí)庫中已有同義詞種子的基礎(chǔ)上通過一些方法進(jìn)一步擴(kuò)充同義詞,如韓家煒老師團(tuán)隊(duì)提出的通過構(gòu)建分類器來判斷實(shí)體詞是否屬于某個(gè)同義詞簇的方法來進(jìn)一步擴(kuò)充同義詞集。
除了利用結(jié)構(gòu)化數(shù)據(jù)或規(guī)則模板,還可以在構(gòu)造平行語料基礎(chǔ)上通過語義對(duì)齊的方式來挖掘同義詞。對(duì)于搜索場景來說,可以通過挖掘豐富的行為數(shù)據(jù)來構(gòu)造平行語料,如利用搜索 session 行為相關(guān)語料訓(xùn)練無監(jiān)督的 word2vec、wordrank 等詞向量模型來衡量詞語間的相似度,不過這些模型更多是學(xué)習(xí)詞語間在相同上下文的共現(xiàn)相似,得到的相似度高的詞語對(duì)不一定是同義詞,有可能是同位詞、上下位詞甚至是反義詞,此時(shí)需要通過引入監(jiān)督信號(hào)或外部知識(shí)來優(yōu)化詞向量,如有方法提出通過構(gòu)建 multi-task 任務(wù)在預(yù)測目標(biāo)詞的同時(shí)預(yù)測目標(biāo)詞在句子中表示的實(shí)體類型以加入實(shí)體的語義信息來提升詞向量之間的語義相似性。
進(jìn)一步地,還可以利用前面介紹的二部圖迭代、深度語義匹配、Seq2Seq 翻譯生成等 query 擴(kuò)展方法從搜索點(diǎn)擊弱監(jiān)督行為中先挖掘出語義表達(dá)相近的 query-query、item-item 或 query-item 短語對(duì),然后再將語義相近的 query/item 短語對(duì)進(jìn)行語義對(duì)齊,對(duì)齊的話可以采用一些規(guī)則的方法,也可以采用傳統(tǒng)的統(tǒng)計(jì)翻譯模型如 IBM-M2 進(jìn)行對(duì)齊,語義對(duì)齊后從中抽取出處于相同或相近上下文中的兩個(gè)詞語作為同義詞對(duì)候選,然后結(jié)合一些統(tǒng)計(jì)特征、詞語 embedding 相似度以及人工篩選等方式進(jìn)行過濾篩選。
考慮到同一個(gè)詞語在不同的上下文中可能表達(dá)不同的語義,同義詞語間的關(guān)系也是上下文相關(guān)的,此時(shí)如果通過對(duì)齊挖掘粗粒度的同義片段對(duì)能進(jìn)一步消除歧義。線上對(duì) query 進(jìn)行歸一時(shí),則和離線同義詞挖掘的過程相反,對(duì) query 進(jìn)行分詞后讀取線上存儲(chǔ)的同義詞表做同義詞候選替換,對(duì)替換網(wǎng)格進(jìn)行對(duì)齊生成候選 query,最后通過結(jié)合語言模型概率及在當(dāng)前上下文的替換概率或者構(gòu)造特征訓(xùn)練 GBDT 等模型的方式對(duì)候選 query 進(jìn)行排序得到最終的歸一 query。
② 搜索聯(lián)想詞
聯(lián)想詞,顧名思義,就是對(duì)用戶輸入 query 進(jìn)行聯(lián)想擴(kuò)展,以減少用戶搜索輸入成本及輸錯(cuò)可能,能比較好地提升用戶搜索體驗(yàn)。聯(lián)想結(jié)果主要以文本匹配為主,文本匹配結(jié)果不足可以輔以語義召回結(jié)果提升充盈率??紤]到用戶在輸入搜索 query 時(shí)意圖相對(duì)明確,一般會(huì)從左到右進(jìn)行 query 組織,為此基于這個(gè)啟發(fā)式規(guī)則,目前聯(lián)想詞中文本匹配召回又以前綴匹配優(yōu)先。
雖然聯(lián)想詞涉及的是技術(shù)主要是簡單的文本匹配,在匹配過程中還需要考慮效率和召回質(zhì)量,同時(shí)中文輸入可能會(huì)有拼音輸入的情況 ( 如上圖所示 ) 也需要考慮。由于用戶在搜索框中輸入每一個(gè)字時(shí)都會(huì)發(fā)起一起請(qǐng)求,聯(lián)想詞場景的請(qǐng)求 pv 是非常大的。為加速匹配效率,可以通過對(duì)歷史搜索 query 按 qv 量這些篩選并預(yù)處理后分別構(gòu)建前后綴 trie 樹用于對(duì)用戶線上輸入的 query 進(jìn)行前綴及中后綴匹配召回,然后對(duì)召回的結(jié)果進(jìn)行排序,如果是僅簡單按 qv 降序排序,可以在 trie 樹結(jié)點(diǎn)中存放 qv 信息并用最小堆等結(jié)構(gòu)進(jìn)行 topK 召回。
當(dāng)然僅按 qv 排序還不夠,比如可能還需要考慮用戶輸入上文 query 后對(duì)推薦的下文 query 的點(diǎn)擊轉(zhuǎn)化、下文 query 在結(jié)果頁的點(diǎn)擊轉(zhuǎn)化以及 query 的商業(yè)化價(jià)值等因素。同時(shí)一些短 query 召回的結(jié)果會(huì)非常多,線上直接進(jìn)行召回排序性能壓力較大,為此可以先通過離線召回并進(jìn)行粗排篩選,再將召回結(jié)果寫到一些 kv 數(shù)據(jù)庫如 redis、共享內(nèi)存等存儲(chǔ)供線上直接查詢使用。離線召回的話,可以采用 AC 自動(dòng)機(jī)同時(shí)進(jìn)行高效的前中后綴匹配召回。AC 自動(dòng)機(jī) ( Aho-Corasic ) 是基于 trie 數(shù) + KMP 實(shí)現(xiàn)的多模匹配算法,可以在目標(biāo)文本中查找多個(gè)模式串的出現(xiàn)次數(shù)以及位置。此時(shí),離線召回大致的流程是:
從歷史搜索 query 中構(gòu)造前綴 sub-query,如 query "酷我音樂"對(duì)應(yīng)的 sub-query 有中文形式的"酷"、"酷我"、"酷我音"、"酷我音樂"及拼音字符串 "ku"、"kuwo" 等,同時(shí)可以加上一些專名實(shí)體或行業(yè)詞,如應(yīng)用垂搜中的"音樂"、"視頻"等功能需求詞;
利用所有的 sub-query 構(gòu)建 AC 自動(dòng)機(jī);
利用構(gòu)建的 AC 自動(dòng)機(jī)對(duì)歷史搜索 query 及其拼音形式分別進(jìn)行多模匹配,從中匹配出所有的前中后綴 sub-query,進(jìn)而得到 <sub-query,query> 召回候選。
按照一定策略 ( 一般在前綴基礎(chǔ)上 ) 進(jìn)行候選粗排并寫到線上存儲(chǔ)。
線上來一個(gè)請(qǐng)求 sub-query,直接查詢存儲(chǔ)獲取召回結(jié)果,然后再基于訓(xùn)練的 pctr 預(yù)估模型或 pcpm 商業(yè)化導(dǎo)向進(jìn)行重排,此時(shí)可以通過引入用戶側(cè)、context 側(cè)等特征實(shí)現(xiàn)個(gè)性化排序。
7. 意圖識(shí)別
搜索意圖識(shí)別是 QU 最重要卻也最具挑戰(zhàn)的模塊,存在的難點(diǎn)主要有:
用戶輸入 query 不規(guī)范:由于用戶先驗(yàn)知識(shí)的差異,必然導(dǎo)致用戶在通過自然語言組織表達(dá)同一需求時(shí)千差萬別,甚至可能會(huì)出現(xiàn) query 表達(dá)錯(cuò)誤、遺漏等情況;
歧義性&多樣性:用戶的搜索 query 表達(dá)不夠明確帶來的意圖歧義性或用戶本身搜索意圖存在多樣性,比如:搜索 query "擇天記"可能是想下載仙俠玄幻類游戲,可能是玄幻小說類 app,也可能是想看擇天記電視劇而下視頻類 app。此時(shí)衍生出來的另一個(gè)問題是當(dāng)某個(gè) query 存在多個(gè)意圖可能時(shí),需要合理地量化各個(gè)意圖的需求強(qiáng)度;
如何根據(jù)用戶及其所處 context 的不同實(shí)現(xiàn)個(gè)性化意圖,比如用戶的性別、年齡不同,搜索同一 query 的意圖可能不一樣,用戶當(dāng)前時(shí)刻搜索 query 的意圖可能和上一時(shí)刻搜索 query 相關(guān)等。
根據(jù)用戶意圖明確程度的差別,搜索意圖識(shí)別又可以細(xì)分為精準(zhǔn)意圖和模糊意圖識(shí)別。
① 精準(zhǔn)意圖
所謂精準(zhǔn)意圖,是指用戶通過 query 所表達(dá)的意圖已經(jīng)非常明確了,其需求可以比較置信地鎖定為一個(gè)資源目標(biāo)。精準(zhǔn)意圖需求在垂直搜索中尤為常見,以應(yīng)用市場 app 搜索為例,用戶搜索 query "下載王者榮耀"很明確就是想下載"王者榮耀" app,這時(shí)候?qū)?王者榮耀"展現(xiàn)在結(jié)果列表首位才合理。當(dāng)然一般排序模型擬合足夠好的情況下也能將對(duì)應(yīng)的精準(zhǔn)資源排在首位,但是以下一些情況可能會(huì)引起排序不穩(wěn)定進(jìn)而導(dǎo)致對(duì)應(yīng)精準(zhǔn)資源沒能置頂在首位的問題:
長尾 query 行為特征稀疏,模型學(xué)習(xí)不夠充分;
引入用戶個(gè)性化特征,排序結(jié)果因人而異;
以商業(yè)化為導(dǎo)向的排序影響相關(guān)性體驗(yàn)。為此,需要一定策略識(shí)別出精準(zhǔn)首位意圖并將它們高優(yōu)置頂,同時(shí)可以通過直達(dá)區(qū)產(chǎn)品形態(tài)給用戶快速直達(dá)需求的搜索體驗(yàn)。
對(duì)于垂直搜索來說,精準(zhǔn)意圖一般是給定一個(gè) query,找到與其意圖精準(zhǔn)對(duì)應(yīng)的 item,可以通過文本匹配和 top 后驗(yàn)轉(zhuǎn)化篩選出候選 item,然后通過從文本匹配、行為反饋、語義相似等方向構(gòu)造樣本特征訓(xùn)練 GBDT 等模型對(duì) <query,item> 樣本 pair 進(jìn)行是否精準(zhǔn)二分類。也可以嘗試類似 DSSM 的語義匹配網(wǎng)絡(luò)對(duì) query 和 item 進(jìn)行語義匹配。對(duì)于長尾 query 且完全文本包含 item 的情況,由于行為量不夠豐富利用分類模型可能無法召回且直接進(jìn)行文本匹配提取可能存在歧義性,此時(shí)可以視為 NER 任務(wù)通過訓(xùn)練 BiLSTM-CRF、BERT-CRF 等序列標(biāo)注模型進(jìn)行 item 實(shí)體的識(shí)別,再結(jié)合一些啟發(fā)性策略及后驗(yàn)行為進(jìn)行驗(yàn)證。
在 Google、百度等通用搜索中,用戶可能會(huì)輸入一些知識(shí)問答型的 query,此時(shí)用戶的意圖也比較明確,就是問題對(duì)應(yīng)的答案。如搜索 query "劉德華的妻子是誰",通過召回帶"劉德華"、"妻子"字樣的網(wǎng)頁,用戶估計(jì)也能找到答案,但如果能直接給出這個(gè) query 的答案的話體驗(yàn)會(huì)更好,如下面百度搜索給出的結(jié)果。
這時(shí)候可以歸為 QA 問答任務(wù)來處理,一般需要結(jié)合知識(shí)圖譜來做,也即 KBQA ( Knowledge Based Question Answer )。傳統(tǒng)的的 KBQA 做法是先對(duì) query 進(jìn)行詞法句法以及語義解析,識(shí)別出其中的主要實(shí)體概念,再基于這些主題概念構(gòu)造相應(yīng)的查詢邏輯表達(dá)式去知識(shí)庫中進(jìn)行查詢及推理得到想要的答案。之后陸續(xù)有提出將問題和知識(shí)庫中候選答案映射成分布式向量進(jìn)行匹配,以及利用 CNN、LSTM、記憶網(wǎng)絡(luò)等模型對(duì)應(yīng)問題及候選答案向量建模優(yōu)化等方法來進(jìn)行 KBQA。
2. 模糊意圖
模糊意圖就是指用戶的搜索意圖不會(huì)具體到某個(gè)目標(biāo)資源,而是代表一類或多類意圖,比如用戶搜索"視頻app",此時(shí)沒有明確想下某款 app,可將其泛化到"視頻類" tag 意圖。模糊意圖識(shí)別一般可以采用基于模板規(guī)則、行為統(tǒng)計(jì)反饋、分類模型等方法,這里主要會(huì)從意圖分類及槽位解析兩個(gè)方向進(jìn)行闡述。
意圖分類:
在構(gòu)建 query 意圖分類模型之前,需要先制定一套意圖標(biāo)簽體系用于全面覆蓋用戶意圖需求。這里需要對(duì) query 側(cè)和 item 側(cè)的標(biāo)簽體系進(jìn)行統(tǒng)一以便于在預(yù)測出某個(gè) query 的意圖 tag 分布后直接用 tag 去倒排索引中召回屬于這些 tag 的 item。
由于搜索 query 一般相對(duì)來說長度較短且意圖存在多樣性,意圖分類可以歸結(jié)為短文本多標(biāo)簽分類任務(wù)。在意圖分類樣本構(gòu)造方面,可以通過關(guān)聯(lián)用戶搜索點(diǎn)擊行為分布及進(jìn)行 item 理解獲得的 tag 或站點(diǎn)所屬行業(yè)分類信息等自動(dòng)構(gòu)造樣本,對(duì)于可能存在的樣本類別不平衡的問題,需要對(duì)樣本進(jìn)行重降采樣等處理,或采用主動(dòng)學(xué)習(xí)等方法進(jìn)行高效的樣本標(biāo)注。
至于模型方面,傳統(tǒng)的文本分類主要采用向量空間模型 VSM 或進(jìn)行其他特征工程來表征文本,然后用貝葉斯、SVM、最大熵等機(jī)器學(xué)習(xí)模型進(jìn)行訓(xùn)練預(yù)測。隨著 Word2vec、GloVe、Fasttext 等分布式詞向量技術(shù)的興起,打破了傳統(tǒng) NLP 任務(wù)需要做大量特征工程的局面,通過分布式向量對(duì)文本進(jìn)行表示后再接入其它網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行端到端分類訓(xùn)練的做法成為了主流。
如采用比較簡單又實(shí)用的淺層網(wǎng)絡(luò)模型 Fasttext,F(xiàn)asttext 是從 Word2vec 衍生出來的,架構(gòu)和 Word2vec 的類似,核心思想是將整篇文檔的詞及 n-gram 向量疊加平均得到文檔向量,然后使用文檔向量做 softmax 多分類。相對(duì) Word2vec 的優(yōu)點(diǎn)是輸入層考慮了字符級(jí) ngram 特征可以一定程度解決 oov 問題以及輸出層支持進(jìn)行有監(jiān)督的任務(wù)學(xué)習(xí)。使用 Fasttext 訓(xùn)練簡單,且線上 inference 性能也很高,但也正因?yàn)椴捎孟鄬?duì)簡單的淺層網(wǎng)絡(luò)結(jié)構(gòu)其準(zhǔn)確率也相對(duì)較低。為此,進(jìn)一步地可以嘗試一些深度神經(jīng)網(wǎng)絡(luò)模型,如:TextRNN、TextCNN、Char-CNN、BiLSTM+Self-Attention、RCNN、C-LSTM、HAN、EntNet、DMN 等。
這些模型通過 CNN/RNN 網(wǎng)絡(luò)結(jié)構(gòu)提煉更高階的上下文語義特征以及引入注意力機(jī)制、記憶存儲(chǔ)機(jī)制等可以有效地優(yōu)化模型的分類準(zhǔn)確率。其實(shí),對(duì)于 query 短文本分類來說采用相對(duì)簡單的 TextRNN/TextCNN 網(wǎng)絡(luò)結(jié)構(gòu)就已經(jīng)能達(dá)到較高的準(zhǔn)確率了,其中 TextRNN 通過使用 GRU/LSTM 編碼單元能更好地捕獲詞序和較長長度的上下文依賴信息,但由于采用 RNN 網(wǎng)絡(luò)訓(xùn)練耗時(shí)相對(duì)較長。TextCNN 則主要通過不同 size 的卷積核捕獲不同局部窗口內(nèi)的 ngram 組合特征,然后一般通過 max-pooling 或 kmax-pooling 保留變長文本中一個(gè)或多個(gè)位置的最強(qiáng)特征轉(zhuǎn)換為固定長度的向量再做 sigmoid/softmax 分類。
同時(shí)為進(jìn)一步提升網(wǎng)絡(luò)性能及加速模型收斂,還可以在網(wǎng)絡(luò)中進(jìn)一步考慮 dropout 及 batch normalize 等防過擬合機(jī)制,以及考慮在輸入層融入 Word2vec、GloVe、Fastext 等模型預(yù)訓(xùn)練得到的 embedding,如下圖在 cnn 輸入層中加入預(yù)訓(xùn)練 embedding 組成雙通道輸入。雖然 TextCNN 對(duì)于捕獲長程依賴信息方面會(huì)不如 TextRNN,考慮到 query 一般長度相對(duì)較短所以影響相對(duì)還好,而且其訓(xùn)練速度及在線 inference 性能也都比較符合要求。
除了從零開始訓(xùn)練或引入無監(jiān)督預(yù)訓(xùn)練的隱式 embedding 表示,還可以通過引入顯式的知識(shí)概念進(jìn)一步豐富文本的語義表達(dá),在有比較豐富的領(lǐng)域知識(shí)庫的情況下進(jìn)行 NER 實(shí)體識(shí)別,然后在模型的輸入中可以融入這些實(shí)體知識(shí)特征,通過引入外部知識(shí)來優(yōu)化分類的模型有 KPCNN、STCKA 等。由于 Word2vec、GloVe 等模型訓(xùn)練得到的詞語 embedding 對(duì)不同的上下文來說都是固定的,無法解決一詞多義等問題,基于此陸續(xù)提出的 ELMO、GPT、BERT 等深度預(yù)訓(xùn)練語言模型漸漸成為了 NLP 任務(wù)的標(biāo)配,這些模型及其各種演進(jìn)版本在多個(gè) GLUE 基準(zhǔn)中均取得了進(jìn)一步的突破。
通過在大規(guī)模語料上預(yù)訓(xùn)練得到的 BERT 等模型能較好地動(dòng)態(tài)捕獲詞語在不同上下文中的前后向語義表達(dá),基于這些預(yù)訓(xùn)練模型在意圖分類任務(wù)上進(jìn)行 finetune 學(xué)習(xí)能進(jìn)一步提升模型分類準(zhǔn)確率。同樣地,像 ERNIE 等模型通過引入外部知識(shí)也能進(jìn)一步提升模型效果,尤其在一些垂直搜索有較多特定領(lǐng)域?qū)嶓w的情況下,可以嘗試將這些領(lǐng)域?qū)嶓w知識(shí)融入模型預(yù)訓(xùn)練及 finetune 過程中。由于 BERT 等模型復(fù)雜度較高,進(jìn)行在線 inference 時(shí)耗時(shí)也相對(duì)較高可能達(dá)不到性能要求,為此需要在模型精度和復(fù)雜度上做個(gè)權(quán)衡,從模型剪枝、半精度量化、知識(shí)蒸餾等方向進(jìn)行性能優(yōu)化。這里可以嘗試通過權(quán)重分解及參數(shù)共享等方法精簡優(yōu)化的 ALBERT 模型,也可以嘗試諸如 DistilBERT、TinyBERT 等知識(shí)蒸餾學(xué)習(xí)模型。
槽位解析:
前面介紹的各種基于深度學(xué)習(xí)模型的意圖分類能起到比較好相關(guān)性導(dǎo)航的作用,如將 query 意圖劃分到"天氣"、"酒店"、"汽車"等意圖體系中。但是針對(duì)更加復(fù)雜的口語化 query,我們需要進(jìn)行識(shí)別提取出 query 中重要的意圖成分以進(jìn)行更全面的意圖理解,此時(shí)僅進(jìn)行意圖分類是不夠的。比如對(duì)于搜索 query "北京飛成都的機(jī)票",意圖分類模型可以識(shí)別出是"訂機(jī)票"的意圖,但是無法區(qū)分出 query 中的出發(fā)地和目的地信息,需要通過一定方法識(shí)別出"出發(fā)地"概念及其對(duì)應(yīng)值是"北京"、"目的地"概念及其對(duì)應(yīng)值是"成都",基于此可以作出一些決策提供更直觀的結(jié)果以提升用戶搜索體驗(yàn)。
由于自然語言表達(dá)充滿著歧義性,計(jì)算機(jī)肯定是無法直接理解的,需要將 query 表示成計(jì)算機(jī)能夠理解的表示。類似于計(jì)算機(jī)語言無法理解高級(jí)編程語言一樣,需要通過將高級(jí)編程語言代碼編譯成低級(jí)的匯編或二進(jìn)制代碼后計(jì)算機(jī)才能執(zhí)行。所以我們也需要一個(gè)類似的"編譯器"能將 query 按一定文法規(guī)則進(jìn)行確定性的形式化表示,可以將這個(gè)過程稱之為語義解析,前面提到的傳統(tǒng) KBQA 的做法也需要該技術(shù)將 query 轉(zhuǎn)換成相應(yīng)的形式化表示才能進(jìn)一步執(zhí)行推理等操作。
對(duì)于 query "北京飛成都的機(jī)票",通過意圖分類模型可以識(shí)別出 query 的整體意圖是訂機(jī)票,在此基礎(chǔ)上進(jìn)一步語義解析出對(duì)應(yīng)的出發(fā)地 Depart="北京",到達(dá)地 Arrive="成都",所以生成的形式化表達(dá)可以是:Ticket=Order(Depart,Arrive),Depart={北京},Arrive={成都}。如果 query 換成是"成都飛北京的機(jī)票",同樣的需要解析出 query 的意圖是訂機(jī)票,但是出發(fā)地和到達(dá)地互換了,所以語義解析過程需要除了需要對(duì)概念進(jìn)行標(biāo)注識(shí)別,還可以通過對(duì)概念進(jìn)行歸一來提高泛化性,比如這里"北京"、"成都"都可以歸一為 [city] 概念,形式化表達(dá)變?yōu)椋篢icket=Order(Depart,Arrive),Depart={city},Arrive={city},其中 city={北京、上海、成都…}。
形式化表達(dá)可以遞歸地定義為一些子表達(dá)式的組合的形式,為進(jìn)行語義解析,最主要的是確定一種形式化語言及對(duì)應(yīng)的解析器,通常我們采用確定的上下文無關(guān)文法以確保形式化的每一部分都對(duì)應(yīng)有一個(gè)解析樹。得到 query 對(duì)應(yīng)的形式化表示后,還可以進(jìn)行一些解析樹歸并等形式化運(yùn)算推演。為此,除了可以用來理解搜索 query 的結(jié)構(gòu)化語義,語義解析技術(shù)也廣泛應(yīng)用于 QA 問答及聊天機(jī)器人中,如多輪對(duì)話中比較有挑戰(zhàn)的上下文省略和指代消歧問題也可以一定程度通過將下文 query 對(duì)應(yīng)的解析樹合并變換到上文 query 對(duì)應(yīng)的解析樹中來解決。如下圖例子所示,當(dāng)用戶在第一輪對(duì)話詢問"成都明天氣溫?"時(shí)構(gòu)造出相應(yīng)的解析樹,接著問"后天如何?"時(shí)就可以將日期進(jìn)行替換后合并到之前的解析樹中。
目前學(xué)術(shù)界和工業(yè)界在形式化語言和語義解析器方面均有一定的研究成果,通過一些基于統(tǒng)計(jì)、半監(jiān)督、監(jiān)督的方法來訓(xùn)練得到語義解析器,其中比較有名的開源語義解析器有 Google 的 SLING、SyntaxNet。簡單的做法是通過人工制定的正則表達(dá)式和槽位解析的方法來進(jìn)行語義解析,正則表達(dá)式相對(duì)好理解,槽位解析是指通過將具有相同模式的 query 歸納成模板,基于模板規(guī)則來解析用戶 query 意圖及意圖槽位值。模板構(gòu)成主要包括:槽位詞、固定詞、函數(shù)、通配符,其形式化表達(dá)變?yōu)橹胁畚辉~是指能抽象到某一概念的詞語集合,如:"北京"、"上海"、"成都"這些詞都可以抽象到城市概念,固定詞也即明確的某個(gè)詞語,可以通過函數(shù)來匹配一些諸如數(shù)字組合等詞,通配符可以匹配任意字符。
我們需要結(jié)合領(lǐng)域的業(yè)務(wù)知識(shí)來構(gòu)造模板,構(gòu)造過程需要保證模板符合語法句式規(guī)范,同時(shí)盡量保證其泛化性以覆蓋更多的 query 問法。舉個(gè)簡單例子,構(gòu)造模板:"適合[Slot:User][Wild:0-10][Slot:AppType]"及相應(yīng)的槽位詞 [Slot:User]={女生,男生,小孩,老人,…}、[Slot:AppType]={單機(jī)游戲,益智游戲,moba游戲,…},然后通過構(gòu)建如下圖所示的相應(yīng) trie 樹,可以自上而下遍歷及回溯解析出 query "適合女生玩的單機(jī)游戲"匹配上了這個(gè)模板,從而識(shí)別出 query 整體意圖是詢問女生類單機(jī)游戲,其中用戶槽位值為"女生",app 類型槽位值為"單機(jī)游戲","適合"是固定詞,"玩的"匹配通配符 [Wild:0-10],基于這些槽位解析的結(jié)果,接下來可以進(jìn)行一系列的決策。
槽位解析方法的優(yōu)點(diǎn)是準(zhǔn)確率高,可控性強(qiáng),解釋性好,但缺點(diǎn)是需要耗費(fèi)較多地人力進(jìn)行對(duì)模板及槽位詞等進(jìn)行標(biāo)注,同時(shí)維護(hù)起來也比較麻煩??梢钥紤]結(jié)合一些策略方法來一定程度減少人工標(biāo)注量,如基于前面提到的同義詞挖掘技術(shù)及詞向量化挖掘同位/上下位詞等方法來輔助槽位詞的標(biāo)注,以及在人工進(jìn)行模板標(biāo)注的基礎(chǔ)上采用 bootstrapping 迭代挖掘構(gòu)造出更多的模板。槽位解析的具體實(shí)現(xiàn)可以參考的開源項(xiàng)目 Snips-nlu,進(jìn)行意圖識(shí)別的同時(shí)從自然語言句子中解析提取結(jié)構(gòu)化槽位信息。
8. 敏感識(shí)別
敏感識(shí)別模塊主要對(duì) query 進(jìn)行是否帶有色情、反動(dòng)、賭博、暴力等敏感話題的識(shí)別,如果識(shí)別出 query 中存在敏感話題可以進(jìn)行定向改寫到相對(duì)合適的 query 或者給用戶做搜索引導(dǎo)提示等處理。敏感識(shí)別可以歸為分類問題,最簡單的做法就是詞表匹配,按不同的敏感話題人工輸入一批詞庫,復(fù)雜點(diǎn)就訓(xùn)練一個(gè)分類模型進(jìn)行多分類,傳統(tǒng)的 SVM、最大熵分類或者 TextCNN、TextRNN 等模型都能比較好地 work。
9. 時(shí)效性分析
用戶的搜索需求可能會(huì)顯式或隱式地帶有一定的時(shí)效性要求,如:"最近上映的好看電影"帶有顯式的時(shí)間詞"最近",而"疫情進(jìn)展"則隱式地表達(dá)了解最新情況的需求。時(shí)效性大概可以分為三種:持續(xù)時(shí)效性,周期時(shí)效性,準(zhǔn)/實(shí)時(shí)時(shí)效性。其中持續(xù)時(shí)效性是指 query 一直具有時(shí)效性,如:"美食推薦",周期時(shí)效性是指具有周期性、季節(jié)性的事件或需求,如:"世界杯"、用戶在冬季搜索"上衣"等,而準(zhǔn)/實(shí)時(shí)效性是指近期發(fā)生或突然發(fā)生的事件。
通過分析出 query 的時(shí)效性需求等級(jí)的不同,在召回 item 時(shí)就可以針對(duì)性地做一些過濾或者在排序時(shí)進(jìn)行時(shí)效性調(diào)權(quán)。其中顯式的時(shí)效性需求因?yàn)閹в袝r(shí)間關(guān)鍵詞,可以通過規(guī)則匹配或訓(xùn)練分類模型進(jìn)行判斷識(shí)別,而隱式表達(dá)的時(shí)效性則可以通過按時(shí)間維度分析歷史搜索 qv 行為、實(shí)時(shí)監(jiān)測最新搜索 qv 變化情況以及綜合考慮搜索意圖及當(dāng)前時(shí)間上下文等方法來判斷識(shí)別。
03
結(jié)語
人工智能的發(fā)展是循序漸進(jìn)的,需要經(jīng)歷從計(jì)算智能到記憶智能、感知智能、認(rèn)知智能,最終到達(dá)創(chuàng)造智能等多個(gè)發(fā)展階段才能稱得上是真正的人工智能。目前業(yè)界在計(jì)算、記憶和感知方面已經(jīng)做得相對(duì)比較成熟,但是在認(rèn)知智能方面則還需要有進(jìn)一步突破,而 NLP 恰好是實(shí)現(xiàn)認(rèn)知智能最重要的一環(huán),為此 NLP 也被稱為人工智能皇冠上的一顆明珠。同樣地,真正的語義搜索也遠(yuǎn)未到來,對(duì) query 的語義理解能力很大程度決定著整個(gè)搜索的智能程度。本文僅為個(gè)人在進(jìn)行 query 理解相關(guān)優(yōu)化項(xiàng)目的一些簡單總結(jié),主要從搜索的角度對(duì) query 理解涉及的各個(gè)重要模塊的概念及其對(duì)應(yīng)的一些方法進(jìn)行闡述。文中暫未涉及太深的技術(shù)探討,希望能幫助到大家對(duì)搜索 QU 相關(guān)概念有一個(gè)初步的認(rèn)識(shí),起到拋磚引玉的效果,如有錯(cuò)誤及不足之處,還請(qǐng)不吝交流指出。