TF-IDF原理及python实战

TF-IDF是一种统计方法,用来评估一个字词对于一个文本集或者一个语料库中的的其中一份文件的重要程度。
【TF-IDF原理及python实战】TF-IDF主要思想:如果某个词或短语在一篇文章中出现的频率(TF)高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF实际上是:TF * IDF
TF:(Term Frequency),词频。表示词条t在文档d中出现的频率
IDF:(Inverse Document Frequency),逆向文本频率。
IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力
如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处. 在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。
如何计算呢??
计算TF:
TF-IDF原理及python实战
文章图片

计算IDF:
TF-IDF原理及python实战
文章图片

计算TF-IDF:
TF-IDF原理及python实战
文章图片

TF-IDF实战
有很多方法可以计算TF-IDF的预处理,比如genism和scikit-learn包中,这里使用scikit-leart中的两种方法进行TF-IDF的预处理
第一种方法为CountVectorizer+TfidfTransformer的组合方式进行,代码如下所示:

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer# 语料库 def txt(): f = open('weibo.txt', 'r', encoding='utf-8') corpus = [] for i in f: i = i.strip().split('\t')[1] corpus.append(i) print(corpus) f.close() return corpus# 创建停用词表 def stop_words_list(filepath): stopWords_list = [word.strip() for word in open(filepath, 'r', encoding='utf-8')]# 获得停用词列表 # print(stopWords_list) return stopWords_list# 使用包函数进行计算 corpus = txt() words = CountVectorizer().fit_transform(corpus) tfidf = TfidfTransformer().fit_transform(words) print(tfidf)

注释:weibo.txt的内容结构如下图所示:
TF-IDF原理及python实战
文章图片

输出的tfidf结果如下:
TF-IDF原理及python实战
文章图片

在(index1,index2)中:index1表示为第几个句子或者文档,index2为所有语料库中的单词组成的词典的序号,之后的数字为该词所计算得到的TF-idf的结果值
第二种方法为:直接调用TfidfVectorizer,代码如下:
from sklearn.feature_extraction.text import TfidfVectorizer# 语料库 def txt(): f = open('weibo.txt', 'r', encoding='utf-8') corpus = [] for i in f: i = i.strip().split('\t')[1] corpus.append(i) print(corpus) f.close() return corpus# 创建停用词表 def stop_words_list(filepath): stopWords_list = [word.strip() for word in open(filepath, 'r', encoding='utf-8')]# 获得停用词列表 # print(stopWords_list) return stopWords_list# 使用包函数进行计算 corpus = txt() tfidf = TfidfVectorizer().fit_transform(corpus)# 得到词频矩阵, print(tfidf)

输出结果是一样的

    推荐阅读