TF-IDF模型的概率解釋

Todd發表於2012-10-22

資訊檢索概述

資訊檢索是當前應用十分廣泛的一種技術,論文檢索、搜尋引擎都屬於資訊檢索的範疇。通常,人們把資訊檢索問題抽象為:在文件集合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)和w在文件集合D中出現總次數count(w, D)的比值:

tf(w,d)
= count(w, d) / count(w, D)
= count(w, d) / sum { i = 1..n | count(w, d[i]) }

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) / count(w, D)?能不能是count(w, d[i]) / max { j = 1..n | count(w, d[j])}等其他形式?

2) 為什麼idf是一個log形式,而tf又不是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]小球的條件概率。

在沒有更多資訊的情況下,我們可以用w[j]出現的頻度代表P(w[j]),即P(w[j])等於w[j]顏色小球數佔總小球數的比例;而P(w[j] | d[i])等於w[j]顏色小球在盒子d[i]中所佔的比例,即:

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]) * (count(w[j], d[i]) / size(d[i])) / (count(w[j]) / size(D))
= P(d[i]) * (count(w[j], d[i]) / count(w[i])) / (size(d[i]) / size(D))
= P(d[i]) * tf(w[j], d[i]) * size(D) / size(d[i])

其中,size(d[i])是d[i]中的小球總數,size(D)是總小球數(一個公共的常數)。可見,tf模型可以被納入這個概率模型,這從一定程度解釋了tf模型的合理性。但是,它比tf還多出了P(d[i])和size(d[i])。

首先,我們來看盒子d[i]被選中的先驗概率P(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(d[i])之外,文件d[i]中的詞數size(d[i])也是一個變化因素,而這個變化因素實際上是被tf所忽略的,或者我們可以認為tf模型是假設各個文件的詞數都近似相等,這樣它和概率模型就統一起來了。這樣,從嚴格的概率角度,我們既解釋了tf的合理性,又清楚地看到它做了哪些假設。

詞的資訊量

上面,我們在計算P(w[j] | d[i])的過程中是把小球視為除了顏色可區分外,沒有選中概率的差別,即某一顏色的小球被選中的概率只與其數量有關。這在資訊檢索中並不成立,直觀上看人們不會對“的”,“什麼”,“我們”這些普遍出現的虛詞和代詞感興趣,而會關注能代表文件中心意思的詞彙。比如,一篇文章如果提到“庫克”,“iPhone 5”,“釋出會”這幾個詞,那你多半可以猜到它的大致內容了;反過來說,使用者的搜尋關鍵詞也更可能來自這些詞彙。所以,我們有必要在盒子小球模型中改進條件概率P(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]) * (count(w[j], d[i]) * idf(w[j]) / sum { k = 1..size(d[i]), idf(w[k]) }) / (count(w[j] / size(D))
= P(d[i]) * (count(w[j], d[i]) / count(w[j]) * idf(w[j]) / sum { k = 1..size(d[i]), idf(w[k]) } / size(D)
= P(d[i]) * tf(w[j], d[i]) * idf(w[i]) * C2 / sum { k = 1..size(d[i]), idf(w[k]) }
= P(d[i]) * tf-idf(w[j], d[i]) / idf(d[i]) * C2

我們看到tf-idf已經被納入框架內了,但是還多出了一個idf(d[i]),即文件d[i]的中各個詞的資訊量之和。這個多出來的idf(d[i])的意義是什麼呢?實際上,tf-idf(w[j], d[i]) / idf(d[i])是了關鍵詞w[j]代表文件d[i]主題的概率。人們總是希望關鍵詞代表了文件所表達的主題意思,比如:搜尋“2012美國大選”是希望搜尋結果文件的主題就是關於2012美國大選的。對於同樣大小的tf-idf(w[j], d[i]),如果一篇文章的總資訊量很大,那麼關鍵詞w[j]能代表文章主題的可能性當然就更小。這也可以解釋為什麼通常搜尋引擎會給於網頁標題中的詞彙更高的權重,因為標題本身代表文件主題的概率是非常大的(除了少數所謂的標題黨)。從搜尋體驗的角度講,如果關鍵詞w匹配文件d1和d2,但w是代表d1主題的關鍵詞,但w不是代表d2主題的關鍵詞,tf-idf不區分這兩種情況,會給於d1和d2相同的權值,而條件概率模型會給於d1更高的概率。從另一個角度說,我們可以認為tf-idf是假設“所有文件中各詞的資訊量之和相等”。

多關鍵詞

上面的條件概率模型主要是針對單個關鍵詞的情況,下面我們進一步將其擴充套件到多關鍵詞情況。我們知道,在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]) * (P(w[x] | d[i]) / P(w[x])) * (P(w[y] | d[i]) / P(w[y]))
= P(d[i]) * (tf-idf(w[x], d[i]) / idf(d[i])) * (tf-idf(w[y], d[i]) / idf(d[i])) * C3

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

總結

TF-IDF模型是搜尋引擎等實際應用中被廣泛使用的資訊檢索模型,但對於TF-IDF模型一直存在各種疑問。本文為資訊檢索問題一種基於條件概率的盒子小球模型,其核心思想是把“查詢串q和文件d的匹配度問題”轉化為“查詢串q來自於文件d的條件概率問題”。它從概率的視角為資訊檢索問題定義了比TF-IDF模型所表達的匹配度更為清晰的目標。此模型可將TF-IDF模型納入其中,一方面解釋其合理性,另一方面也發現了其不完善之處。另外,此模型還可以解釋PageRank的意義,以及PageRank權重和TF-IDF權重之間為什麼是乘積關係。

相關文章