1. 程式人生 > >自然語言處理 - 如何通俗地理解TFIDF?

自然語言處理 - 如何通俗地理解TFIDF?

log 忘記 right 們的 提取 取出 tf-idf isp 總數

本博客屬個人學習筆記,如有疏漏,歡迎在評論留言指出~轉載請註明。


技術分享圖片

在自然語言處理中,TFIDF常常被人提及。很多材料都提及TFIDF中的“普遍重要性”,但很少有材料去簡單解釋其中的原理。TFIDF其實分為兩個部分:TF與IDF。

(1)詞頻 TF

TF即Term Frequency,中文也叫詞頻。這個相對容易理解。

假設這裏給出的文檔$d_1$是:

 “我有一只超級超級可愛的貓”

那麽分詞後我們很可能會得到:

[‘我‘,‘有‘,‘一只‘,‘超級‘,‘超級‘,‘可愛‘,‘的‘,‘貓‘]

我們分別給這些詞標上序號與出現次數:

詞語 序號 出現次數
$w_1$ 1
$w_2$ 1
一只 $w_3$ 1
超級 $w_4$ 2
可愛 $w_5$ 1
$w_6$ 1
$w_7$ 1

不難發現,這個文檔中有一共8個詞語。

對於‘我‘(即$w_1$)這個詞來說,它在這個文檔$d_1$中的詞頻TF為:$$tf(w_1,d_1) = \frac{1}{8}$$

而對於‘超級‘(即$w_4$)這個詞來說,它在這個文檔$d_1$中的詞頻TF則為:$$tf(w_4,d_1) = \frac{2}{8} = \frac{1}{4}$$

而對於‘貓‘(即$w_7$)這個詞來說,它在這個文檔$d_1$中的詞頻TF則為:$$tf(w_7,d_1) = \frac{1}{8} $$

小結:詞頻TF的計算公式為$$tf(詞語w_i,文檔d_j)=tf(w_i, d_j) = \frac{文檔d_j中詞語w_i出現的次數}{文檔d_j中的詞語總數}$$

(2) 逆向文檔頻率 IDF

IDF即Inver Document Frequency,中文也叫逆向文檔頻率。先不著急理解它的作用~我們先來看看它是怎麽算出來的。

假設我們的語料庫(這裏我們稱它為D)中有兩個文檔——

文檔1:“我有一只超級超級可愛的貓”

文檔2:“我有一只超級淘氣的狗”

如果我們忘記自己在做自然語言處理,改成用人腦思考這兩句話的差別,我們會發現真正有區別的無非是“可愛的貓”和“淘氣的狗”。

而“我”,“有”,“一只”,“超級”並沒有提供什麽關鍵信息,因此它們並不太重要。“貓”、“狗”、“淘氣”、“可愛”才是提供關鍵信息的詞語。

而IDF正是在為我們處理這個問題——

技術分享圖片

對於“我”這個詞而言,它分別在文檔1和文檔2裏各出現了一次——這說明雖然“我”是一個在語料庫中非常常見的詞,但是它並不對區別語義起到很大的作用,因此它的重要性可能並不是特別高。

對應的,“我”這個詞的idf是:$$idf(“我”,語料庫D) = log \frac{語料庫D中的文檔總數}{包含“我”的文檔個數} = log \frac{2}{2} = log(1) = 0$$

而對於“貓”這個詞而言,它只在文檔1中出現過一次。 這說明,它可能對區分文檔語義有著重要的作用,因此它的重要性比較大。

對應的,“貓”這個詞的idf是:$$idf(“貓”,語料庫D) = log\frac{語料庫D中的文檔總數}{語料庫中包含“貓”的文檔個數} = log\frac{2}{1} = log(2) $$

註意到,$$log(2) > 0$$可見IDF實際上是為我們篩選了對語義起到重要作用的詞語。

小結:逆向文檔頻率的計算公式為$$idf(詞語w,語料庫D) = idf(w,D) = \frac{語料庫D中的文檔總數}{語料庫D中包含該詞語w的文檔個數}$$

(3)TF-IDF

定義:對於語料庫D中,文檔d包含的一個詞w,有TF-IDF為$$tfidf(詞語w,文檔d,語料庫D) = tfidf(w,d,D) = tf(w,d) \dot idf(w,D)$$.

比如說在剛才的例子中,對於不是很重要的“我”:$$tfidf(“我”, d1, D) = tf(“我”,d_1 \dot idf(“我”,D) = \frac{1}{8} \dot 0 = 0$$

而對於比較重要的“貓”:$$tfidf(“貓”, d1, D) = tf(“貓”,d_1 \dot idf(“貓”,D) = \frac{1}{8} \dot log(2) = \frac{log(2)}{8}$$

註意到$\frac{log(2)}{8} > 0$.

假設我把第一個文檔$d_1$改為只有“貓”一個詞,那麽毋庸置疑,對文檔$d_1$來說最重要的就是“貓”了。在這個情況下,貓的詞頻就是1了——乘數的其中一個會變大。

$$tfidf(“貓”, d1, D) = tf(“貓”,d_1 \dot idf(“貓”,D) = 1 \dot log(2) = log(2)$$

註意到$log(2) > \frac{log(2)}{8}$.

這就是為什麽,TFIDF可以過濾掉過於常見的詞語,以此保證所提取出的詞語具有“普遍重要性”。

參考資料:

https://en.wikipedia.org/wiki/Tf%E2%80%93idf

自然語言處理 - 如何通俗地理解TFIDF?