1、背景算法
地圖App的功能能夠簡單歸納爲定位,搜索,導航三部分,分別解決在哪裏,去哪裏,和怎麼去的問題。高德地圖的搜索場景下,輸入的是,地理相關的檢索query,用戶位置,App圖面等信息,輸出的是,用戶想要的POI。如何可以更加精準地找到用戶想要的POI,提升滿意度,是評價搜索效果的最關鍵指標。api
一個搜索引擎一般能夠拆分紅query分析、召回、排序三個部分,query分析主要是嘗試理解query表達的含義,爲召回和排序給予指導。session
地圖搜索的query分析不只包括通用搜索下的分詞,成分分析,同義詞,糾錯等通用NLP技術,還包括城市分析,wherewhat分析,路徑規劃分析等特定的意圖理解方式。架構
常見的一些地圖場景下的query意圖表達以下:併發
query分析是搜索引擎中策略密集的場景,一般會應用NLP領域的各類技術。地圖場景下的query分析,只須要處理地理相關的文本,多樣性不如網頁搜索,看起來會簡單一些。可是,地理文本一般比較短,而且用戶大部分的需求是惟一少許結果,要求精準度很是高,如何可以作好地圖場景下的文本分析,並提高搜索結果的質量,是充滿挑戰的。2、總體技術架構框架
搜索架構相似於通用檢索的架構,地圖的檢索架構包括query分析,召回,排序三個主要部分。先驗的,用戶的輸入信息能夠理解爲多種意圖的表達,同時下發請求嘗試獲取檢索結果。後驗的,拿到每種意圖的檢索結果時,進行綜合判斷,選擇效果最好的那個。機器學習
query分析流程具體的意圖理解可分爲基礎query分析和應用query分析兩部分,基礎query分析主要是使用一些通用的NLP技術對query進行理解,包括分析,成分分析,省略,同義詞,糾錯等。應用query分析主要是針對地圖場景裏的特定問題,包括分析用戶目標城市,是不是where+what表達,是不是從A到B的路徑規劃需求表達等。高併發
總體技術演進在地裏文本處理上總體的技術演進經歷了規則爲主,到逐步引入機器學習,到機器學習全面應用的過程。因爲搜索模塊是一個高併發的線上服務,對於深度模型的引入有比較苛刻的條件,但隨着性能問題逐漸被解決,咱們從各個子方向逐步引入深度學習的技術,進行新一輪的效果提高。性能
NLP領域技術在最近幾年取得了突飛猛進的發展,bert,XLNet等模型相繼霸榜,咱們逐步統一化各個query分析子任務,使用統一的向量表示對進行用戶需求進行表達,同時進行seq2seq的多任務學習,在效果進一步提高的基礎上,也可以保證系統不會過於臃腫。學習
本文就高德地圖搜索的地理文本處理,介紹相關的技術在過去幾年的演進。咱們將選取一些點分上下兩篇進行介紹,上篇主要介紹搜索引擎中一些通用的query分析技術,包括糾錯,改寫和省略。下篇着重介紹地圖場景中特有query分析技術,包括城市分析,wherewhat分析,路徑規劃。
3、通用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核心直接進行建模,構建大量樣本,取得了進一步的收益。