TF-IDF的理論與實(shí)踐

1 前言

TF-IDF稱為“詞頻-逆向文件頻率”荠诬,是英文“term frequency–inverse document frequency”的縮寫柑贞,它是NLP領(lǐng)域在做文本處理,信息檢索等任務(wù)時(shí)常用到的一種經(jīng)典算法棠众,該算法的目的是為了衡量一個(gè)詞的重要性有决。今天從算法的原理和實(shí)踐進(jìn)行介紹书幕。

2 原理

在闡述原理前,可以先想想一個(gè)任務(wù):給你幾篇經(jīng)濟(jì)領(lǐng)域文章苛骨,讓你找出文章中一些關(guān)鍵詞苟呐。從統(tǒng)計(jì)學(xué)的角度考慮:你會(huì)覺(jué)得出現(xiàn)頻率高的詞更可能是關(guān)鍵詞掠抬,這個(gè)統(tǒng)計(jì)詞頻的想法就是TF的思想;然而在統(tǒng)計(jì)詞頻后排序輸出時(shí)瞳步,你可能發(fā)現(xiàn)有“的”单起、“一直”等這樣跟經(jīng)濟(jì)沒(méi)多大關(guān)聯(lián)的詞劣坊;在解決這個(gè)問(wèn)題時(shí),你可能想如果一個(gè)詞在每篇文章都出現(xiàn)测蘑,就可以視該詞像“的”這類助詞一樣康二,沒(méi)什么代表性沫勿,不重要味混,而這個(gè)想法就是IDF的思想翁锡。

總的來(lái)說(shuō),TF-IDF的主要思想是:如果某個(gè)單詞在一篇文章中出現(xiàn)的頻率(TF值)很高馆衔,而在其他文章中很少出現(xiàn)(IDF值很大)哈踱,就認(rèn)為該詞具有很高的代表性梨熙,對(duì)該篇文章更重要咽扇。

下面來(lái)介紹TF-IDF的數(shù)學(xué)表達(dá)公式:
(1) TF詞頻(Term Frequency)
tf(w)=\frac{\#count(w)}{\#count(G)}

其中质欲,\#count(w)表示詞w出現(xiàn)的頻率(次數(shù))嘶伟,\#count(G)表示整個(gè)語(yǔ)料庫(kù)中所有詞出現(xiàn)的次數(shù)九昧,也可認(rèn)為是語(yǔ)料庫(kù)文本的長(zhǎng)度毕匀。TF用來(lái)統(tǒng)計(jì)一個(gè)詞出現(xiàn)的頻率,出現(xiàn)的頻率越高蹋笼,一定程度上可認(rèn)為越重要剖毯。

(2) IDF逆向文件頻率(Inverse Document Frequency)
idf(w)=log(\frac{|D|}{|D_w|+1})

其中逊谋,|D|表示文檔的總數(shù)量活玲,|D_w|表示詞出現(xiàn)的文檔數(shù)量,加1是為了防止分母為0穗熬,一種平滑處理丁溅。簡(jiǎn)單來(lái)理解就是:總文件數(shù)目除以包含該詞的文件的數(shù)目,再取對(duì)數(shù)即為該詞的idf值妓柜。若包含詞w的文檔越少, IDF越大棍掐,則說(shuō)明該詞更具有代表性拷况。

(3) TF-IDF
tf\_idf(w)=tf(w)*idf(w)

將詞w計(jì)算出的tf值和idf值相乘赚瘦,即為tf_idf值。在NLP任務(wù)中鹰服,可用tf_idf值將詞向量化悲酷,也可用tf_idf值作為一個(gè)權(quán)重參與計(jì)算舔涎。TF-IDF用一句話來(lái)概括就是:過(guò)濾掉常見(jiàn)的詞語(yǔ),保留重要的詞語(yǔ)亡嫌。

但TF-IDF也存在缺陷:當(dāng)一個(gè)關(guān)鍵詞每篇文章都出現(xiàn)挟冠,那TF-IDF會(huì)把它當(dāng)著不重要的詞來(lái)處理知染。它是基于統(tǒng)計(jì)學(xué)的思想控淡,是具備一定說(shuō)服力和意義的,但不能解決所有問(wèn)題辫诅,所以在使用時(shí)炕矮,還的結(jié)合具體任務(wù)來(lái)進(jìn)行調(diào)整者冤。

3 實(shí)踐

3.1 任務(wù)說(shuō)明

利用TF-IDF方法邢滑,找出醫(yī)療領(lǐng)域文本中tf_idf最大的top詞。
file_corpus是我從網(wǎng)上收集的醫(yī)療領(lǐng)域語(yǔ)料庫(kù)殊鞭,比較小,約50M泵督。
在統(tǒng)計(jì)詞過(guò)程中庶喜,先過(guò)濾掉標(biāo)點(diǎn)符號(hào)小腊,長(zhǎng)度為1的詞,這樣可以提高一下要找詞的質(zhì)量久窟。在分詞中秩冈,使用的是開源分詞器jieba。

3.2 代碼

import codecs
import jieba
import re
import math

def compute_tf_idf(file_dir,tf_idf_file):
    D=0 #文檔的數(shù)量
    N=0 #詞出現(xiàn)的總頻率斥扛,也是文檔的長(zhǎng)度累積
    re_han = re.compile(u"([\u4E00-\u9FD5a-zA-Z0-9]+)")  #過(guò)濾掉標(biāo)點(diǎn)符號(hào)之類的符號(hào)
    with codecs.open(file_dir ,'r' ,encoding='utf-8') as f:
        #統(tǒng)計(jì)每個(gè)詞的tf,idf值入问,以字典的形式存儲(chǔ)
        dataset=dict()
        for line in f:
            N+=len(line)
            D+=1
            tmp = []  #統(tǒng)計(jì)idf時(shí),一條文本中詞只統(tǒng)計(jì)一次稀颁,為了出重設(shè)置的變量
            blocks = re_han.split(line)
            for blk in blocks:
                if re_han.match(blk):
                    for w in jieba.cut(blk):
                        if len(w)>= 2:   #過(guò)濾掉長(zhǎng)度為1的詞
                            if w in dataset:
                                dataset[w]['tf'] += 1
                                if w not in tmp:
                                    dataset[w]['idf'] += 1
                                    tmp.append(w)  
                            else:
                                dataset.setdefault(w, {})
                                dataset[w]['tf'] = 1
                                dataset[w]['idf'] = 1
                                tmp.append(w)
#     print(D,N)
    
    #計(jì)算tf-idf值
    res=[]
    for key in dataset:
        tf=dataset[key]['tf']/N
        idf=math.log(D/(dataset[key]['idf']+1))
        tf_idf=tf*idf
        res.append([key,tf_idf])
    
    #排序輸出
    res=sorted(res,key=lambda x:x[1],reverse=True)
    with codecs.open(tf_idf_file, 'w', encoding='utf-8') as f:
        for item in res:
            f.write(item[0]+'\t'+str(item[1])+'\n')

if __name__=="__main__":

    corpus_dir=r'F:\open_data\file_corpus.txt'
    tf_idf_dir=r'F:\tf_idf.txt'
    compute_tf_idf(corpus_dir,tf_idf_dir)

3.3 結(jié)果分析

運(yùn)行上述的代碼芬失,輸出的文件就是按tf_idf大小降序排列的詞,下面是前20詞的截圖:

通過(guò)上面的顯示匾灶,我們可以看出都是跟醫(yī)療相關(guān)的,其中“腫瘤”的tf-idf值最大颊糜。這前20一個(gè)詞基本都是醫(yī)學(xué)領(lǐng)域?qū)S性~业筏,整體來(lái)說(shuō)惯疙,tf-idf找領(lǐng)域關(guān)鍵詞是有效果的对碌,但也存在缺陷:因?yàn)樗淖罱K結(jié)果是由tf與idf共同決定的,當(dāng)tf特別大,idf即使很小叁丧,可能最終的結(jié)果也是靠前的。這就能解釋為何“出現(xiàn)”、“發(fā)生”這類詞的tf-idf值很高(排在20~40范圍內(nèi))的原因,而這些可能并不是我們想要的凄硼。所以,面對(duì)具體任務(wù)下骏全,我們可以在tf-idf的基礎(chǔ)上,再加一些限定條件,比如該詞是不是領(lǐng)域?qū)S性~,或者其他統(tǒng)計(jì)指標(biāo)苹熏,這樣得到的效果會(huì)更好。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铐然,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脉让,老刑警劉巖薪伏,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纽窟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瓷胧,“玉大人瘸洛,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵定铜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鹰溜,道長(zhǎng)墓陈,這世上最難降的妖魔是什么庸毫? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上肋联,老公的妹妹穿的比我還像新娘虑粥。我一直安慰自己窄陡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躏将,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天巍沙,我揣著相機(jī)與錄音矮嫉,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仰坦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼爵川!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤甫匹,失蹤者是張志新(化名)和其女友劉穎刻恭,沒(méi)想到半個(gè)月后鞍匾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掰茶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年濒蒋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了县好。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晾咪。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡圆存,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隅俘,到底是詐尸還是另有隱情,我是刑警寧澤笤喳,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布为居,位于F島的核電站,受9級(jí)特大地震影響杀狡,放射性物質(zhì)發(fā)生泄漏蒙畴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一呜象、第九天 我趴在偏房一處隱蔽的房頂上張望膳凝。 院中可真熱鬧,春花似錦恭陡、人聲如沸蹬音。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)著淆。三九已至,卻和暖如春哥捕,著一層夾襖步出監(jiān)牢的瞬間牧抽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工遥赚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扬舒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓凫佛,卻偏偏與公主長(zhǎng)得像讲坎,于是被迫代替她去往敵國(guó)和親孕惜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容