NLP基础:TFIDF 关键词抽取原理与实践

首页 / 技术 / 正文

原理分析

引论

当你向度娘/谷歌的搜索框里输入关键词,按下搜索按钮时,你是否想过这样一个问题:搜索引擎是如何快速找出与这个关键词相关的文章并进行排序的?


搜索示例

如果你从未接触过自然语言处理相关的知识,大概很容易想到一个简单粗暴的方法 ,只要逐个对互联网上的页面内容进行搜索,就能找出包含这个关键词信息的所有文章。但是,每天都有数以亿计的人对着搜索引擎频繁发问,互联网信息又十分庞杂,就像上面这幅图,谷歌直接在半秒钟内,就检索到了500多万条结果。那么可想而知,采用这种笨方法进行检索势必是无法达到这样的效果的。

于是有人想到,可以事先提取出互联网上所有页面的关键词,再用关键词进行检索,如此一来就能事半功倍了,是不是很有道理?那么问题来了,互联网的信息这么庞杂,要是人工一个一个页面标注关键词,那得到什么时候去了啊...于是乎,为了解决这个问题,便有人提出了一种叫做TF-IDF的方法

详解

TF-IDF是一个文本特征指标,顾名思义,由两部分组成,一部分是TF(Term Frequency, 词频),另一部分是IDF(Inverse Document Frequency, 逆文本频率)。

词频的含义很好理解,就是某个关键词在当前页面中出现的频率,它的公式如下所示,其中i表示第i个词,j表示第j篇文章,也就是说,对于每篇文章的每个关键词,都会有一个TF词频指标。
$$\rm{TF_{i,j}=\frac{n_{i,j}}{{\textstyle \sum_{k}n_{k,j}}}}$$

IDF叫做“逆文本频率”,看名字就不太好理解了。实际上它表示的是关键词的信息量(读者可以自行了解信息论中信息熵的内容),它的计算方法如下所示。其中i表示第i个词,j表示第j篇文章,|D|表示文档数,分母部分表示包含该词的文档数。不难看出,每个关键词都会有一个IDF值,因此对比TF来看,IDF数据量会小很多。
$$IDF_i=ln\frac{|D|}{|\{j:t_i\in d_j\}|}$$

最后,词频乘上信息量,就可以得到每篇文章中每个词的TFIDF值了,对每篇文章所有词按其TFIDF进行排序,取前面几个便可以作为该篇文章的关键词了。

Python实战

全部源码可在 Github下载

语料准备

首先我们需要准备一些待分析的文档,这里我写了个爬虫,抓取了来自mrxwlb.com八月份的新闻联播文本数据,代码在 这里

Jieba分词

Jieba是个很好用的分词库,可以直接用pypi安装,食用方法和效果如图所示,详细说明可参考项目的Github项目页

pip install jieba


Jieba

停用词过滤

停用词指的是一些分析意义不大的词,例如“的”、“啊”、“吗”等,在进行关键词抽取时一般需要去掉。国内的一些科研机构已经整理出了比较常用的停用词库,可以在Github搜到,按Star数排序可以看到最热门的是 这个

计算TF-IDF

最后就可以按照上面的基本原理统计TF-IDF了,实际处理过程中还需要去除单字词。计算完成后将每篇文章的TFIDF数据进行排序,取前N个,即可构成这篇文章的关键词。详细源码见 Github

从下图可以看到效果还是不错的,不过还是会存在一些噪声,可以简单地把噪声词汇列入停用词库解决这个问题,不过,这就需要花心思构建自己领域专用的停用词库了。


效果.png

总结延伸

本篇文章只是作为一个入门引入,除了关键词抽取,TFIDF还可以做很多事情。经过上面的一系列过程,读者其实不难发现,TFIDF可以把大量信息浓缩成几个词,而我们的关键词抽取只不过是选取了TFIDF排在前面的几个词而已。

那么延伸一下,也就是说,TFIDF还可以做到把不定长的信息,转化为定长的信息,而我们又知道,很多机器学习模型都需要输入固定长度的向量才能进行训练,如此一来,TFIDF其实就可以作为一个通用的文本特征提取模型,应用在各个领域了。

打赏
评论区
头像
    头像
    y1yec
    2022年12月22日 22:28
    回复

文章目录