機器學習基礎——搜索引擎的原理和架構


機器學習基礎——搜索引擎的原理和架構

談及機器學習,大家想必會有許多聯想,比如最近火熱的人工智能,再比如戰勝李世石的AlphaGo,甚至還會有人聯想起駭客帝國或者是機械公敵等經典機器人電影。


機器學習基礎——搜索引擎的原理和架構


但實際上目前機器學習雖然應用廣泛,但是在各大互聯網公司當中,最主要的應用場景變化並不大。基本上還是延續從前的三板斧——搜索、推薦、廣告。今天,我們就來聊聊其中的大頭——搜索。搜索算法在互聯網公司最大的用戶就是搭建搜索引擎,而搜索引擎幾乎是各大互聯網公司的標配,無論是電商、社區還是社交軟件,都離不開搜索引擎的身影。BAT三家當中的百度,當年正是憑藉的高質量的中文搜索引擎,才一躍成為中國最大的互聯網公司之一。

機器學習基礎——搜索引擎的原理和架構

雖然搜索引擎非常重要,也和我們的生活息息相關,但是即使是互聯網從業者,瞭解它的原理結構的也很少。在瞭解具體的搜索算法之前,不妨讓我們先來熟悉一下搜索引擎的架構。看看GitHub當中那些單槍匹馬實現搜索引擎的大牛們, 究竟做了一件怎樣的事情。


機器學習基礎——搜索引擎的原理和架構


這是一個簡易版的搜索引擎架構,原諒我的靈魂畫風。

搜索引擎的功能主要分為兩個部分,第一個部分是爬蟲相關,第二個部分是搜索和排序。我們將這兩個部分分開,分別介紹。


機器學習基礎——搜索引擎的原理和架構


首先是爬蟲部分,即上圖當中左邊的部分。


爬蟲也有些地方稱為蜘蛛,本質上是一個自動訪問互聯網的程序。我們都知道互聯網當中的網頁千千萬萬,想要靠人工去一個一個蒐集是不現實的。所以爬蟲就是代替人工去瀏覽互聯網的程序,每當發現一個新的網站,就會把網站的內容抓取下來,存儲起來。

這裡有一個問題,爬蟲怎麼知道互聯網當中網站的地址呢?

主要靠的是網站之間的聯繫,比如A網站當中的內容有指向B網站的鏈接,那麼在爬取完A網站之後,爬蟲會順著當中的內容,去爬取B網站。如果B網站又有指向很多其他網站,那麼爬蟲會順著依次訪問。存儲在內容當中的鏈接就像是蛛絲一樣,將各個網頁鏈接起來,爬蟲就像是蜘蛛,在裡面移動。

我們日常看到的網站內容非常豐富,既有文本,也有圖片還有視頻等多媒體。但是我們都知道,當今的網站的基礎是HTML,即超文本標記語言,比如我打開百度,顯示網頁源代碼的話會顯示以下內容:


機器學習基礎——搜索引擎的原理和架構


也就是說在爬蟲程序的眼裡,所有的網頁都只是文本,連圖片或者是視頻在HTML裡也只是以標籤或者是鏈接的形式存在。我們也都看得出來,這一段文本雜亂無章,人眼很難看得出來當中都有什麼信息。這樣的文本當然是不能直接使用的,還需要進行文本處理。


這裡的處理主要包括兩個步驟,第一個步驟是清洗HTML標籤,只保留關鍵的文本信息。經過這一個步驟之後,文本的內容會大大壓縮。比如百度的首頁如果進行去標籤處理,剩下的應該只有“百度一下,馬上知道”以及搜索欄下方几篇文章的標題。


文本處理的第一個步驟比較簡單,Python當中有非常成熟的HTML分析的工具,第二個步驟則要複雜得多。當我們拿到了網頁的文本之後,我們下一步要做的是提取網頁的關鍵詞,並處理成索引進行存儲。

說起來一句話就足夠描述,但實際並不容易。對於中文而言,需要提取關鍵詞,首先需要分詞。比如“百度一下”,這四個字當中其實暗含了“百度”和”一下“兩個詞語。如果我們不進行分詞,那麼只有用戶輸入”

百度一下“這四個字才能搜索到百度的網頁,這顯然是不合理的。但是中文和英文不同,詞語和詞語之間沒有空格分開,所以需要用文本算法來進行分詞。這個問題目前通過機器學習來實現,還沒有完美的解法。


機器學習基礎——搜索引擎的原理和架構


有了文本分詞的結果之後,只會保留當中的一些關鍵詞進行存儲。存儲的時候,除了會存儲網頁-關鍵詞這個正向信息之外,其實還會存儲關鍵詞-網頁的反向信息。在存儲中心,網頁是按照

關鍵詞聚集的。每個關鍵詞會對應一個網站的列表,所有含有這個關鍵詞的網站都會被存在這個列表當中。這樣當用戶搜索關鍵詞的時候,就可以根據關鍵詞直接找到對應的網站了。


機器學習基礎——搜索引擎的原理和架構


如圖,在搜索引擎當中,北京

大學是兩個關鍵詞,分別對應一系列包含這個關鍵詞的網站。假設從前系統當中沒有北京大學的官網,最近剛剛被爬蟲抓到。由於北大的官網中有北京和大學兩個關鍵詞,所以在進行存儲的時候,系統會將北京大學這個網址添加進北京和大學兩個關鍵詞對應的列表當中。這樣,無論我們搜索北京還是大學,都可以召回北京大學這個網站。


當然無論我們搜索北京還是大學,召回的內容都非常多,並不一定能夠返回北京大學。當我們搜索北京大學的時候,搜索引擎會同時召回北京和大學這兩個關鍵詞的網站,之後會做交集。選出既含有北京又含有大學的網站,進行返回,這樣就一定可以返回北京大學的官網了。

除了爬蟲之外,搜索引擎另一個重要的部分是用戶端的服務,即是架構圖中的右邊部分。


機器學習基礎——搜索引擎的原理和架構


在我們瞭解了存儲中心的原理之後,整個流程其實已經很清楚了。簡單來說只做了兩件事情,一件是召回,另一件是排序

召回顧名思義,就是通過用戶輸入的關鍵詞去存儲中心找出這些關鍵詞對應搜索結果。再對這些結果做交集,找出匹配度最高的內容。


由於存儲的數據量非常大,要處理的內容很多,並且對系統性能的要求很高(用戶的耐心是有限的)。所以在召回階段,不可能處理得非常細緻,是在粗粒度上篩選出基本符合要求的內容。


機器學習基礎——搜索引擎的原理和架構


雖然每次我們百度的時候,它都會告訴我們搜索到了數以百萬計甚至更多的結果,但是實際上真正通過粗排召回來的,可能只有一兩千條。 既然有粗排,那麼自然也有精排。其實也很好理解,經過了粗排,數據從數千萬減少到了一兩千。

機器學習基礎——搜索引擎的原理和架構


接下來要做的就是對這一兩千條數據進行進一步排序。排序的主要依據往往不止一個,首要的當然是

匹配度,如果返回的網站和用戶的訴求不匹配,顯然會損傷用戶體驗,甚至導致用戶流失。所以無論什麼搜索引擎,質量永遠是第一位。之後的依據各個引擎均有所不同,有些網站可能更加看重收益,所以會把收錢多的網站擺在前面,有些網站則更看重權威,會把熱度比較高的,或者是比較官方的網站置頂。經過一系列的調整和過濾之後,結果才會真正返回給用戶。


到這裡,整個搜索引擎的架構就介紹完了。就單從架構來看,這個系統並不算複雜。在電商網站當中,比這個複雜的系統比比皆是。但是由於搜索引擎是互聯網的入口,承載的流量巨大,並且對於性能的要求極高,使得整個系統當中存在大量的優化,實際上的系統要複雜和困難得多。

我們拋開難度不談,仔細分析這個架構,其實會發現一點有趣的地方。比如,我有時候在想,為什麼中文的搜索引擎最早做得最好的是百度呢?


後來我瞭解到李彥宏最早是北大圖書館學出身,再一看這個搜索引擎的架構和索引的結構, 不就和圖書管理一模一樣嗎?


機器學習基礎——搜索引擎的原理和架構


在搜索引擎出現之前,圖書館中的書籍也是根據類別、關鍵字以及作者進行歸類存放的。這樣在檢索的時候,才可以快速地找到相應的書籍。這個思想計算機出現之前就已經非常成熟了,如果我們更換一下概念,把互聯網當中的網頁當做是書籍,把網頁的title當做是書籍的標題,正文當中的關鍵字當做是書籍的關鍵字,那麼搜索網頁和搜索書籍的技術在思想上其實是相通的。那麼當年圖書館學出身的李彥宏在學了計算機之後,想到在互聯網世界當中應用圖書檢索的技術,也就水到渠成了。


看來一個人能有多大的成就,除了個人奮鬥之外,果然也要看歷史的進程。


分享到:


相關文章: