當前位置:編程學習大全網 - 源碼下載 - sklearn中tfidf的計算與手工計算詳解

sklearn中tfidf的計算與手工計算詳解

引言:本周數據倉庫與數據挖掘課程布置了word2vec的課程作業,要求是手動計算corpus中各個詞的tfidf,並用sklearn驗證自己計算的結果。但是博主手動計算的結果無論如何也與sklearn中的結果無法對應,在查閱大量資料無果的情況下,只好自己去閱讀源碼了,最後成功解決了這壹問題。

作業:

(tf-idf計算這裏網絡上的其他文章基本都有,這裏只給出基本的定義)

簡介:TF-IDF(Term Frequency-InversDocument?Frequency)是壹種常用於信息處理和數據挖掘的加權技術。該技術采用壹種統計方法,根據字詞的在文本中出現的次數和在整個語料中出現的文檔頻率來計算壹個字詞在整個語料中的重要程度。它的優點是能過濾掉壹些常見的卻無關緊要本的詞語,同時保留影響整個文本的重要字詞。

計算步驟:

1.計算TF

簡介:TF,是Term Frequency的縮寫,就是某個關鍵字出現的頻率,即詞庫中的某個詞在當前文章中出現的頻率。

計算公式:

詞頻TF = 某個詞在文章中出現的次數 / 本篇文章中詞的總數

考慮到文章有長短之分,為了便於不同文章的比較,進行"詞頻"標準化。

其中如果壹個詞在文中出現的頻率越多,說明這個詞TF就越大。

2.計算IDF

英文全稱:Inverse Document Frequency,即“逆文檔頻率”。計算IDF需要壹個語料庫,用來模擬語言的使用環境。文檔頻率DF就是壹個詞在整個文庫詞典中出現的頻率,如壹個文件集中有100篇文章,***有10篇文章包含“機器學習”這個詞,那麽它的文檔頻率就是10/100=0.1,逆文檔頻率IDF就是這個值的倒數,即10。

計算公式:

IDF(N) = log(文檔總數 / 出現N這壹詞匯的文檔數目)

其中如果壹個詞越常見,那麽分母就越大,逆文檔頻率就越小越接近0。

log表示對得到的值取對數。

3.計算TF-IDF=TF*IDF

(下面引用壹段sklearn源碼中的註釋,可以幫助不了解的讀者直接使用)

我相信絕大多數的朋友得到的也是上圖的結果,這與手工計算的結果大相徑庭。不止結果不壹樣,甚至詞匯數目都對不上,這實在令人難以接受。那麽究竟是怎麽壹回事呢?

1.更改CountVectorizer的初始化參數token_pattern=r"(?u)\b\w+\b"

2.更改TfidfTransformer的初始化參數norm=None,smooth_idf=False.

3.更改手工idf計算方式:由lg(以10為底)改為ln(以e為底)

經過以上步驟的處理,手工計算的tfidf和程序計算的tfidf就是相同的了,那麽為什麽會出現這樣的問題呢?

還是從源碼說起吧

源碼中的註釋部分這樣解釋token_pattern

個人 理解:CountVectorizer類在初始化時會默認詞匯辨認形式為r"(?u)\\b\\w\\w+\\b",這是壹個雙字符以上的字符串,這樣就導致了在原題目中"我","他","了","於"的丟失,這就是導致我們詞匯數目不匹配的元兇!因為他們是單字符,所以我們把這個類的接受形式改為單字符即可( r"(?u)\b\w+\b" )。

源碼中的norm解釋部分,以及smooth_idf解釋部分

norm很好理解,sklearn自動為我們做了l2正則化,所以我們的結果和他的不同。因此只要不使用正則化即可(norm=None)

那下面的smooth_idf又是什麽情況呢? (這裏網上的各種資料簡直是迷惑行為大賞,抄來抄去,說的全都含混不清)

首先我們要牢記,最基礎的idf定義就是文章上面寫的定義!!!

那其他的idf定義是正確的嗎?比如idf = log(N + 1/ N(x) + 1),以及該式子的各種變形?

如果妳使用了smooth_idf,那麽上式正確。

那麽什麽是smooth_idf呢,舉個栗子:

其實就是將出現過的所有詞匯放入壹個新生成的文章之中,確保idf初始定義中的分母不為0。

其實這是壹個很搞的問題,sklearn中使用的是numpy庫中的log函數,這個函數就是ln函數,在源碼中所有的計算都是用的numpy.log(),這同樣導致了我們的結果與程序完全不同。

雖然這個問題事後看來並不是壹個非常困難的問題,但是因為這個問題需要更改好幾個參數 甚至要更改自己 ,也因為某些垃圾博主只會抄襲,根本不深入研究,導致我根本找不到壹個解決這個問題的博客,最後只能自己動手解決。盡管浪費了很多時間,但還是比較值得的,也希望對其他被這個問題困擾的同學有幫助吧?。

  • 上一篇:1分鐘,帶指示器源代碼
  • 下一篇:未來是 HTML 5 還是 Flash 的時代?
  • copyright 2024編程學習大全網