TF-IDF算法(Term Frequency-Inverse document Frequency,词频-逆文档频率算法)是一种基于统计的计算方法,常用于评估在一个文档集中一个词对某份文档的重要程度,由两部分组成:TF算法以及IDF算法。
- TF算法是统计一个词在一篇文档中出现的频次,其基本思想是,一个词在文档中出现的次数越多,则其对文档的表达能力也就越强。
- IDF算法则是统计一个词在文档集的多少个文档中出现,其基本思想是,如果一个词在越少的文档中出现,则其对文档的区分能力也就越强。
TF算法和IDF算法也能单独使用,在最早的时候就是如此。但是在使用过程中,学者们发现这两种算法都有其不足之处。TF仅衡量词的出现频次,但是没有考虑到词的对文档的区分能力。比如针对下面这篇文档:
世界献血日,学校团体、献血服务志愿者等可到血液中心参观检验加工过程,我们会对检验结果进行公示,同时血液的价格也将进行公示。
上文中“献血”“血液”“进行”“公示”等词出现的频次均为2,如果从TF算法的角度,他们对于这篇文档的重要性是一样的。但是实际上明显”血液“”献血“对这篇文档来说更关键。而IDF则是相反,强调的是词的区分能力,但是一个词既然能在一篇文档中频繁出现,那说明这个词能够很好地表现该篇文档的特征,忽略这一点显然也是不合理的。于是,学者们将这两种算法综合进行使用,构成TF-IDF算法,从词频、逆文档频率两个角度对词的重要性进行衡量。
1.TF的计算常用式:
其中,表示词i在文档j中的出现频次,分母部分统计文档中每个词出现次数的总和,也就是文档的总词数。还是以上文文档为例,”献血“一词出现次数为2,文档的总词数为50,则tf(献血)=n(献血)/n(总)=2/30=0.067。更直白的表示方式是,tf(word)=(word在文档中出现的次数)/(文档总词数)。
2.IDF的计算常用式:
为文档集中总文档数,为文档集中出现词i的文档数量。如果一个词越常见,那么分母就越大越接近,逆文档频率就越小越接近0。分母加1是采用了拉普拉斯平滑,避免有部分新的词没有在语料库中出现过而导致分母为零的情况出现,增强算法的健壮性。
3.TF-IDF算法的具体计算方法:
以上文文档为例,经过计算得到“献血”“血液”“进行”“公示”四个词出现的频次均为2,因此他们的tf值都是0.067。现假设我们具有的文档集有1000篇文档,其中出现“献血”“血液”“进行”“公示”的文档数分别为10、15、100、50,则idf(献血)=log(1000/10)=10,idf(血液)=4.20,idf(进行)=2.30,idf(公示)=3.00。得到这些信息后,计算每个词的tf-idf值,可以知道”献血“的tf-idf值最高,为最适合这篇文档的关键词。当然,关键词数量可以不止一个,可以根据tf-idf值由大到小排序取前n个作为关键词。
1.加载相关模块,其中functools模块主要是使用了其cmp_to_key函数,因为在python3中sorted函数废弃了cmp参数,我们可使用该函数来实现cmp的功能。
2.读入一个数据集,其由多个文本组成,并对所有的输入文本分词。
3.分完词之后,每个文档都可以表示为一系列词的集合。一般在算法开始前,还需要去除停用词,一般是使用一个受控停用表来对词进行筛选。现在中文自然语言处理中较常用的一个停用词表就是哈工大的停用词表,包含了大部分中文文本中常见的干扰词。除了停用词表外,也可以使用词性对词进行进一步筛选,例如在关键词提取中,可以尝试只要名词性的词语,其他词语视为干扰次过滤掉。
4.使用预处理完成的数据来训练算法,TF-IDF的训练主要是根据数据集生成对应的IDF值字典,后续计算每个词的TF-IDF时,直接从字典中读取。
5.cmp函数是为了输出top关键词时,先按照关键词的计算分值排序,在得分相同时,根据关键词进行排序。
6.完整的TF-IDF实现方法。根据具体要处理的文本,计算每个词的TF值,并获取前面训练后的IDF数据,直接获取每个词的IDF值,综合计算每个词的TF-IDF。TF-IDF类传入参数主要有三个:idf-dic为前面训练好的idf数据;word_list为经过分词、去除干扰词后的待提取关键词文本,是一个非干扰词组成的列表;keyword_num决定要提取多少个关键词。
7.进行封装
8.进行关键词提取
执行结果如下,不选择词性过滤,各种词性的词都可能被选为关键词:
这是使用词性过滤再次去除干扰词,仅选择名词作为关键词的结果: