99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀萬萬沒想到,TF-IDF是這么計算的
萬萬沒想到,TF-IDF是這么計算的
2022-03-14
收藏
萬萬沒想到,TF-IDF是這么計算的

作者:小伍哥

來源:小伍哥聊風(fēng)控

一、了解tf-idf

對于文本處理,tf-idf的使用已經(jīng)非常普遍,在sklearn等知名的機(jī)器學(xué)習(xí)開源庫中都提供了直接的調(diào)用,然而很多人并沒有搞清楚TF-IDF是怎么算出來的,也就無法對這種計算方法進(jìn)行針對性的改進(jìn)了。我之前也是稀里糊涂的,在各種開源庫隨手可得的Python年代“調(diào)包需謹(jǐn)慎”,不能讓自己成為只會調(diào)包的人,我們內(nèi)功還是需要修煉的,計算之前,我們先了解下tf-idf的基本定義。

tf(term frequency:指的是某一個給定的詞語在該文件中出現(xiàn)的次數(shù),這個數(shù)字通常會被歸一化(一般是詞頻除以該文件總詞數(shù)),以防止它偏向長的文件。

idf (inverse document frequency):反應(yīng)了一個詞在所有文本(整個文檔)中出現(xiàn)的頻率,如果一個詞在很多的文本中出現(xiàn),那么它的idf值應(yīng)該低,而反過來如果一個詞在比較少的文本中出現(xiàn),那么它的idf值應(yīng)該高。
一個詞語的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在語料庫中出現(xiàn)的頻率成反比下降。

下面我們看看大多數(shù)情況下,tf-idf 的定義:
TF的計算公式如下:

萬萬沒想到,TF-IDF是這么計算的

其中

萬萬沒想到,TF-IDF是這么計算的

是在某一文本中詞條w出現(xiàn)的次數(shù),

萬萬沒想到,TF-IDF是這么計算的

是該文本總詞條數(shù)。

IDF的計算公式:

萬萬沒想到,TF-IDF是這么計算的

其中Y是語料庫的文檔總數(shù),Yw是包含詞條w的文檔數(shù),分母加一是為了避免

萬萬沒想到,TF-IDF是這么計算的

未出現(xiàn)在任何文檔中從而導(dǎo)致分母為

萬萬沒想到,TF-IDF是這么計算的

的情況。
TF-IDF的就是將TF和IDF相乘

萬萬沒想到,TF-IDF是這么計算的

從以上計算公式便可以看出,某一特定文件內(nèi)的高詞語頻率,以及該詞語在整個文件集合中的低文件頻率,可以產(chǎn)生出高權(quán)重的TF-IDF。因此,TF-IDF傾向于過濾掉常見的詞語,保留重要的詞語。

二、手算tf-idf

現(xiàn)在我們來看看,tf-idf到底怎么計算的,和我們手算的能不能對上。

在sklearn中,tf與上述定義一致,我們看看idf在sklearn中的定義,可以看到,分子分母都加了1,做了更多的平滑處理

smooth_idf=False

idf(t) = log [ n / df(t) ] + 1

smooth_idf=True

idf(t) = log [ (1 + n) / (1 + df(t)) ] + 1

下面我們手把手的計算出TF-IDF的值,使用的是sklearn官方的案例:

corpus = ['This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?'] #初始化  vector = TfidfVectorizer() #tf-idf計算  tfidf = vector.fit_transform(corpus) #直接打印,得到的是一個稀疏矩陣,第1位表示文檔編號,第二位代表詞的編號  print(tfidf) (0, 1) 0.46979138557992045 (0, 2) 0.5802858236844359 (0, 6) 0.38408524091481483 (0, 3) 0.38408524091481483 (0, 8) 0.38408524091481483 (1, 5) 0.5386476208856763 (1, 1) 0.6876235979836938 (1, 6) 0.281088674033753 (1, 3) 0.281088674033753 (1, 8) 0.281088674033753 (2, 4) 0.511848512707169 (2, 7) 0.511848512707169 (2, 0) 0.511848512707169 (2, 6) 0.267103787642168 (2, 3) 0.267103787642168 (2, 8) 0.267103787642168 (3, 1) 0.46979138557992045 (3, 2) 0.5802858236844359 (3, 6) 0.38408524091481483 (3, 3) 0.38408524091481483 (3, 8) 0.38408524091481483

通過vocabulary_屬性,可以查看每個詞對應(yīng)的數(shù)字編號,就可以與上面的矩陣對應(yīng)起來了

vector.vocabulary_ {'this': 8, 'is': 3, 'the': 6, 'first': 2, 'document': 1, 'second': 5, 'and': 0, 'third': 7, 'one': 4}

通過上面的字典和矩陣可以知道,第一個文檔'This is the first document'的tf-idf 值如下

(0, 1) 0.46979138557992045 document (0, 2) 0.58028582368443590 first (0, 6) 0.38408524091481483 the (0, 3) 0.38408524091481483 is (0, 8) 0.38408524091481483 this

document first the is this

0.46979 0.58028 0.384085 0.38408 0.384085


我們手動計算來驗證下:

tf 計算

對于第一個文檔,有5個不同的詞,每個詞的詞頻為:tf= 1/5

idf計算

document:log((1+N)/(1+N(document)))+1= log((1+4)/(1+3))+1 = 1.2231435 first   :log((1+N)/(1+N(first)))+1 = log((1+4)/(1+2))+1 = 1.5108256 the     :log((1+N)/(1+N(the )))+1 = log((1+4)/(1+4))+1 = 1.0 is      :log((1+N)/(1+N(is )))+1 = log((1+4)/(1+4))+1 = 1.0 this :log((1+N)/(1+N(this)))+1 = log((1+4)/(1+4))+1 = 1.0
萬萬沒想到,TF-IDF是這么計算的

tf-idf計算

1.2231435*1/5 = 0.24462869 1.5108256*1/5 = 0.30216512 1.0*1/5 = 0.2 1.0*1/5 = 0.2 1.0*1/5 = 0.2

得到我們手工計算的tf-idf

萬萬沒想到,TF-IDF是這么計算的

和我們sklearn計算的

萬萬沒想到,TF-IDF是這么計算的

答案并不對,哪里出了問題呢?我們仔細(xì)看看原來的代碼,因為sklearn做了歸一化,我們按同樣的方法進(jìn)行歸一化計算如下:

計算每個tf-idf 的平方根

(0.24462869**2 + 0.30216512**2 + 0.2**2 + 0.2**2 + 0.2**2)**0.5 = 0.5207177313

對每個值除以平方根

0.24462869/0.5207177313244965 = 0.4697913577434035 0.30216512/0.5207177313244965 = 0.5802858282382923 0.20000000/0.5207177313244965 = 0.3840852499708055 0.20000000/0.5207177313244965 = 0.3840852499708055 0.20000000/0.5207177313244965 = 0.3840852499708055

這樣一看,就和我們的sklearn計算的一致了,到此,我們也算是學(xué)會了計算tf-idf值了,加深了對該方法的理解,以便于后期的算法調(diào)用,心里有貨,才不懼未知。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }