前言
在自然语言处理领域,我们有一种类型的问题是如何在一堆文本中提取出核心词/句子。而无论是对于长文本还是短文本,往往几个关键词就可以代表整个文本的主题思想。同时,在很多推荐系统中,由于无法直接就整体文本进行利用,往往会现对文本进行汇总,常用的方法就是embedding或者关键词抽取,关键词提取的准确程度直接关系到推荐系统或者搜索系统的最终效果。让我们看下有哪些快速上手可用的方法。
TFIDF
TFIDF是term frequency inverse document frequency的简称,很好理解:term frequency dot inverse document frequency,文本频率与逆文档频率指数, TFIDF就是为了表征一个token(可以是一个字或者一个词)的重要程度。所以,当我们把doc中的每个词的重要程度算出来,倒序即可作为关键词。
Term Frequency
image
Inverse Document Frequency
image
分母 1是平衡未出现词
TF * IDF
TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。
实现
- Java版本:TfIdf
RAKE
RAKE是Rapid Automatic Keyword Extraction的简称,RAKE算法的亮点在于“R”,快速同时也有不俗的效果。
流程
- 切句切词:切句是以标点 停顿词 分割词做标记,切词是借助第三方切词工具,我python版实现的时候用的是jieba,Java版实现的时候用的是HanNlp
- 共现矩阵:构建共现矩阵
- 特征提取:基于词的词频freq、度deg 以及度与频率之比deg/freq三个特征
- 句的score:score = deg/freq
- 建议通过句长进行平衡
实现
- Java版本:RAKE
- Python版本:RAKE
TextRank
知道PageRank的同学,一定知道这么一个道理,网页点击行为是一个有向图,重要的网页会被各种网页链接到,比如baidu,所以我们求出有向图中节点的重要性就是网页的重要性。TextRank其实思想类似,只是把有向图换成了无向图,所以公式大家就应该很熟悉,和PageRank类似:
image
其中,d依旧是阻尼系数,但是大家发现多了w,这个其实是节点之间边的权重,因为无向图,文本分词后的词汇跳转我们假设是相互等同的。
实现
- 关键词提取:TextRankKeyWord
- 摘要句提取:TextRankSummary
以上的方法中,TFIDF只能对词进行提取,而RAKE和TextRank都可以抽词或者抽句。其实,以上方法都很简单,在数据量足够大的情况下,没有基于深度循环神经网络的算法效果好,但是强就强在易于上手,效果快速可见。
欢迎大家关注我的个人bolg,知乎,更多代码内容欢迎follow我的个人Github,如果有任何算法、代码疑问都欢迎通过邮箱发消息给我。