TF-IDF

自然语言处理的领域

TF-IDF

要介绍的 TF-IDF 算法就是自然语言处理早期的产物,而下一次要介绍的 Word2Vec 算法则是当前最流行的预训练语言模型的前身

算法原理

TF-IDF(Term frequency–inverse document frequency),中文翻译就是词频 - 逆文档频率,是一种用来计算关键词的传统方法

在早期处理诸如新闻文本的时候,由于文本的长度一般都很长,要想从内容中获取有价值的信息就需要从中提取关键词,进而使用关键词来表示这篇内容的核心价值。同时,提取关键词也可以看作一种降维的方式,提取完关键词之后,使用关键词再进行文本分类等算法。

考虑一下,我们是一家新闻机构,每天都有大量的新闻要发布,根据这些内容,我们来看一下如何计算 TF-IDF。

TF(Term Frequency): TF 的意思就是词频,是指某个词(Term)在一篇新闻中出现的次数。当然,新闻的长度各不相同,为了更加公平,我们可以对 TF 做一下标准化,用词频除以这篇新闻的总词数。

但是,单纯地使用词频来作为关键词的特征明显是不合理的,考虑一些非常常见的词,比如说 “你的”“我的”“今天” 这种词,可能在一篇新闻中会反复出现,但是这种词明显并不重要,于是有了 IDF。

IDF(Inverse Document Frequency): IDF 称为逆文档频率,这个词我们用公式来看一下可能更容易理解。

在这里插入图片描述

如果一个词越普通,那它越可能出现在所有的新闻中,那么分母就越大, IDF 的值就越接近 0。
当然,单纯地使用 IDF 作为关键词也不靠谱,如果你自己随便造了一个没人听过的词加在新闻中,比如说 “墎碶”,那么上式的分母非常小,所得到的 IDF 值会非常大,但是这个词明显没有什么意义。

于是, TF-IDF 就是结合了这两个结果,使用 TF×IDF 作为最终的结果,可以看到, TF-IDF 与一个词在新闻中出现的次数成正比,与该词在整个语料上出现的次数成反比。

经过上面这两个值的计算,并把两个值乘起来, TF-IDF 就计算结束了

算法优缺点

优点

  • 非常明显, TF-IDF 的优点就是算法简单,十分容易理解,而且运算速度非常快。

缺点

  • TF-IDF 也有比较明显的缺点,比如在文本比较短的时候几乎无效,如果一篇内容中每个词都只出现了一次,那么用 TF-IDF 很难得到有效的关键词信息;另外 TF-IDF 无法应对一词多义的情况,尤其是博大精深的汉语,对于词的顺序特征也没办法表达。

python代码实现

这里我们使用 text8 数据包,是一个来自 Wikipedia 的语料,大小有 30M 多,总共 1701 条数据。第一次使用需要下载,可能要花费一点点时间。

from ctypes import string_at
import gensim.downloader as api
from gensim.corpora import Dictionary
dataset=api.load('text8')
dct=Dictionary(dataset)
new_corpus = [dct.doc2bow(line) for line in dataset]

from gensim import models
tfidf=models.TfidfModel(new_corpus)
tfidf.save('tfidf.model')
tfidf = models.TfidfModel.load('tfidf.model')
tfidf_vec=[]
for i in range(len(new_corpus)):
	string_tfidf = tfidf[new_corpus[i]]
	tfidf_vec.append(string_tfidf)
print(tfidf_vec)

在这里插入图片描述

在输出的结果中,一条数据就是一篇内容的所有词的 TF-IDF 值,其中每一个单元有两个值,左边是这个词的 ID,右边是这个词的 TF-IDF 值。细心的你可能会发现,我们输入的内容长度可能会与输出的结果长度不一致,这是因为 Gensim 中的 TF-IDF 算法会过滤停用词、去掉单个的字母等,所以最终结果会缺失一部分。当然,那些词我们认为也不会是关键词,所以在提取关键词的时候也不需要关心。

我们在例子中使用的是英文的语料,如果你想要处理中文,可以安装一个 jieba 分词工具,然后使用 jieba 分词工具把中文语料进行切分,之后的处理步骤就与前面的过程一样了。

import jieba
seglist = jieba.cut ("这是一句话,看你切成啥" , cut_al l =Fal se)
print ("DefaultMode : " + " " . join(seglist) ) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值