以求醫為例談搜尋引擎排序演算法的基礎原理 (2011-1-27 08:01:02)標籤: 分類:搜尋技術
我們向搜尋引擎提交一個查詢,搜尋引擎會從先到後列出大量的結果,這些結果排序的標準是什麼呢?這個看似簡單的問題,卻是資訊檢索專家們研究的核心難題之一。
為了說明這個問題,我們來研究一個比搜尋引擎更加古老的話題:求醫。比如,如果我牙疼,應該去看怎樣的醫生呢?假設我只有三種選擇:
- A醫生,既治眼病,又治胃病;
- B醫生,既治牙病,又治胃病,還治眼病;
- C醫生,專治牙病。
A醫生肯定不在考慮之列。B醫生和C醫生之間,貌視更應該選擇C醫生,因為他更專註,更適合我的病情。假如再加一個條件:B醫生經驗豐富,有二十年從醫經曆,醫術高明,而C醫生只有五年從醫經驗,這個問題就不那麼容易判斷了,是優先選擇更加專註的C醫生,還是優先選擇醫術更加高明的B醫生,的確成了一個需要仔細權衡的問題。
至少,我們得到了一個結論,擇醫需要考慮兩個條件:醫生的專長與病情的適配程度;醫生的醫術。大家肯定覺得這個結論理所當然,而且可以很自然地聯想到,搜尋引擎排序不也是這樣嗎,既要考慮網頁內容與使用者查詢的匹配程度,又要考慮網頁本身的品質。但是,怎麼把這兩種因素結合起來,得到一個,而不是兩個或多個排序標準呢?假如我們把這兩種因素表示成數值,最終的排序依據是把這兩個數值加起來,還是乘起來,或是按決策樹的辦法把它們組織起來?如果是加起來,是簡單相加,還是帶權重加呢?
我們可以根據直覺和經驗,通過試錯的辦法,把這兩個因素結合起來。但更好的辦法是我們能找到一個明確的依據,最好能跟數學這樣堅實的學科聯絡起來。說起來,依據樸素的經驗,人類在古代就能建造出高樓;但要建造出高達數百米的 摩天大廈,如果沒有建築力學、材料力學這樣堅實的學科作為後盾,則是非常非常困難的。同理,依據樸素的經驗構建的搜尋引擎演算法,用來處理上萬的網頁集合應該是沒問題的;但要檢索上億的網頁,則需要更為牢固的理論基礎。
求醫,病人會優先選擇診斷準確、治療效果好的醫生;對於搜尋引擎來說,一般按網頁滿足使用者需求的機率從大到小排序。如果用q表示使用者給出了一個特定的查詢,用d表示一個特定的網頁滿足了使用者的需求,那麼排序的依據可以用一個條件機率來表示:
P(d|q)
這個簡單的條件機率,將搜尋引擎排序演算法與機率論這門堅實的學科聯絡了起來,這就像在大海中航行的船隻裝備了指南針一樣。利用貝葉斯公式,這個條件機率可以表示為:
可以清楚地看到,搜尋引擎的排序標準,是由三個部分組成的:查詢本身的屬性P(q);網頁本身的屬性P(d);兩者的匹配關係P(q|d)。對於同一次查詢來說,所有網頁對應的P(q)都是一樣的,因此排序時可以不考慮,即
公式左邊,是已知使用者的查詢,求網頁滿足該使用者需求的機率。搜尋引擎為了提高響應使用者查詢的效能,需要事先對所有待查詢的網頁做預先處理。預先處理時,只知道網頁,不知道使用者查詢,因此需要倒過來計算,即分析每個網頁能滿足哪些需求,該網頁分了多大比例來滿足該需求,即得到公式右邊的第一項P(q|d),這相當於上文介紹的醫生的專門程度。比如,一個網頁專門介紹牙病,另一個網頁既介紹牙病又介紹胃病,那麼對於“牙疼”這個查詢來說,前一個網頁的P(q|d)值就會更高一些。
公式右邊的第二項P(d),是一個網頁滿足使用者需求的機率,它反映了網頁本身的好壞,與查詢無關。假如要向一個陌生人推薦網頁(我們並不知道他需要什麼),那麼P(d)就相當於某個特定的網頁被推薦的機率。在傳統的資訊檢索模型中,這一個量不太被重視,如傳統的向量空間模型、BM25模型,都試圖只根據查詢與文檔的匹配關係來得到排序的權重。而實際上,這個與查詢無關的量是非常重要的。假如我們用網頁被訪問的頻次來估計它滿足使用者需求的機率,可以看出對於兩個不同的網頁,這個量有著極其巨大的差異:有的網頁每天只被訪問一兩次,而有的網頁每天被訪問成千上萬次。能夠提供如此巨大差異的量,竟長期被傳統的搜尋引擎忽略,直到Google發明了pagerank並讓它參與到排序中。Pagerank是對P(d)值的一個不錯的估計,這個因素的加入使搜尋引擎的效果立即上升到了一個新的台階。
這個公式同樣回答了上文提出的問題,網頁與查詢的匹配程度,和網頁本身的好壞,這兩個因素應該怎樣結合起來參與排序。這個公式以不可辯駁的理由告訴我們,如果網頁與查詢的匹配程度用P(q|d)來表示,網頁本身的好壞用P(d)來表示,那麼應該按它們的乘積來進行排序。在現代商業搜尋引擎中,需要考慮更多更細節的排序因素,這些因素可能有成百上千個,要把它們融合起來是更加複雜和困難的問題。
By 相關性小組 jiangling
http://stblog.baidu-tech.com/?p=121