GooSeeker分词和情感分析的结果怎样计算tf-idf

2022-8-18 15:28| 发布者: Fuller| 查看: 4038| 评论: 0

摘要: GooSeeker分词和情感分析软件导出的数据表已经为计算TF-IDF准备了所有素材,用户只需选定合适的公式和公式中的参数(比如,log函数的底数)即可计算出来需要的TF或者TF-IDF。 ... ...

我们发布了一系列Jupyter Notebook使用教程和代码,用来进一步处理和分析GooSeeker分词和情感分析结果。在Notebook中使用Python可以具有最灵活和强大的处理能力,计算tf-idf也是很轻松的。但是,无论Python怎么好还是想用excel计算tf-idf,那也不难,本文详细讲解一下计算方法。

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个词(【注意】:严格地说,应该把这14137个词出现的次数累加起来才是本语料含有的总词数,但是这样会得到一个很大的数值,导致下面算出来的数值都会变小一个倍数。当数太小,假设小数点后面有好多零,导致不容易观察,而且也容易有更大的累积误差。所以,选用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中会向大家展示计算探索过程。

2

鲜花

握手

雷人

路过

鸡蛋

刚表态过的朋友 (2 人)

最新评论

GMT+8, 2024-12-22 11:58