上节课中,带大家完整实现了TF-IDF算法,并对TF-IDF值的进行排序,提取了topK的关键词。但是还遗留了一个问题,就是程序输出的结果,和我们预判的不一致,这节课,我们就来分析和解决这个BUG。

BUG分析

在计算IDF时,为了防止出现除0错误,在分母上加了1。log((N/(num+1))可能会出现三种取值:

(1)语料库足够大,N/(num+1)>1,IDF为正数,num越大,IDF值越小。

(2)语料库较小,仅有一篇文档不包含某个词,N/(num+1)=1,IDF为0,乘以任何数依然为0,导致TF值失效。

(3)语料库较小,每个文档中都含有某个词,N/(num+1)<1,IDF为负数,TF越大,TF-IDF值反而越小。

经过以上分析可以看出,要保证TF-IDF的本来含义,我们要保证IDF值为正数,也就是log()内的分数大于1。

方案一

N>=num,(N+2)/(num+1)>1,分子分母都加上某一个常数,相对大小不变,num越大,分数值越小。

方案二

TF-IDF的设计,本身就具有很多缺陷,其中一个就是在计算IDF时,如果语料库是同一主题,主题词会在不同文档中被重复提及,就会导致IDF值很小,从而降低重要性。

针对这个问题,研究者提出了改进的加权算法TF-IWF(Term Frequency - Inverse Word Frequency)。

IWF = log(语料库中所有词的个数/某个词在整个语料库中出现的次数)

这种加权方法,即使语料库中每个文档都包含主题词,IWF也不会接近0,更加精确的表达了重复出现的主题词,在整个语料库中的重要程度。

代码示例

1、计算IWF

内容不可见,请联系管理员开通权限。

2、计算TF-IWF

内容不可见,请联系管理员开通权限。

3、提取topK关键词

内容不可见,请联系管理员开通权限。

以上我们用两种方法,解决了IDF为0或负数导致的BUG,但是这个BUG只会在语料库非常小的情况下才会出现。在真实项目中,语料库都是比较大的,一般不会出现这个问题。所以后面流程,还是沿用上节课讲的通用的TF-IDF算法,来完成这个项目。这节课给大家讲的两个方案,只是为了帮助大家建立分析问题,解决BUG的思维模式。

本文链接:http://edu.ichenhua.cn/edu/note/554

版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!