數學之美系列五 -- 簡單之美:布爾代數和搜索引擎的索引

Google (谷歌)中國的博客網誌,走近我們的產品、技術和文化

數學之美系列五 -- 簡單之美:布爾代數和搜索引擎的索引

<script language=javascript> uT("time114722733511630150"); </script>


[建立一個搜索引擎大致需要做這樣幾件事:自動下載儘可能多的網頁;建立快速有效的索引;根據相關性對網頁進行公平準確的排序。我們在介紹 Google Page Rank (網頁排名) 時已經談到了一些排序的問題,這裏我們談談索引問題,以後我們還會談如何度量網頁的相關性,和進行網頁自動下載。]

世界上不可能有比二進制更簡單的計數方法了,也不可能有比布爾運算更簡單的運算了。儘管今天每個搜索引擎都宣稱自己如何聰明、多麼智能化,其實從根本上講都沒有逃出布爾運算的框框。

布爾(George Boole) 是十九世紀英國一位小學數學老師。他生前沒有人認爲他是數學家。布爾在工作之餘,喜歡閱讀數學論著、思考數學問題。1854 年“思維規律”(An Investigation of the Laws of Thought, on which are founded the Mathematical Theories of Logic and Probabilities)一書,第一次向人們展示瞭如何用數學的方法解決邏輯問題。

布爾代數簡單得不能再簡單了。運算的元素只有兩個1 (TRUE, 真) 和 0
(FALSE,假)。基本的運算只有“與”(AND)、“或” (OR) 和“非”(NOT) 三種(後來發現,這三種運算都可以轉換成“與”“非” AND-NOT一種運算)。全部運算只用下列幾張真值表就能完全地描述清楚。

AND | 1 0
-----------------------
1 | 1 0
0 | 0 0
這張表說明如果 AND 運算的兩個元素有一個是 0,則運算結果總是 0。如果兩個元素都是 1,運算結果是 1。例如,“太陽從西邊升起”這個判斷是假的(0),“水可以流動”這個判斷是真的(1),那麼,“太陽從西邊升起並且水可以流動”就是假的(0)。

OR | 1 0
-----------------------
1 | 1 1
0 | 1 0
這張表說明如果OR運算的兩個元素有一個是 1,則運算結果總是 1。如果兩個元素都是 0,運算結果是 0。比如說,“張三是比賽第一名”這個結論是假的(0),“李四是比賽第一名”是真的(1),那麼“張三或者李四是第一名”就是真的(1)。

NOT |
--------------
1 | 0
0 | 1
這張表說明 NOT 運算把 1 變成 0,把 0 變成 1。比如,如果“象牙是白的”是真的(1),那麼“象牙不是白的”必定是假的(0)。

讀者也許會問這麼簡單的理論能解決什麼實際問題。布爾同時代的數學家們也有同樣的問題。事實上在布爾代數提出後80 多年裏,它確實沒有什麼像樣的應用,直到 1938 年香農在他的碩士論文中指出用布爾代數來實現開關電路,才使得布爾代數成爲數字電路的基礎。所有的數學和邏輯運算,加、減、乘、除、乘方、開方等等,全部能轉換成二值的布爾運算。

現在我們看看文獻檢索和布爾運算的關係。對於一個用戶輸入的關鍵詞,搜索引擎要判斷每篇文獻是否含有這個關鍵詞,如果一篇文獻含有它,我們相應地給這篇文獻一個邏輯值 -- 真(TRUE,或 1),否則,給一個邏輯值 -- 假(FALSE, 或0)。比如我們要找有關原子能應用的文獻,但並不想知道如何造原子彈。我們可以這樣寫一個查詢語句“原子能 AND 應用 AND (NOT 原子彈)”,表示符合要求的文獻必須同時滿足三個條件:
- 包含原子能
- 包含應用
- 不包含原子彈
一篇文獻對於上面每一個條件,都有一個 True 或者 False 的答案,根據上述真值表就能算出每篇文獻是否是要找的。

早期的文獻檢索查詢系統大多基於數據庫,嚴格要求查詢語句符合布爾運算。今天的搜索引擎相比之下要聰明的多,它自動把用戶的查詢語句轉換成布爾運算的算式。當然在查詢時,不能將每篇文獻掃描一遍,來看看它是否滿足上面三個條件,因此需要建立一個索引。

最簡單索引的結構是用一個很長的二進制數表示一個關鍵字是否出現在每篇文獻中。有多少篇文獻,就有多少位數,每一位對應一篇文獻,1 代表相應的文獻有這個關鍵字,0 代表沒有。比如關鍵字“原子能”對應的二進制數是0100100001100001...,表示第二、第五、第九、第十、第十六篇文獻包含着個關鍵字。注意,這個二進制數非常之長。同樣,我們假定“應用”對應的二進制數是 0010100110000001...。那麼要找到同時包含“原子能”和“應用”的文獻時,只要將這兩個二進制數進行布爾運算 AND。根據上面的真值表,我們知道運算結果是0000100000000001...。表示第五篇,第十六篇文獻滿足要求。

注意,計算機作布爾運算是非常非常快的。現在最便宜的微機都可以一次進行三十二位布爾運算,一秒鐘進行十億次以上。當然,由於這些二進制數中絕大部分位數都是零,我們只需要記錄那些等於1的位數即可。於是,搜索引擎的索引就變成了一張大表:表的每一行對應一個關鍵詞,而每一個關鍵詞後面跟着一組數字,是包含該關鍵詞的文獻序號。

對於互聯網的搜索引擎來講,每一個網頁就是一個文獻。互聯網的網頁數量是巨大的,網絡中所用的詞也非常非常多。因此這個索引是巨大的,在萬億字節這個量級。早期的搜索引擎(比如 Alta Vista 以前的所有搜索引擎),由於受計算機速度和容量的限制,只能對重要的關鍵的主題詞建立索引。至今很多學術雜誌還要求作者提供 3-5 個關鍵詞。這樣所有不常見的詞和太常見的虛詞就找不到了。現在,爲了保證對任何搜索都能提供相關的網頁,所有的搜索引擎都是對所有的詞進行索引。爲了網頁排名方便,索引中還需存有大量附加信息,諸如每個詞出現的位置、次數等等。因此,整個索引就變得非常之大,以至於不可能用一臺計算機存下。大家普遍的做法就是根據網頁的序號將索引分成很多份(Shards),分別存儲在不同的服務器中。每當接受一個查詢時,這個查詢就被分送到許許多多服務器中,這些服務器同時並行處理用戶請求,並把結果送到主服務器進行合併處理,最後將結果返回給用戶。

不管索引如何複雜,查找的基本操作仍然是布爾運算。布爾運算把邏輯和數學聯繫起來了。它的最大好處是容易實現,速度快,這對於海量的信息查找是至關重要的。它的不足是隻能給出是與否的判斷,而不能給出量化的度量。因此,所有搜索引擎在內部檢索完畢後,都要對符合要求的網頁根據相關性排序,然後才返回給用戶。
發佈了33 篇原創文章 · 獲贊 7 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章