TF-IDF的神秘面纱

1. TF-IDF算法

TF-IDF算法:可以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类,也就可以作为文本的关键字。

相关步骤:

     1.TF(term frequency)词频统计: 文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,因此引入TF,计算单词的词频。

    2.IDF(inverse document frequency)逆文本频度:一个单词出现的文本频数越小,它区别不同类别文本的能力就越大。因此引入了逆文本频度IDF的概念。

如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0,说明这个词不那么重要。分母之所以要加1,是为了避免分母为0。

    3.TF-IDF

TF和IDF的乘积作为特征空间坐标系的取值测度。使用IDF作为权重乘以TF,实现对单词权重的调整,调整权值的目的在于突出重要单词,抑制次要单词。TF-IDF值与该词的出现频率成正比,与在整个语料库中的出现次数成反比

    4.求出关键字

计算出文章中每个词的TF-IDF值之后,进行排序,选取其中值最高的几个作为关键字。

    5.计算文章的相似性

计算出每篇文章的关键词,从中各选取相同个数的关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频,生成两篇文章各自的词频向量,进而通过欧氏距离或余弦距离求出两个向量的余弦相似度,值越大就表示越相似。

 2. 一例带你读懂TF-IDF

如果你还是没有理解的话,那就看看下面这个例子吧:

对于一长篇文章《中国的水稻种植》我们现在要提取他的关键词。最容易想到的就是找到出现次数最多的词。如果某个词很重要,它应该在这篇文章中多次出现。于是,我们进行"词频"(TF)统计。结果你肯定猜到了,出现次数最多的词是:"的"、"是"、"在"这一类最常用的词,他们对找到结果毫无帮助。

假设我们把它们都过滤掉了,只考虑剩下的有实际意义的词。又会遇到了另一个问题,我们可能发现"中国"、"水稻"、"种殖"这三个词的出现次数一样多。这是不是意味着,作为关键词,它们的重要性是一样的?

显然不是这样。因为"中国"是很常见的词,相对而言,"水稻"、"种殖"不那么常见。如果这三个词在一篇文章的出现次数一样多,有理由认为,"水稻"、"种殖"的重要程度要大于"中国",也就是说,在关键词排序上面,"水稻"、"种殖"应该排在"中国"的前面。

所以,我们需要一个重要性调整系数,衡量一个词是不是常见词。如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。 

就是在词频的基础上,要对每个词分配一个权重。最常见的词("的"、"是"、"在")给予最小的权重,较常见的词("中国")给予较小的权重,较少见的词("水稻"、"种殖")给予较大的权重。这个权重叫做"逆文档频率"(IDF)。

所以,将 TF和 IDF相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词。

3. TF-IDF应用

(1)搜索引擎;(2)关键词提取;(3)文本相似性;(4)文本摘要

4. 存在的问题

  • 没有考虑特征词的位置因素对文本的区分度
  • 按照传统TF-IDF,往往一些生僻词的IDF(反文档频率)会比较高、因此这些生僻词常会被误认为是文档关键词。

5. sklearn实现TF-IDF

sklearn中TF-IDF权重计算方法主要用到两个类:CountVectorizer和TfidfTransformer。

CountVectorizer类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素a[i][j],它表示j 词在i类文本下的词频。它通过fit_transform函数计算各个词语出现的次数,通过toarray()可看到词频矩阵的结果。

TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

x_train = ['TF-IDF 主要 思想 是','算法 一个 重要 特点 可以 脱离 语料库 背景',
           '如果 一个 网页 被 很多 其他 网页 链接 说明 网页 重要']
#将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer(max_features = 10)
#计算每一个词语出现的次数  fit_transform()方法用于计算每一个词语出现的次数
X = vectorizer.fit_transform(x_train)
#计算每一个词语的TF-IDF权值
transformer = TfidfTransformer()
tf_idf = transformer.fit_transform(X)
#查看数据结构将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
x_train_weight = tf_idf.toarray()

print('输出X_train文本变量:')
print(x_train_weight)

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值