探索Weotta搜索引擎背后的大數據技術
本地化搜索(簡稱“本地搜”)是一個重要的網絡信息檢索工具,提供本地化的生活導航 服務,在國內外都有成熟的產品面市。從本質上來看,本地搜是通用搜索引擎技術的垂直化產品(垂直搜索),提供更加精細化的搜索服務,對信息抽取、分類、數 據規范化等流程提出更高要求。Weotta是一家基于機器學習和搜索技術的科技公司,成立于舊金山,2011年正式提供服務。Weotta稱其提供的搜索 為“深度搜索”,雖有跟風“深度學習”之嫌,本文甘愿冒險嘗個鮮,探一探它的“深度”。
當我們準備發布Weotta時,我們已經為如何描述它犯了難。我們處理大數據嗎?是的。我們使用了機器學習和自然語言處理嗎?是的。可以叫它搜索引擎嗎?當然。但是,我們想總和要大于部分。
我們最終覺得“深度搜索”是對我們工作最貼切的描述,它是一個超越了基本文本搜索的復雜搜索系統 的簡潔描述。無需贅言,不管怎么看,我們都不是這個領域唯一的一家公司;谷歌和很多其他公司都在對深度搜索的各個方面進行研究。但是還沒有人創造出一個與 我們的產品十分相像的深度搜索系統。我們的搜索技術可以處理各種標準文本搜索引擎無法理解的日常查詢。
基本搜索
文本搜索引擎,如Sphinx或Lucene/Solr,均使用了分面過濾技術(注1):每篇文 檔都有一組“字段”(注2),通常表示成一個XML格式的文件,且各個字段都建立索引。給定一個搜索查詢詞以及可選的側面選擇參數,系統可以從文檔集合迅 速檢索到目標文檔和字段(建議讀者閱讀《信息檢索導論》了解具體的實現細節)。
在文本索引時,通常可以指定建立索引的字段,每個字段都有各自的權重。比如,如果選擇給文檔標題字段很大的權重,而賦予文檔文本字段的權值較小,則標題中含搜索詞的文檔,要比只在文本字段包含此搜索詞的文檔得到更高的分值。
為了檢索建立索引的文檔,你可以使用類似于SQL檢索語句的搜索檢索字符串。通常,在搜索語句中存在特殊的語法以控制搜索引擎決定檢索哪些文檔時的行為。比如,你可以明確哪些單詞是必須的,哪些單詞是可選的,或單詞相距多遠。
現在,所有這些對于程序員和技術用戶都不成問題,但對于一般消費者,它并不理想。他們甚至不想知道是否存在特殊語法,更別提使用了。謝天謝地,深度搜索檢索引擎卓越的檢索詞解析和自然語言理解能力使特殊語法成為多余。
分面提供了過濾搜索結果的方法。分面搜索可以在字段中尋找一個具體的值,或者更復雜的如確定日 期、時間范圍或確定與一個給定點的距離。通常,分面不影響文檔的分值,但是會減少返回的文檔數目。由于分面搜索通常會啟動一個搜索/瀏覽接口的組合,也稱 “分面導航”。一個基本的搜索系統,若提供分面搜索,一般都是通過復選框、下拉列表或相似控件實現。eBay就是一個完美的例子,它提供許多分面以深入挖 掘和過濾搜索結果。相比而言,深度搜索系統將分面搜索移至后臺進行。
這些文本搜索引擎很強大,但在深度搜索的背景下,實際上只是一種別樣的數據庫。文本搜索與深度搜 索均使用索引優化檢索過程。文本搜索使用特殊的格式化查詢字串與分面說明檢索數據,而非使用SQL執行檢索。雖說SQL數據庫經過優化可以存儲基于列或基 于行的數據,但是文本搜索引擎經過優化,可以使用倒排索引(注3)存儲普通文本數據。不管哪一種方法,從開發人員的角度來看,均屬于底層數據存儲方法,都 有最適合的使用場景。
高級搜索
雖然高級搜索系統在最底層使用一個文本搜索引擎,但是會集成一些額外的排名信號。一個突出的例子 就是谷歌的PageRank算法,它組合了文本搜索、關鍵詞相關性、網站權威度及許多其它便于對搜索結果排序的信號。基本的文本搜索引擎僅使用單個文檔的 信息和文檔集合的統計信息,高級搜索系統還考慮譬如信用、流行度和鏈接強度等外部信號。比如亞馬遜允許用戶按照平均評分或流行度對結果排序。但是這還算不 上深度搜索,因為它只是在控制搜索結果的排序方面更強一些,對數據或檢索語句還沒有更深的了解。
深度搜索
我相信深度搜索滿足如下四個基本要求:
- 簡單的搜索輸入。它意味著深度搜索具有對檢索語句的自然語言理解(NLU)能力,使得系統底層能夠明白應該調用哪項側面選擇。
- 多類目搜索。如果用戶只搜索一樣東西,搜索系統相對比較簡單。但是如果搜索中包含多個變量,用戶也沒有給出明確的側面選擇,就需要深度搜索根據NLU技術確定用戶在搜索什么,以及如何搜索到它。深度搜索還要能夠高效地、自動地將多個數據集融合到一個系統。
- 特征工程以實現深度數據理解。與流行觀點不同,只有大數據還不夠。你擁有海量數據并不定說你就掌握了能夠洞察數據的方法。我們可以拿冰山打個很好的比方:用戶看到的只是冰山一角,而冰山的大部分卻藏在水面下。這里數據是冰山,特征工程則是解決如何讓水下冰山現形,展示給用戶,使其看到最佳搜索結果。
- 情景理解。你對用戶了解的越多,則你就掌握了更多調整搜索結果的知識。情景理解就意味著要知道用戶的地理位置,他們過去的搜索歷史,或者他們顯性的偏好信息。情景是王!
當今許多搜索系統不符合這些要求的任何一條。有些只是實現了一條或兩條,但是很少同時符合所有要 求。Siri根據設備情景,并使用NLU技術理解檢索語句。但是,Siri并非真正地進行搜索,而是將檢索請求轉發給另外一個應用或搜索引擎執行。谷歌與 Weotta均符合所有要求,但是實現、方法及應用范圍不同。
如何搭建一個深度搜索系統呢?深度搜索與簡單文本搜索相同,都存在兩個重要環節:索引和查詢。下圖是從深度搜索角度對兩者的一個概括。
深度索引
深度搜索需要對數據的深度理解:它是什么,它怎么樣,它對什么有益以及如何將其轉換成機器可以理解的一種格式。這里舉幾個例子:
- 位置要有地址和地理方位點信息
- 產品要有重量和尺寸信息
- 電影要有演員和導演信息
我們一得到底層數據結構,則立即將其轉化為適于文本和側面索引的文檔結構。但是,深度搜索也需要特征工程發揮作用的深層知識和理解。我們必須仔細思考,用戶可能執行何種搜索以及他們對搜索結果期望的質量如何。然后,我們還須確定如何將其轉化為可索引的文檔特征。
關于這種想法,我們這里給出兩個例子。
假設有一家賣雞翅的飯店。那么,雞翅怎么樣?有多少人喜歡有多少人不喜歡?它賣的雞翅是本城最好吃的嗎?諸如此類的問題可以通過一項基于目錄的情感分析技術回答。
一場演唱會可能只是一次性事件,但是樂隊以前的演出內容可能不同于今日。人們是否喜歡以前的演出?樂隊粉絲呈現什么樣的人口分布?演唱會會場如何?要回答這些問題,可能需要組合多個數據集,以建立樂隊在不同會場演出間的交叉聯系。
深度索引就是回答這類問題,將答案轉化成適于排名和(或)過濾搜索結果的過程。這可能會涉及到應 用數據科學、線性回歸或情感分析。由于問題及其答案有賴于數據特征、用戶所需結果類型,目前還沒有特定的方法。但是,我們可以使用適當的技術,從而獲得對 數據前所未有的理解。比如,我們可以使用潛在情感分析技術,發掘數據隱含特征,從而可以處理基本文本索引不可能處理的檢索語句。實現對數據的深入理解,自 然水到渠成。引用佩德羅·多明格斯在《機器學習那些事(注4)》一文中的原話:
“機器學習初學者常常會驚奇地發現在一個機器學習項目中,真正用于機器學習的時間少得可憐。但是,當你考慮到數據收集、集成、清洗和預處理何等耗時,特征設計要經歷一輪一輪不斷試錯,就會釋然了。”
“項目70%的時間用于特征工程,20%的時間則耗費在為算法確定一個合適的、全面的度量標準,而只有10%的時間用在算法選擇和調優。”
特征工程的一個主要部分是獲取更多數據及質量更好的數據。我們需要大量的多樣化的數據集得到必要 的上下文信息。Weotta處理的數據,包括用戶的地理信息、人口特征、興趣點(Point Of Interest,POI)信息和位置數據庫,以及社交網絡。但是,我們還需要深度理解如何集成和關聯數據,應用哪種機器學習算法,最重要的是,需要理解 哪些問題提及到它以及可以回答哪些問題。所有這些都需要設計出一個可以自動實現的集成系統。谷歌研究主管彼特·諾維格說:“我們只是擁有更多的數據,還沒 有設計出更好的算法。”
在Weotta,我們相信高質量數據是最重要的,因此投入大量精力濾除噪聲數據以抽取有意義的信號。對于任何重要的特征工程,其大部分工作實際上就是數據清洗。畢竟,投入的是垃圾,產出的也是垃圾(注5)。
我們還需要一個自動流程以實現連續學習。當數據進來時集成以后,系統應當自動改善。佩德羅·多明格斯說:“機器學習不是一個創建數據集和啟動學習器的一次性過程,它是一個不斷啟動學習器、分析結果、修改數據和(或)學習器的循環過程。”
在此過程,人也是重要的一部分。在幾乎每個層面上,我們必須都能夠將人的知識和經驗融合到數據管道。這種恰到好處的平衡與人機組合,決定了深度搜索系統的真正潛能和適應變化的能力。
深度查詢
雖然我們已經獲得深度數據驅動的深度索引,還需有效地使用它。簡單的文本查詢是不夠的。為了得到正確的結果,我們需要準確領悟用戶的搜索意圖。它涉及到查詢解析和自然語言理解技術。
在Weotta,我們已經投入大量時間,細化查詢解析以處理如“哪一家餐廳適合我的周年紀念日”或“本周末哪有音樂會演出,我約了人”之類的查詢語句。其他搜索系統的查詢解析能力存在差別:Siri可識別單詞Call加一個名字,而谷歌知識圖譜卻可以識別維基百科上幾乎所有的實體。
如果我們已經解析查詢詞,并知曉搜索意圖,下一步就是檢索結果。由于我們實現的是多類目搜索,因此需要查詢多個索引。在這一點上,自然語言理解能力尤為可貴,因為我們需要知道每個索引支持的查詢參數類型,從而系統可以對查詢詞進行智能切分。
但是,當我們檢索不同類型的信息時,那么如何將其組織到一個結果集合?怎么對不同類的事物進行排名呢?這些都是接口設計和用戶體驗方面的重要問題。谷歌使用結果頁面的不同區塊顯示不同類型的結果,如谷歌地圖和知識圖譜。
我們認為Weotta使用的卡片展示有很大意義。我們在移動端使用一個棧,在電腦端則使用五張以 上排成一排的卡片顯示結果。為何這樣做呢?這種表示方法從視覺效果上來看,可以讓用戶每次重點瀏覽少數幾條結果,并允許我們顯示多類目結果。這樣,人們可 以搜索晚餐飲品與電影,而看到三類不同的搜索結果,所有結果均混到一起。
還記得前面提到的側面選擇嗎?在深度搜索中,雖然側面選擇對用戶隱藏不可見,但是它們對于查詢引 擎仍然重要。根據檢索詞,查詢解析器使用自然語言理解技術,而非依賴顯式復選框決定使用哪個側面選擇。這種決定也可以由數據和產品的性質來驅動。在 Weotta中,當我們知道一個檢索語句涉及到食物時,我們使用一個側面選擇將結果限定于餐館方面的條目。谷歌卻不同,雖然他們或許知道一個檢索語句中包 含食品方面的單詞,由于他們的數據是如此的豐富龐大,他們不能或者不愿為顯示何種類型搜索結果做出清晰的決策,所以人們常常看到混在一起的搜索結果。比 如,我試著用谷歌搜索“壽司”,除了一個網頁列表,我還看到一個本地餐廳的長列表、一張地圖和一個知識圖譜方盒。由于Weotta專注于本地搜索并且理解 用戶,我們知道你正在尋找“壽司店”,這就是我們為你提供的服務。使用Weotta的深度搜索,用戶可以搜索更為具體的對象,搜到“可以吃到濱地壽司的餐 廳”相關結果。
深度查詢語句理解的另外一個關鍵因素是“情景”:誰在搜索?他們在哪?現在什么時間?天氣怎樣?他們過去搜索了什么?他們的親人朋友是誰?他們給出的顯性偏好是什么?他們的隱形偏好是什么?
這些問題的答案會對搜索結果產生重大影響。如果我們知道一個人在紐約,那么我們就不會將其他地方的信息或發生在其他地方的事顯示給他/她。如果外邊正在下雨,我們會顯示室內活動或周邊地方相關結果。如果我們知道一個人討厭垃圾食品,就不會顯示麥當勞的結果給他/她。
所謂“愛屋及烏”,朋友喜歡什么你可能也會跟著喜歡。它可能不是一個強信號,但是幾乎每個人都看 重“社會認同”。此外,人們常與朋友和家人一起做事,如果將他們的偏好都考慮進來,我們也許能夠找到更多的相關結果。事實上,如果你使用臉譜賬號注冊 Weotta,就可以搜索到你的朋友喜歡的地方或事件。
總結
深度搜索系統從如下幾個方面超越基本的文本搜索和高級搜索:
- 沒有顯性的側面選擇
- 多類目搜索
- 深度特征工程
- 情景
為了實現這些要求,我們需要利用自然語言理解、機器學習和大數據技術。實現時需要做的工作,比想象的要多得多,但好處也不言而喻:你可以通過一個簡單的接口進行自然語言查詢,并可搜索到更相關更加個性化的搜索結果。
備注
- 分面過濾(Faceted Filtering),又稱分面搜索(Faceted Search)。所謂分面(Facet)實際上就是事物的多維屬性,如一部電影的導演、演員、類型等分面。分面搜索通過事物的多維屬性對不斷篩選、過濾搜 索結果的一種搜索方法,可視為搜索和瀏覽的結合。
- 字段(Field)方便文檔(如網頁等)的存儲和索引,比如在全文檢索引擎Lucene中,將文檔劃分成標題、正文、摘要等字段,并且可以設置各個字段的存儲、索引狀態,還可以設置每個字段的權重,稱作Boost,以方便文檔評分與排名。
- 倒排索引(Inverted Index)是搜索引擎最重要的一個模塊。搜索引擎使用分詞工具將文檔切分成多個詞的集合(又稱“詞袋”),詞(中文的“詞語”或“單字”,英文的“單 詞”)是文檔的基本表示單元,由文檔到詞袋的映射就是建立正排索引(Forward Index)的過程。我們還可以根據所有文檔中的詞,建立從詞到文檔的映射關系,這就是倒排索引。在用戶提交檢索語句后,經過分詞處理后,由詞定位所有出 現該詞的文檔,并使用相關的排名算法對文檔進行排名。
- 《機器學習那些事》(A Few Useful Things to Know about Machine Learning)中文譯名借鑒劉知遠的翻譯版本,感謝譯者的貢獻。但是,本文對佩德羅·多明格斯在《機器學習那些事》中的表述文字是本文譯者的獨立工作。
- 投入的是垃圾,產出的也是垃圾(garbage in, garbage out),常譯作“垃圾進垃圾出”是一個常見的計算機術語,模仿“先進先出”(FIFO)的翻譯。本文譯者直接使用本意,方便多數讀者理解。
譯者:HorseHour原文作者:JACOB PERKINS via:譯言網