一、背景
地圖App的功能可以簡單概括為定位,搜尋,導航三部分,分别解決在哪裡,去哪裡,和怎麼去的問題。高德地圖的搜尋場景下,輸入的是,地理相關的檢索query,使用者位置,App圖面等資訊,輸出的是,使用者想要的POI。如何能夠更加精準地找到使用者想要的POI,提高滿意度,是評價搜尋效果的最關鍵名額。
一個搜尋引擎通常可以拆分成query分析、召回、排序三個部分,query分析主要是嘗試了解query表達的含義,為召回和排序給予指導。
地圖搜尋的query分析不僅包括通用搜尋下的分詞,成分分析,同義詞,糾錯等通用NLP技術,還包括城市分析,wherewhat分析,路徑規劃分析等特定的意圖了解方式。
常見的一些地圖場景下的query意圖表達如下:

query分析是搜尋引擎中政策密集的場景,通常會應用NLP領域的各種技術。地圖場景下的query分析,隻需要處理地理相關的文本,多樣性不如網頁搜尋,看起來會簡單一些。但是,地理文本通常比較短,并且使用者大部分的需求是唯一少量結果,要求精準度非常高,如何能夠做好地圖場景下的文本分析,并提升搜尋結果的品質,是充滿挑戰的。
二、整體技術架構
搜尋架構
類似于通用檢索的架構,地圖的檢索架構包括query分析,召回,排序三個主要部分。先驗的,使用者的輸入資訊可以了解為多種意圖的表達,同時下發請求嘗試擷取檢索結果。後驗的,拿到每種意圖的檢索結果時,進行綜合判斷,選擇效果最好的那個。
query分析流程
具體的意圖了解可分為基礎query分析和應用query分析兩部分,基礎query分析主要是使用一些通用的NLP技術對query進行了解,包括分析,成分分析,省略,同義詞,糾錯等。應用query分析主要是針對地圖場景裡的特定問題,包括分析使用者目标城市,是否是where+what表達,是否是從A到B的路徑規劃需求表達等。
整體技術演進
在地裡文本處理上整體的技術演進經曆了規則為主,到逐漸引入機器學習,到機器學習全面應用的過程。由于搜尋子產品是一個高并發的線上服務,對于深度模型的引入有比較苛刻的條件,但随着性能問題逐漸被解決,我們從各個子方向逐漸引入深度學習的技術,進行新一輪的效果提升。
NLP領域技術在最近幾年取得了日新月異的發展,bert,XLNet等模型相繼霸榜,我們逐漸統一化各個query分析子任務,使用統一的向量表示對進行使用者需求進行表達,同時進行seq2seq的多任務學習,在效果進一步提升的基礎上,也能夠保證系統不會過于臃腫。
本文就高德地圖搜尋的地理文本處理,介紹相關的技術在過去幾年的演進。我們将選取一些點分上下兩篇進行介紹,上篇主要介紹搜尋引擎中一些通用的query分析技術,包括糾錯,改寫和省略。下篇着重介紹地圖場景中特有query分析技術,包括城市分析,wherewhat分析,路徑規劃。
三、通用query分析技術演進
3.1 糾錯
在搜尋引擎中,使用者輸入的檢索詞(query)經常會出現拼寫錯誤。如果直接對錯誤的query進行檢索,往往不會得到使用者想要的結果。是以不管是通用搜尋引擎還是垂直搜尋引擎,都會對使用者的query進行糾錯,最大機率獲得使用者想搜的query。
在目前的地圖搜尋中,約有6%-10%的使用者請求會輸入錯誤,是以query糾錯在地圖搜尋中是一個很重要的子產品,能夠極大的提升使用者搜尋體驗。
在搜尋引擎中,低頻和中長尾問題往往比較難解決,也是糾錯子產品面臨的主要問題。另外,地圖搜尋和通用搜尋,存在一個明顯的差異,地圖搜尋query結構化比較突出,query中的片段往往包含一定的位置資訊,如何利用好query中的結構化資訊,更好地識别使用者意圖,是地圖糾錯獨有的挑戰。
- 常見錯誤分類
(1) 拼音相同或者相近,例如: 盤橋物流園-潘橋物流園
(2) 字形相近,例如: 河北冒黎-河北昌黎
(3) 多字或者漏字,例如: 泉州州頂街-泉州頂街
- 糾錯現狀
原始糾錯子產品包括多種召回方式,如:
拼音糾錯:主要解決短query的拼音糾錯問題,拼音完全相同或者模糊音作為糾錯候選。
拼寫糾錯:也叫形近字糾錯,通過周遊替換形近字,用query熱度過濾,加入候選。
組合糾錯:通過翻譯模型進行糾錯替換,資源主要是通過query對齊挖掘的各種替換資源。
組合糾錯翻譯模型計算公式:
其中p(f)是語言模型,p(f|e)是替換模型。
問題1:召回方式存在缺陷。目前query糾錯子產品主要召回政策包括拼音召回、形近字召回,以及替換資源召回。對于低頻case,解決能力有限。
問題2:排序方式不合理。糾錯按照召回方式分為幾個獨立的子產品,分别完成相應的召回和排序,不合理。
- 技術改造
改造1:基于空間關系的實體糾錯
原始的糾錯主要是基于使用者session挖掘片段替換資源,是以對于低頻問題解決能力有限。但是長尾問題往往集中在低頻,是以低頻問題是目前的痛點。
地圖搜尋與通用搜尋引擎有個很大的差別在于,地圖搜尋query比較結構化,例如北京市朝陽區阜榮街10号首開廣場。我們可以對query進行結構化切分(也就是地圖中成分分析的工作),得到這樣一種帶有類别的結構化描述,北京市【城市】朝陽區【區縣】阜榮街【道路】10号【門址字尾】首開廣場【通用實體】。
同時,我們擁有權威的地理知識資料,利用權威化的地理實體庫進行字首樹+字尾樹的索引建庫,提取疑似糾錯的部分在索引庫中進行拉鍊召回,同時利用實體庫中的邏輯隸屬關系對糾錯結果進行過濾。實踐表明,這種方式對低頻的區劃或者實體的錯誤有着明顯的作用。
基于字根的字形相似度計算
上文提到的排序政策裡面通過字形的編輯距離作為排序的重要特征,這裡我們開發了一個基于字根的字形相似度計算政策,對于編輯距離的計算更為細化和準确。漢字資訊有漢字的字根拆分詞表和漢字的筆畫數。
将一個漢字拆分成多個字根,尋找兩個字的公共字根,根據公共字根筆畫數來計算連個字的相似度。
-
改造2:排序政策重構
原始的政策召回和排序政策耦合,導緻不同的召回鍊路,存在顧此失彼的情況。為了能夠充分發揮各種召回方式的優勢,急需要對召回和排序進行解耦并進行全局排序優化。為此我們增加了排序子產品,将流程分為召回和排序兩階段。
模型選擇
對于這個排序問題,這裡我們參考業界的實踐,使用了基于pair-wise的gbrank進行模型訓練。
樣本建設
通過線上輸出結合人工review的方式構造樣本。
特征建設
(1) 語義特征。如統計語言模型。
(2) 熱度特征。pv,點選等。
(3) 基礎特征。編輯距離,切詞和成分特征,累積分布特征等。
這裡解決了糾錯子產品兩個痛點問題,一個是在地圖場景下的大部分低頻糾錯問題。另一個是重構了子產品流程,将召回和排序解耦,充分發揮各個召回鍊路的作用,召回方式更新後隻需要重訓排序模型即可,使得子產品更加合理,為後面的深度模型更新打下良好的基礎。後面在這個架構下,我們通過深度模型進行seq2seq的糾錯召回,取得了進一步的收益。
3.2 改寫
糾錯作為query變換的一種方式的召回政策存在諸多限制,對于一些非典型的query變換表達,存在政策的空白。比如query=永城市新農合辦,目标POI是永城市新農合服務大廳。使用者的低頻query,往往得不到較好搜尋效果,但其實使用者描述的語義與主poi的高頻query是相似的。
這裡我們提出一種query改寫的思路,可以将低頻query改寫成語義相似的高頻query,以更好地滿足使用者需求多樣性的表達。
這是一個從無到有的實作。使用者表達的query是多樣的,使用規則表達顯然是難以窮盡的,直覺的思路是通過向量的方式召回,但是向量召回的方式很可能出現泛化過多,不适應地圖場景的檢索的問題,這些都是要在實踐過程中需要考慮的問題。
方案
整體看,方案包括召回,排序,過濾,三個階段。
- 召回階段
地理文本處理技術在高德的演進(上)
我們調研了句子向量表示的幾種方法,選擇了算法簡單,效果和性能可以和CNN,RNN媲美的SIF(Smooth Inverse Frequency)。向量召回可以使用開源的Faiss向量搜尋引擎,這裡我們使用了阿裡内部的性能更好的的向量檢索引擎。
-
排序階段
樣本建構
原query與高頻query候選集合,計算語義相似度,選取語義相似度的TOPK,人工标注的訓練樣本。
1.基礎文本特征
2.編輯距離
3.組合特征
使用xgboost進行分數回歸
過濾階段
通過向量召回的query過度泛化非常嚴重,為了能夠在地圖場景下進行應用,增加了對齊模型。使用了兩種統計對齊模型giza和fastalign,實驗證明二者效果幾乎一緻,但fastalign在性能上好于giza,是以選擇fastalign。
通過對齊機率和非對齊機率,對召回的結果進行進一步過濾,得到精度比較高的結果。
query改寫填補了原始query分析子產品中一些低頻表達無法滿足的空白,差別于同義詞或者糾錯的顯式query變換表達,句子的向量表示是相似query的一種隐式的表達,有其相應的優勢。
向量表示和召回也是深度學習模型逐漸開始應用的嘗試。同義詞,改寫,糾錯,作為地圖中query變換主要的三種方式,以往在地圖子產品裡比較分散,各司其職,也會有互相重疊的部分。在後續的疊代更新中,我們引入了統一的query變換模型進行改造,在取得收益的同時,也擺脫掉了過去很多規則以及模型耦合造成的曆史包袱。
3.2 省略
在地圖搜尋場景裡,有很多query包含無效詞,如果用全部query嘗試去召回很可能不能召回有效結果。如廈門市搜"湖裡區縣後高新技術園新捷創營運中心11樓1101室 縣後brt站"。這就需要一種檢索意圖,在不明顯轉義下,使用核心term進行召回目标poi候選集合,當搜尋結果無果或者召回較差時起到補充召回的作用。
在省略判斷的過程中存在先驗後驗平衡的問題。省略意圖是一個先驗的判斷,但是期望的結果是能夠進行POI有效召回,和POI的召回字段的現狀密切相關。如何能夠在政策設計的過程中保持先驗的一緻性,同時能夠在後驗POI中拿到相對好的效果,是做好省略子產品比較困難的地方。
原始的省略子產品主要是基于規則進行的,規則依賴的主要特征是上遊的成分分析特征。由于基于規則拟合,模型效果存在比較大的優化空間。另外,由于強依賴成分分析,模型的魯棒性并不好。
省略子產品的改造主要完成了規則到crf模型的更新,其中也離線應用了深度學習模型輔助樣本生成。
識别出來query哪些部分是核心哪些部分是可以省略的,是一個序列标注問題。在淺層模型的選型中,顯而易見地,我們使用了crf模型。
term特征。使用了賦權特征,詞性,先驗詞典特征等。
成分特征。仍然使用成分分析的特征。
統計特征。統計片段的左右邊界熵,城市分布熵等,通過分箱進行離散化。
項目一期我們使用了使用線上政策粗标,外包細标的方式,構造了萬級的樣本供crf模型訓練。
但是省略query的多樣性很高,使用萬級的樣本是不夠的,線上上模型無法快速應用深度模型的情況下,我們使用了boostraping的方式,借助深度模型的泛化能力,離線構造了大量樣本。
使用了這種方式,樣本從萬級很容易擴充到百萬級,我們仍然使用crf模型進行訓練和線上應用。
在省略子產品,我們完成了規則到機器學習的更新,引入了成分以外的其他特征,提升了模型的魯棒性。同時并且利用離線深度學習的方式進行樣本構造的循環,提升了樣本的多樣性,使得模型能夠更加接近crf的天花闆。
在後續深度模型的模組化中,我們逐漸擺脫了對成分分析特征的依賴,對query到命中poi核心直接進行模組化,建構大量樣本,取得了進一步的收益。