【思考】tf/idf之于文本分类

因为工作中需要用到计算词语权重,进而作词与选择,思考了一下tf/idf。


首先还是简单介绍一下tf/idf。

这个概念最开始用于信息检索。tf表示term frequency,通常是指词频;idf表示inversed document frequency,是文档频率的倒数。计算方式如下:通常是对于一篇文档,统计某个词出现的次数,并用文档中的总词数作归一化,计算出的tf在(0,1)之间。同时,统计这个词在整个文档集合中出现在哪些文档当中,记录下这些文档的个数,用总文档数做归一化,作为df。直观上,某个词对于某个类别越重要,则他在这个类别的tf越高;对于df,如果df越大,表明他在各个文档中都有出现,那么他对目标文档的重要性越低。总之,某个词的重要程度与tf成正比,与df成反比,也就是与idf成正比。当然,idf计算之前还要取log值。这一点,在吴军的《数学之美》中解释,tf/idf的物理意义来自于信息论,是在某个特定情况下,是词语分布与文档分布的KL距离。关于这个信息论的解释,我在网上搜了好久,没有见到简洁的推导;自己想了想,也没有太想明白。关于tf/idf的详细介绍请参考维基百科。


tf/idf表征了词语和文档之间的关系,将它用于信息检索是很直观的事情。不过,我遇到的问题不实信息检索。如果是文本分类,用tf/idf选择某个类别的文本的特征词,如何?

与上面的问题相比,文本分类问题更复杂一些,因为除了词语、文档这两个原有的维度,又多了一个文档类别的维度。在文本分类的特征选择过程中,计算tf/idf,首先要面临的问题是,如何定义idf?即如何定义idf中的d,即“文档”这一概念。有不同种选择。我们先老老实实地沿用信息检索中的概念,文档就是一篇文章。那么接下来的问题是,在多大的范围内计算df?对于某个类别,用tf/idf来选择这个类别相关的特征词,tf的计算范围当然是仅限于这个类别中了,即统计这个类别的文章里面,特征词出现的次数。那df呢?可以是全局统计,也可以是在这个类别当中统计。如果是后者,似乎感觉怪怪的——即便是df很低,那只能说这个词在这个类别中出现的也不均匀,也不能说明它的重要啊。如果是全局统计,也存在类似的问题,就是不论df是大是小,都和当前的类别无关。tf/idf本来就是计算词语和文档的关系的,关类别鸟事?!


怎么办呢?

一种方法,很直观,把传统tf/idf中的“文档”的概念替换为“类别”的概念。df就表示当前特征词语在哪些类别中(而不是哪些文档中)出现了。tf自然是特征词在类别中出现的次数了。这样,沿用传统的公式,也就可以计算了。不过这样也不见得就好。通常来讲类别数目不多,特征词很容易就在所有类别中都出现过,这样计算出来的idf值是0,词语没有任何区分能力。而这个词明明是在当前类别中出现了很多次,在其他类别中虽然也出现了,但是出现的次数很少——总之一句话,这个词对当前类别是有区分能力的。还有问题,就是某个词语的df可能很大,不过这些df都是出现在同一个类别当中,这时候这个词语正式表征这个类别的特征词,但是计算出来的tf/idf值可能很小,无法作为特征词被选中。


又怎么办呢?

问题的根源在于,传统tf/idf是定义“词语——文档”两个维度的关系的,并且两个维度中不同词语和不同文档的数据都很多(统计起来也有区分力);而现在,扩展到了“词语——文档——类别”三个维度关系,并且类别的数目远小于其他两个维度的数目。上网上找了一下,这个问题在学术界,尤其是文本分类任务中,也有被发现,解决方法是扩充tf/idf的计算方式。扩充的思路就是加入词语和类别之间的分布信息;扩充的手法就五花八门,有很复杂的。不过个人喜欢一个简单的扩充:


原始idf计算:

idf (term) = log ( N / N_term )

其中N是文档集合中文档的数目,N_term是包含词语term的文档数目。


改进的idf计算:

idf (term) = log (N * M / N_term )

其中M是当前类别中包含词语term的文档数——这个要与最终计算的词语对该类别的权重成正比。


就想到这里了,写下来,备忘;也不知道说明白问题没有?!

你可能感兴趣的:(人工智能)