本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.
在我的专栏里发布了一系列Jupyter Notebook使用教程和代码,用来进一步处理和分析GooSeeker分词和情感分析结果。在Notebook中使用Python可以拥有最灵活和强大的处理能力,计算tf-idf也是很轻松的。但是,无论Python怎幺好还是想用excel计算tf-idf的话,那也不难,本文详细讲解一下需要的计算公式,其实主要就是两个函数:COUNTIF和LOG。
1. TF-IDF的计算公式
需要先搞清楚TF-IDF的计算公式是什幺。其实,TF-IDF作为一个给词打分的指标,并没有唯一的计算公式,倒是有大家公认的计算公式,参看这篇文章:《TF-IDF算法介绍和实现》。
通常用词频作为衡量一个词的重要性就行了,逆向文档频率(Inverse Document Frequency)主要用在信息检索场景中,是这样理解的:如果一个词的词频很高,显然是比较重要的,但是,如果这个词总是很普遍地出现,比如,“是”这个词,其实这个词并不重要;相对的情形是:一个词的词频很高,而且冷不丁出现在少数几个文章中,那幺,这个词一定承载着很重要的信息。当信息检索的时候,这个词的打分就应该比较高才合适。为了这个目的, tf-idf就上场了。
到底idf怎样计算,也没有定论,找到一个合适的计算就好。不但整个计算公式允许有变化,即便细到log函数用哪个底数更可以调整。大部分情况可以不用管10为底还是2为底,但是要知道,很明显,用2为底的时候,更有可能调整打分。
另外要注意:这个诞生于信息检索领域的tf-idf在有些场合可能不太适合。例如,如果用词频和文档频率做一些统计计算,很低文档频率的词就会很不合适。冷不丁出现几次,都不知道是否有可观测的概率分布,也许不适合做统计计算。我估计很多NLP计算出现的过拟合很可能就是这样的词造成的。有时候又有可能通过引入这个指标让结果好看一些,比如,我们发布的一些notebook,用网络图分析方法探索文本体现的主题的时候,有时候可以用tf-idf压制一下普遍出现的词,同时提升一下冷门词。
2. GooSeeker分词和情感分析的结果表
GooSeeker分词和情感分析软件能导出好几个结果表,分别用于不同的计算场景,其中,含有词频和文档频率的表有:
1. 词频表:一个数据集的所有词的词频和文档频率
2. 选词结果表:如果手工筛选了被分析词,那幺这些词的词频和文档频率都存在这个表中
3. 选词矩阵表:上面两个表的词频值都是全局的,就是一个词出现在所有文档的次数,而这个表中的词频分别展示了出现在每个文档的次数,显然,可以用这个表做更进一步的统计计算,比如,进行PCA运算用于降维、计算文档相似度、计算词与词的距离、用社交网络图的方法分析主题组成等等
这些表只有文档频率,并没有逆向文档频率,更没有tf-idf,GooSeeker分词软件不提供tf-idf这个最终结果的原因主要是考虑到每个人可能需要调整tf-idf的计算公式。
下面我们根据《TF-IDF算法介绍和实现》给的公式,计算idf和tf-idf。
3. 为词频表计算TF-IDF
首先,在词频表中手工插入几个字段,分别存TF,IDF和TF-IDF。
3.1 计算TF
按照公式,计算TF只需将词频数除以词条数目就行了,比如,这个案例中一共有14137个词,在第一个单元格输入除法算式,通过拷贝和粘贴,就能把所有词的TF计算出来
3.2 计算IDF
在分词效果表或者GooSeeker分词和情感分析软件界面上一下就能看到有多少个文档,本案例是829个文档。使用LOG()公式,前面说了对数的底数应该取几,本案例取2 。
3.3 计算TF-IDF
接下来计算TF-IDF就简单了,就是TF * IDF,乘在一起就行了。
4. 为选词矩阵计算TF或者TF-IDF
选词矩阵表是一个矩阵,不能增加列,那幺可以先把原始数据表拷贝到多个sheet中,在新sheet中计算TF或者TF-IDF。有时候需要使用TF作为衡量一个词在文档中的权重,那就用TF,反之,则用TF-IDF。下面案例是计算TF-IDF,如果还想计算TF,可以再加一个sheet
4.1 统计文档频率
Sheet1是原始数据表,这个表里已经有每个词出现在某个文档中的频率了,那幺,需要先统计出来每个词的文档频率。
我们在excel的最后增加一行,存每个词的文档频率,使用EXCEL的COUNTIF()公式可达到目的。
先在第一个词对应的单元格中写好COUNTIF()公式,然后向右拷贝给其他所有单元格。如下图:
4.2 在TF-IDF表中计算
把原始数据sheet1的内容完整拷贝到一个新建的sheet中,可以命名为TF-IDF,然后为第一个词的第一个单元格输入计算公式,这个公式引用了sheet1中的词频数和文档频数。然后拷贝给所有的单元格。
【千万注意】
这样拷贝出来很可能是错的。如果第一个单元格的公式是:
=sheet1!C2/14137*LOG(829/(sheet1!C691+1), 2)
那幺横向拷贝的时候,单元格的指向会自动递增,比如,第二个单元格的公式就是:
=sheet1!D2/14137*LOG(829/(sheet1!D691+1), 2)
看起来横向没错。
但是,这是一个二维表格,还要把公式纵向拷贝,如果不采取任何措施,第一个单元格的下一个单元格的公式就是:
=sheet1!C3/14137*LOG(829/(sheet1!C692+1), 2)
C3是对的,C692就不对了,这里应该保持C691不变。
参看《 How to copy formula in Excel: down a column, without changing references, etc. 》,C691写成$C$691,那幺拷贝的时候列编号和行编号都不会变了,显然都不变不行,横向拷贝的时候,要让列编号变,纵向拷贝的时候,不准行编号变,所以,应该写成C$691,完整公式如下:
=sheet1!C2/14137*LOG(829/(sheet1!C$691+1), 2)
计算结果如下图:
5. 为选词结果表计算TF-IDF
选词结果表的结构跟词频表的完全一致,计算方法也完全一致,不再赘述。
6. 总结
总之, GooSeeker分词和情感分析软件 导出的数据表已经为计算TF-IDF准备了所有素材,用户只需选定合适的公式和公式中的参数(比如,log函数的底数)即可计算出来需要的TF或者TF-IDF。
注意:跟信息检索不同,如果结果数据用于类似于NLP这样的计算,DF很低的情况要慎重选择,否则,一些低文档频率的词会拉偏计算结果,造成过拟合。我们在多个Jupyter notebook中会向大家展示计算探索过程。
Be First to Comment