Todd.log - a place to keep my thoughts on programming TF-IDF模型的概率解釋

李博Garvin發表於2014-09-25

轉自:http://www.cnblogs.com/weidagang2046/archive/2012/10/22/tf-idf-from-probabilistic-view.html

資訊檢索概述

資訊檢索是當前應用十分廣泛的一種技術,論文檢索、搜尋引擎都屬於資訊檢索的範疇。通常,人們把資訊檢索問題抽象為:在文件集合D上,對於由關鍵詞w[1] ... w[k]組成的查詢串q,返回一個按查詢q和文件d匹配度relevance(q, d)排序的相關文件列表D'。

對於這一問題,先後出現了布林模型、向量模型等各種經典的資訊檢索模型,它們從不同的角度提出了自己的一套解決方案。布林模型以集合的布林運算為基礎,查詢效率高,但模型過於簡單,無法有效地對不同文件進行排序,查詢效果不佳。向量模型把文件和查詢串都視為詞所構成的多維向量,而文件與查詢的相關性即對應於向量間的夾角。不過,由於通常詞的數量巨大,向量維度非常高,而大量的維度都是0,計算向量夾角的效果並不好。另外,龐大的計算量也使得向量模型幾乎不具有在網際網路搜尋引擎這樣海量資料集上實施的可行性。

tf-idf模型

目前,真正在搜尋引擎等實際應用中廣泛使用的是tf-idf模型。tf-idf模型的主要思想是:如果詞w在一篇文件d中出現的頻率高,並且在其他文件中很少出現,則認為詞w具有很好的區分能力,適合用來把文章d和其他文章區分開來。該模型主要包含了兩個因素:

1) 詞w在文件d中的詞頻tf (Term Frequency),即詞w在文件d中出現次數count(w, d)和文件d中總詞數size(d)的比值:

tf(w,d) = count(w, d) / size(d)

2) 詞w在整個文件集合中的逆向文件頻率idf (Inverse Document Frequency),即文件總數n與詞w所出現檔案數docs(w, D)比值的對數:

idf = log(n / docs(w, D))

tf-idf模型根據tf和idf為每一個文件d和由關鍵詞w[1]...w[k]組成的查詢串q計算一個權值,用於表示查詢串q與文件d的匹配度:

tf-idf(q, d)
= sum { i = 1..k | tf-idf(w[i], d) }
= sum { i = 1..k | tf(w[i], d) * idf(w[i]) }

資訊檢索問題的概率視角

直觀上看,tf描述的是文件中詞出現的頻率;而idf是和詞出現文件數相關的權重。我們比較容易定性地理解tf-idf的基本思想,但具體到tf-idf的一些細節卻並不是那麼容易說清楚為什麼。比如:

1) 為什麼tf是count(w, d) / size(d)?能不能是log(count(w, d) / size(d))等其他形式?

2) 為什麼idf是一個log形式?

3) 為什麼tf和idf之間是乘積關係,而不是加法或指數關係?

4) 為什麼多個關鍵詞的tf-idf值是加法關係,而不是乘法或者指數關係?

5) 除了tf-idf值,Google還會計算網頁的PageRank值,二者相乘得到最後的權值,為什麼是乘法,而不是加法或指數?

據說,最初甚至tf-idf的提出者自己也沒有對諸如“為什麼idf是log形式”這個問題給出有力的解釋,雖然後來有人從資訊理論的角度對idf的log形式給出了令人信服的解釋,但是剩下的其他一些疑問仍然存在。在我瞭解的範圍內,對於tf-idf模型還沒有一個真正統一完整的理論解釋。在試圖為tf-idf找到更好的理論解釋的過程中,我意識到對tf-idf模型種種疑問的根源在於tf-idf試圖表達的“查詢q和文件的匹配度”本身就有一定的模糊性,什麼叫做“匹配度”,這就有很大的自由發揮空間。如果說向量模型的用向量夾角來表示匹配度概念還有一定的理論基礎,那麼用tf-idf來表達匹配度就有點“與其說是科學,不如說是藝術”的味道。

更進一步,其實,資訊檢索問題的抽象方式“在文件集合D上,對於給定查詢串q,返回一個按查詢q和文件d匹配度relevance(q, d)排序的相關文件列表D'”本身是值得反思的。我們應當考慮拋棄“匹配度”這種模糊的目標,從根源上尋求一種具有明確數學意義的目標。如果我們從概率視角來看,把“查詢串q和文件d的匹配度”問題轉換為“當查詢串是q時,使用者期望獲得文件d的概率”問題,資訊檢索問題就清晰多了。一方面這個概率描述是站在人的角度來看待資訊檢索問題的,更加貼近實際的使用者體驗;另一方面,概率本身是有明確數學意義的,這樣我們就首先從目標上對問題進行了嚴格化。

下面,我將通過一個模型,從概率的視角,一邊解釋tf-idf的概率意義,一邊指出其不合理之處。

盒子小球模型

為了分析“當查詢串是q時,使用者期望獲得文件d的概率”問題,我首先建立了一種稱為“盒子小球模型”的簡化模型。盒子小球模型把詞想象成各種不同顏色的小球,文件想象成裝有若干小球的盒子,把“當查詢串是q時,使用者期望獲得文件d的概率“轉換為下面的問題:

有n個盒子d[1], d[2], ... d[n],每個盒子中有若干不同顏色的小球,有人隨機地選擇了一個盒子,並從盒子中隨機地拿出了一個顏色為w[j]的小球,那麼這個小球來自於盒子d[i]的概率是多少?

其實,這就是經典的條件概率問題P(d[i] | w[j]),採用貝葉斯推斷將其轉化為:

P(d[i] | w[j])
= P(d[i], w[j]) / P(w[j])
= P(d[i]) * P(w[j] | d[i]) / P(w[j])

我們注意到這個條件概率包括幾個部分,P(d[i])是盒子d[i]被選中的先驗概率,p(w[j])是w[j]顏色小球被選中的先驗概率,P(w[j] | d[i])是在盒子d[i]中選中顏色w[j]小球的條件概率。

文件先驗概率P(d)與PageRank

首先,我們來看盒子d[i]被選中的先驗概率P(d[i])是什麼。P(d[i])的意義是:當使用者什麼也沒有輸入的時候,它可能對文件d[i]感興趣的概率。在沒有更多資訊的情況下,我們可以認為每個盒子被選中的先驗概率P(d[i])是相等的,都等於1 / m,其中m表示總文件數(總盒子數),這時P(d[i])作為公共係數可被忽略。不過,在實際應用中,我們通常可以根據其他知識獲得各文件的先驗概率,比如,學術文獻和網頁通常可以基於引用度模型計算其先驗概率,這些經典論文和熱門網頁是多數人樂於見到的。說到這裡,你可能已經發現,Google PageRank本質上就是這個先驗概率P(d[i])乘以某個係數!所以,PageRank實際上也被納入這個條件概率模型中來了,這就不難解釋為什麼在Google的排序演算法中PageRank權重和tf-idf權重是一種乘積關係而不是加或者指數關係。另一方面,在理解了文件先驗概率對整個搜尋結果概率的影響後,當搜尋引擎中針對PageRank出現各種假連結SEO時,我們可以不拘泥於基於連結引用模型的PageRank,只要是以網頁先驗概率為目標,不論是採用基於連結引用的PageRank,還是基於搜尋結果點選數模型,或是其他模型,都是可以的。這就是“變通”,從原理上“通”了,就可以在方法上“變”。

詞的先驗概率P(w)

下面我們來考察詞w[j]的先驗概率P(w[j])。P(w[j])的意義是:在整個文件集合中,w[j]被作為搜尋關鍵詞的概率,比如:“iPhone 5”,“青花瓷”這類詞被用作搜尋關鍵詞的概率較高,而“的”,“什麼”,“我們”這類高頻詞不大可能成為搜尋關鍵詞。那麼,我們如何來定量計算P(w[j])呢?一種思路就是把w[j]在文件集中出現的頻率作為其先驗概率。不過,顯然存在更好的方案:在大量的搜尋查詢中進行統計,統計方法得出P(w[j])的方法很接近P(w[j])本質的,不需要引入額外的假設。比如,一段時間內某搜尋引擎的搜尋總次數為10^10次,“公積金”這個詞出現了100次,那麼,我們可以認為先驗概率P("公積金")就是100 / 10^10 = 10^-8。

詞代表文件主題的條件概率P(w | d)

最後,我們來看條件概率P(w[j] | d[i])。P(w[j] | d[i])的意義是在文件d[i]中,人們用關鍵詞w[j]來搜尋它的概率。那麼,什麼樣的詞是人們會用來搜尋一篇文件的呢?多數情況下,是那些代表一篇文件主題的詞。比如,有一篇新聞是關於iPhone 5釋出會的,那麼“iPhone5”, “釋出會”,“庫克”,“蘋果”這些詞基本上就構成了文章的主題;那麼,反過來說,如果使用者想搜尋這篇關於iPhone 5釋出會的新聞,他就有很大的可能通過這幾個詞來進行搜尋。我們應當注意分辨P(w[j] | d[i])與P(w[j])的區別,後者可以通過大量的查詢統計得來,而前者不能與後者直接劃等號,因為前者的意義是w[j]代表d[i]主題的概率。如果非要引入統計方法,那麼P(w[j] | d[i])對應的統計是:當搜尋關鍵詞是w[j]且搜尋結果包含d[i]時,使用者點選(滿意)d[i]作為搜尋結果的頻率。比如,用“iPhone5 釋出會”的搜尋,在結果中有都10000次出現了網頁x,其中,使用者8000次點選了網頁x,那麼,可以認為有80%的概率網頁x的主題是關於“iPhone5 釋出會”的。

詞的資訊量和idf

上面談到了對P(w[j] | d[i])的計算的統計方法,但該方法有一定的侷限,比如,要能進行統計首先需要文件出現在足夠多的搜尋結果中,需要時間和量的積累。除了統計方法外,我們可以考慮其他方法計算詞w[j]代表文件d[i]主題的概率。可能有人立刻會想到要對文章進行語義分析提取關鍵詞,給這些關鍵詞高權重,給其他詞低權重。這種想法有一定的合理性,但實現上涉及語義分析,沒有成熟高效的方法。實際上,資訊理論為我們提供了另一條高效方案。上面談到“的”,“什麼”,“我們”這類高頻詞不會成為文件主題和搜尋關鍵詞的原因是它們不能提供足夠的資訊,而“iPhone 5”,“釋出會”這樣的詞彙則資訊量豐富。所謂資訊是指對不確定性(熵)的減小程度,資訊的單位是位元(bit),資訊量越大對於不確定性的減小程度越大。比如,外面可能在下雨也可能沒有下雨,可能性空間大小為2,如果我們看一眼窗外,可能性空間就變成了1,那麼“看見窗外在下雨”所提供的資訊量就和熵的減小程度成正比,具體來講等於log(2/1)=1。如果要用二進位制編碼是否下雨,需要1個bit,0代表沒有下雨,1代表下雨。

但在很多場景下,各個可能性的概率並不相同,比如:歐洲盃16只球隊都可能奪冠,賽前它們奪冠的先驗概率並不相同,那麼結果的不確定性程度實際上是小於log(16)=4。如果你沒有看比賽,有人告訴你西班牙奪冠了,你可能會覺得很正常,但如果有人告訴你瑞士奪冠了,你通常會非常驚訝。這一現象的理論解釋是,如果賽前西班牙奪冠概率是1/4,而瑞士奪冠概率是1/32,那麼,“西班牙奪冠”的資訊量為log(4)=2,即把不確定性減小為原來的1/4,而“瑞士奪冠”的資訊量為log(32)=5,不確定性減小為原來的1/32,一下子接受比前者大了兩倍以上的資訊量,當然你會吃驚。

回到資訊檢索,比如,“2012美國大選”這個查詢串包含了“2012”,“美國”和“大選”3個關鍵詞,我們應該如何定量計算它們的資訊量呢?根據資訊的定義,詞的資訊量等於它對不確定性的縮小程度。如果文件總數為2^30,其中2^14篇文件出現了“美國”,那麼“美國”這個詞就把文件的不確定性從2^30縮小為2^14,它所包含的資訊量為log(2^30/2^14)=16;而只有2^10篇文件出現了“大選”,那麼大選的資訊量就是log(2^30/2^10)=20,比“美國”多了4個bit。而“的”,“什麼”,“我們”這些高頻詞對減小文件不確定性幾乎沒有幫助,因而資訊量為0。相信你已經發現,上面idf(w)公式中的log(n / docs(w, D))實際上就是詞w的資訊量了。

如果我們考慮詞的資訊量對條件概率P(w[j] | d[i])的影響,假設“詞w在文件中被選中的概率與其在文件中的出現頻率和其資訊量的乘積成正比”,那麼上面的條件概率模型就變成:

P(d[i] | w[j])
= P(d[i], w[j]) / P(w[j])
= P(d[i]) * P(w[j] | d[i]) / P(w[j])
= P(d[i]) * (tf(w[j], d[i]) * idf(w[j] / sum { k = 1..size(d[i]), tf(w[k], d[i]) * idf(w[k]) }) / p(w[j])
= P(d[i]) * (tf-idf(w[j], d[i]) / sum { k = 1..size(d[i]), tf-idf(w[k], d[i]) }) / p(w[j])
= P(d[i]) * (tf-idf(w[j], d[i]) / tf-idf(d[i])) / p(w[j])

我們看到tf-idf已經被納入框架內了,但是還多出文件先驗概率P(d[i]),關鍵詞先驗概率P(w[j])和文件各詞的總tf-idf(d[i])。普通搜尋引擎是基於PageRank和tf-idf的,那麼,根據這個概率模型,我們可以看出,它沒有考慮文件總tf-idf(d[i])和關鍵詞先驗概率p(w[j])。如果考慮這兩個因素,相信搜尋效果會更好。

多關鍵詞

上面的條件概率模型主要是針對單個關鍵詞的情況,下面我們進一步將其擴充套件到多關鍵詞情況。我們知道,在tf-idf中,多個關鍵詞的所產生的tf-idf值是一種疊加關係,那麼這是否符合條件概率模型呢?答案是否定的。在兩個關鍵字情況下,條件概率問題轉化為“如果有人從一個盒子中同時摸出顏色w[x]的小球和顏色w[y]的小球,這兩個小球來自於盒子d[i]的概率是多少?”。假設從盒子中摸出各個小球事件是相互獨立的情況下,即

P(w[x], w[y]) = P(w[x]) * P(w[y])
P(w[x], w[y] | d[i]) = P(w[x] | d[i]) * P(w[y] | d[i])

我們可以推匯出條件概率:

P(d[i] | w[x], w[y])
= P(d[i], w[x], w[y]) / P(w[x], w[y])
= P(d[i]) * P(w[x], w[y] | d[i]) / P(w[x], w[y])
= P(d[i]) * P(w[x] | d[i]) * P(w[y] | d[i]) / (P(w[x] * P(w[y]))
= P(d[i]) * (tf-idf(w[x], d[i]) / tf-idf(d[i])) * ((tf-idf(w[y], d[i]) / tf-idf(d[i]))) / (p(w[x]) * P(w[y]))

可見,概率模型所得出的各個關鍵詞的tf-idf值之間是乘積關係,這是與tf-idf模型的加法關係是不同的。這一點可能與二者是否要求“文件必須包含所有查詢關鍵詞”的基本假設有關係。在文件不包含所有關鍵字的這種情況下,tf-idf模型可能得出一個非0的匹配度,但條件概率模型得出的概率肯定為0。不過,如果考慮一般查詢關鍵詞數量不多(3個以內),而大量文件都同時包含這些關鍵詞,概率模型的乘積關係是比tf-idf模型的加法關係更有理論基礎。從根本上講,這是因為tf-idf的“匹配度”是一個模稜兩可的概念,而條件概率有堅實的理論基礎。

總結

TF-IDF模型是搜尋引擎中廣泛使用的資訊檢索模型,但對於TF-IDF模型一直存在各種疑問。本文為資訊檢索問題一種基於條件概率的盒子小球模型,其核心思想是把“查詢串q和文件d的匹配度問題”轉化為“查詢串q來自於文件d的條件概率問題”。它從概率的視角為資訊檢索問題定義了比TF-IDF模型所表達的匹配度更為清晰的目標。從概率模型中,我們看到查詢串q來自於文件d的條件概率主要包含以下幾個因素:1) 文件的先驗概率P(d[i]),這與PageRank對應;2) 詞w被作為搜尋關鍵詞的先驗概率P(w),這可以通過統計方法獲得;3) 關鍵詞w代表文件d主題,或以詞w搜尋文件d的概率,P(w | d),除了統計方法,這可以通過tf-idf來計算。

相關文章