你说广州塔,我知道是在广州,你说黄果树瀑布,我知道是在贵州,你说布达拉宫,我知道是在拉萨,你说公交车,我都不知道你在说哪个城市的公交车。这就是TF-IDF。
概念及原理
TF-IDF全称Term Frequency and Inverse Document Frequency,直译过来就是’词频-逆向文件频率’,’TF’是指某一个给定的词语在该文件中出现的频率,’IDF’是指总文件数除以包含该词的文件数,再取对数。TF-IDF一般用来评估在一堆语料库或一堆文件集中,某个字词对于该语料库或该文件的重要程度。怎么理解呢,举个例子,假设现在手上有10篇文章,‘水果’这个词在某一篇文章出现的频率很高,但是在这10篇文章中的仅有2篇文章提到,那么‘水果’这个词的TF-IDF会很高,如果10篇文章中有8篇提到‘水果’这个词,那么这个词的‘TF-IDF’会相对偏低。主要思想就是,一个词越能将一篇文章与其他文章区分开来,那么这个词的权重越高。
计算公式
TF计算:
(markdown编辑数学公式还不怎么熟,先用mathtype搞好再截图吧)比如上面的例子,’水果’,’硬盘’在文章1(共有10个词)中出现的次数分别为2次,4次,那么:
IDF计算:
如果这10篇文章中,有2篇文章包含有’水果’这个词,有5篇包含’硬盘’这个词,那么:
TF-IDF计算
算好TF和IDF之后,就可以计算’水果’和’硬盘’的TF-IDF了,只需要将TF和IDF相乘就ok。
所以’水果’的TF-IDF为:
‘硬盘’的TF-IDF为:
如果算’水果’和’硬盘’这两个词与文章1的相关性呢,很简单,只要将这两个词的TF-IDF加起来。
python中计算TF-IDF
使用的工具
- jieba
- scikit-learn
切词
其实切词只是计算TF-IDF的前期准备工作,在对中文文本进行TF-IDF计算的话,切词这一步应该是怎么也逃不过去了。平常工作中基本都是用jieba切词,这里也打算用jieba对文本进行处理。
例如我现在有5个文本:
首先需要对文本进行切词,切词代码及结果如下:
准备工作做好之后,我们就可以进行TF-IDF计算了。
词语转矩阵
词语转矩阵需要用到CountVectorizer这个函数,其作用是统计词汇的数量,并转为矩阵。
通过type(vector_location)可以看到,函数fit_transform把result二维数组表示成一个稀疏矩阵:
同时可以看下,vercot_location的输出结果:
输出结果表示的是这个稀疏矩阵的第几行第几列有值,比如(0, 27) 1表示矩阵的第0行第27列有值。
转成矩阵的形式之后,我们就可以很容易地算出每个词对应的TF-IDF了,这里使用TfidfTransformer函数进行计算。
如果需要把稀疏矩阵转成平常用的行列形式的矩阵的话。这里可以使用todense()或者toarray()函数,前者是将稀疏矩阵转成matrix的形式,后者是将稀疏矩阵转成ndarray的形式
这里还有一个问题,就是我怎么知道每个权重对应的是哪个词呢?这里可以将词作为列名,将数组转成Dataframe进行查看。
源代码
最后照例附上本次分析的源代码