TF-IDF的算法原理以及Python實(shí)現(xiàn)過程
算法原理
TF-IDF(Term Frequency-Inverse Document Frequency)是詞頻-逆文檔頻率,主要實(shí)現(xiàn)在一個(gè)文章集中找到每篇文章的關(guān)鍵字(也就是文章中哪些詞匯是最重要的)。
主要從兩個(gè)方面考慮,一篇文章中各個(gè)詞語的出現(xiàn)頻率。另一個(gè)是該詞語在幾篇文章中出現(xiàn)。
1、TF(Term Frequency) 詞頻
首先,解釋第一個(gè)方面,一篇文章中各個(gè)詞語出現(xiàn)的頻率。
從直觀上來說,如果一篇文章中某些詞語出現(xiàn)頻率很高(除了“的、是、你”等助詞等),那么從這一角度來說,可以認(rèn)為該詞是這篇文章的關(guān)鍵詞。
使用數(shù)學(xué)公式表達(dá)就是
在某篇文章中該詞出現(xiàn)較多,則TF值較大。該詞在文章中出現(xiàn)較少,則TF值較小。注意要停用一些“的”、“是”、“你”、“我”…助詞、人稱代詞等等。
2、IDF(Inverse Document Frequency)逆文件頻率
然后,解釋第二個(gè)方面,該詞在哪幾篇文章中出現(xiàn)過。在一個(gè)文章集中,我們的目標(biāo)是找到每篇文章的特有的關(guān)鍵詞,可以反映出該文章獨(dú)有特點(diǎn),即找到差異化且可有代表性的詞。那么這個(gè)詞通常情況下,并不會在其余文章中經(jīng)常出現(xiàn),否則對區(qū)分文章關(guān)鍵信息的作用就會較小。因此,我們這一方面就是找到本篇文章中的詞語,很少出現(xiàn)在其余文章中。
使用數(shù)學(xué)公式表達(dá)就是
采用逆文檔頻率,該詞在文檔中沒有怎么出現(xiàn),則IDF值會較大。如果該詞在其余文檔出現(xiàn)較多,則IDF值會較小。
最后相乘就會得到,一篇文章中每個(gè)詞的TF-IDF的值,值越大,則可認(rèn)為重要程度越高,可作為文章的關(guān)鍵詞。
Python實(shí)現(xiàn)
在這里主要使用jieba
來實(shí)現(xiàn)中文分詞,Counter
來進(jìn)行計(jì)數(shù)統(tǒng)計(jì)
# -*- coding: utf-8 -*- import math import jieba from collections import Counter from collections import defaultdict def TFIDF(dataset): # 統(tǒng)計(jì)每個(gè)文章中每個(gè)詞語的tf j = 0 doc_len = len(dataset) cntr = [0] * doc_len # Counter每個(gè)文章 total = [0] * doc_len # 獲取每個(gè)文章中各自的詞語總數(shù) word_tf = [0] * doc_len # 獲取每個(gè)文章中每個(gè)詞語的tf for sent in dataset: iters = jieba.cut(sent) cntr[j] = Counter(iters) total[j] = sum(cntr[j].values()) word_tf[j] = defaultdict(int) for i in cntr[j].keys(): word_tf[j][i] = cntr[j][i] / total[j] j += 1 # 構(gòu)建詞匯表和總詞頻 word_cnt = defaultdict(int) for word_list in word_tf: for word in word_list: word_cnt[word] += 1 # 統(tǒng)計(jì)詞匯在文檔中的頻率 doc_tf = defaultdict(int) for word in word_cnt: for article in dataset: if word in article: doc_tf[word] += 1 # 構(gòu)建詞匯的idf word_idf = {} for word in doc_tf: word_idf[word] = math.log(doc_len / (doc_tf[word] + 1)) # 構(gòu)建每篇文章中詞的tf-idf t = 0 word_tf_idf = [0] * doc_len for article in word_tf: word_tf_idf[t] = defaultdict(int) for word in article: word_tf_idf[t][word] = article[word] * word_idf[word] t += 1 # 對每篇文章每個(gè)詞的tf-idf進(jìn)行由大到小排序 t = 0 for i in word_tf_idf: for j in i: word_tf[t] = dict(sorted(word_tf[t].items(), key=lambda x:x[1], reverse=True)) word_tf_idf[t] = dict(sorted(word_tf_idf[t].items(), key=lambda x:x[1], reverse=True)) t += 1 return word_tf_idf, word_tf if __name__ == '__main__': dataset = ["中國的北京是中國的首都","那里有一句話叫做“北京歡迎您”,北京啊北京", "北京歡迎您!相信夢想,夢,相信有夢就會有奇跡"] word_tf_idf,word_tf = TFIDF(dataset) print("=============tf-idf=============") for i in word_tf_idf: print(i) print("=============tf=============") for i in word_tf: print(i)
注:代碼主要目的是實(shí)現(xiàn)TF-IDF,對標(biāo)點(diǎn)符號等沒有進(jìn)行停用處理。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python啟動辦公軟件進(jìn)程(word、excel、ppt、以及wps的et、wps、wpp)
見如下源代碼,也可從附件中下載。2009-04-04python數(shù)據(jù)結(jié)構(gòu)算法分析
這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)算法分析,在python的數(shù)據(jù)結(jié)構(gòu)的章節(jié)中,我們上次學(xué)習(xí)到了python面向?qū)ο蟮乃枷?,即我們想用程序來?shí)現(xiàn)一個(gè)東西,我們需是用對象的特征來描述我們想構(gòu)建的對象。感興趣的小伙伴可以查看下面內(nèi)容</P><P>2021-12-12淺談python連續(xù)賦值可能引發(fā)的錯(cuò)誤
今天小編就為大家分享一篇淺談python連續(xù)賦值可能引發(fā)的錯(cuò)誤,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python?numpy下幾種fft函數(shù)的使用方式
numpy中有一個(gè)fft的庫,scipy中也有一個(gè)fftpack的庫,各自都有fft函數(shù),兩者的用法基本是一致的,下面這篇文章主要給大家介紹了關(guān)于Python?numpy下幾種fft函數(shù)的使用方式,需要的朋友可以參考下2022-08-08