关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来。这个可以追溯到文献检索初期,当时还不支持全文搜索的时候,关键词就可以作为搜索这篇论文的词语。因此,目前依然可以在论文中看到关键词这一项。
除了这些,关键词还可以在文本聚类、分类、自动摘要等领域中有着重要的作用。比如在聚类时将关键词相似的几篇文档看成一个团簇,可以大大提高聚类算法的收敛速度;从某天所有的新闻中提取出这些新闻的关键词,就可以大致了解那天发生了什么事情;或者将某段时间内几个人的微博拼成一篇长文本,然后抽取关键词就可以知道他们主要在讨论什么话题。
总之,关键词就是最能够反映出文本主题或者意思的词语。但是网络上写文章的人不会像写论文那样告诉你本文的关键词是什么,这个时候就需要利用计算机自动抽取出关键词,算法的好坏直接决定了后续步骤的效果。
关键词抽取从方法来说大致有两种:
第一种是关键词分配,就是有一个给定的关键词库,然后新来一篇文档,从词库里面找出几个词语作为这篇文档的关键词;
第二种是关键词抽取,就是新来一篇文档,从文档中抽取一些词语作为这篇文档的关键词;
目前大多数领域无关的关键词抽取算法(领域无关算法的意思就是无论什么主题或者领域的文本都可以抽取关键词的算法)和它对应的库都是基于后者的。从逻辑上说,后者比前者在实际使用中更有意义。
从算法的角度来看,关键词抽取算法主要有两类:
有监督学习算法,将关键词抽取过程视为二分类问题,先抽取出候选词,然后对于每个候选词划定标签,要么是关键词,要么不是关键词,然后训练关键词抽取分类器。当新来一篇文档时,抽取出所有的候选词,然后利用训练好的关键词抽取分类器,对各个候选词进行分类,最终将标签为关键词的候选词作为关键词;
无监督学习算法,先抽取出候选词,然后对各个候选词进行打分,然后输出topK个分值最高的候选词作为关键词。根据打分的策略不同,有不同的算法,例如TF-IDF,TextRank等算法;
本文主要介绍2种无监督的学习算法:TF-IDF和TextRank
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术,常用于挖掘文章中的关键词,而且算法简单高效,常被工业界用于最开始的文本数据清洗。
TF-IDF有两层意思,一层是**“词频”(Term Frequency,缩写为TF),另一层是"逆文档频率"**(Inverse Document Frequency,缩写为IDF)
假设我们现在有一片长文叫做《量化系统架构设计》,词频高的词在文章中往往是停用词,如“的”,“是”,“了”等,这些在文档中最常见但对结果毫无帮助、需要过滤掉的词,用TF可以统计到这些停用词并把它们过滤。当高频词过滤后就只需考虑剩下的有实际意义的词。
但这样又会遇到了另一个问题,我们可能发现"量化"、“系统”、"架构"这三个词的出现次数一样多。这是不是意味着,作为关键词,它们的重要性是一样的?事实上系统应该在其他文章比较常见,所以在关键词排序上,“量化”和“架构”应该排在“系统”前面,这个时候就需要IDF,IDF会给常见的词较小的权重,它的大小与一个词的常见程度成反比。
当有TF(词频)和IDF(逆文档频率)后,将这两个词相乘,就能得到一个词的TF-IDF的值。某个词在文章中的TF-IDF越大,那么一般而言这个词在这篇文章的重要性会越高,所以通过计算文章中各个词的TF-IDF,由大到小排序,排在最前面的几个词,就是该文章的关键词。
第一步,计算TF:
T F = c o u n t ( t ) c o u n t ( d i ) TF = \frac{count(t)}{count(d_{i})} TF=count(di)count(t)
其中,式中, c o u n t ( t ) count(t) count(t)表示文档 d i d_i di中包含词 t t t的个数; c o u n t ( d i ) count(d_i) count(di)表示文档 d i d_i di的词的总数;
第二步,计算IDF:
I D F = n u m ( c o r p u s ) n u m ( t ) + 1 IDF = \frac{num(corpus)}{num(t) + 1} IDF=num(t)+1num(corpus)
式中, n u m ( c o r p u s ) num(corpus) num(corpus)表示语料库corpus中文档的总数; n u m ( t ) num(t) num(t)表示语料库corpus中包含词 t t t的文档的数目;
第二步,计算TF-IDF:
将每个词的TF和IDF相乘,就可以得到每个词 t t t的TF-IDF值。
应用到关键词抽取:
预处理,首先进行分词和词性标注,将满足指定词性的词作为候选词;
分别计算每个词的TF-IDF值;
根据每个词的TF-IDF值降序排列,并输出指定个数的词汇作为可能的关键词;
优缺点:
TF-IDF的优点是简单快速,而且容易理解。缺点是有时候用词频来衡量文章中的一个词的重要性不够全面,有时候重要的词出现的可能不够多,而且这种计算无法体现位置信息,无法体现词在上下文的重要性。
一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。令一种解决方法是,使用word2vec算法来支持。
TextRank算法本质上是 PageRank算法,经过修改可以用于关键词提取,以及自动摘要提取。因此,我先介绍PageRank算法。
PageRank最开始用来计算网页的重要性。整个www可以看作一张有向图,节点是网页。如果网页A存在到网页B的链接,那么有一条从网页A指向网页B的有向边。
PageRank的计算公式:
S ( V i ) S(V_i) S(Vi)是网页 i i i的中重要性(PR值)。 d d d是阻尼系数,一般设置为0.85。 I n ( V i ) In(V_i) In(Vi)是存在指向网页 i i i的链接的网页集合。 O u t ( V j ) Out(V_j) Out(Vj)是网页 j j j中指出去的链接网页集合。 ∣ O u t ( V j ) ∣ |Out(V_j)| ∣Out(Vj)∣是集合中元素的个数。
PageRank需要使用上面的公式多次迭代才能得到结果。初始时,可以设置每个网页的重要性为1。上面公式等号左边计算的结果是迭代后网页 i i i的PR值,等号右边用到的PR值全是迭代前的。
一句话形象描述上述公式:所有指向网页 i i i的网页 j j j,网页 j j j的重要性除以网页 j j j向外指出链接的个数的值的累积和作为网页 i i i的重要性。
TextRank 是由 PageRank 改进而来,其公式有颇多相似之处 :
W S ( V i ) = ( 1 − d ) + d × ∑ V j ∈ I n ( V i ) w j i ∑ V k ∈ O u t ( V j ) w j k W S ( V j ) WS(V_i) = (1 - d) + d \times \sum_{V_j \in In(V_i)} \frac{w_{ji}}{\sum_{V_k \in Out(V_j)} w_{jk}} WS(V_j) WS(Vi)=(1−d)+d×Vj∈In(Vi)∑∑Vk∈Out(Vj)wjkwjiWS(Vj)
节点 i i i的权重取决于(节点 i i i的邻居节点中 i − j i-j i−j这条边的权重 / / / j j j的所有出度的边的权重 )* 节点 j j j的权重,将这些邻居节点计算的权重相加,再乘上一定的阻尼系数,就是节点 i i i的权重;阻尼系数 d 一般取0.85;
类似于PageRank的思想,将文本中的语法单元(可以是词或者句子)视作图中的节点,如果两个语法单元存在一定语法关系(例如共现),则这两个语法单元在图中就会有一条边相互连接,通过一定的迭代次数,最终不同的节点会有不同的权重,权重高的语法单元可以作为关键词(句子)。
可以看到,节点的权重不仅依赖于它的入度结点,还依赖于这些入度结点的权重,入度结点越多,入度结点的权重越大,说明这个结点的权重越高。
算法通用流程:
标识文本单元,并将其作为顶点加入到图中;
标识文本单元之间的关系,使用这些关系作为图中顶点之间的边,边可以是有向或者无向,加权或者无权;
基于上述公式,迭代直至收敛;
按照顶点的分数降序排列;
1.本模型使用共现关系,如果两个顶点相应的语义单元共同出现在一个窗口中(窗口大小从2-10不等),那么就连接这两个顶点;
2.添加顶点到图中时,需要考虑语法过滤,例如只保留特定词性(如形容词和名词)的词;
把给定的文本 T 按照完整句子进行分割,即 T = [ S 1 , S 2 , ⋯   , S m ] T = [S_1,S_2,\cdots,S_m] T=[S1,S2,⋯,Sm]
对于每个句子 S i ∈ T S_i \in T Si∈T ,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词,即 S i = [ t i , 1 , t i , 2 , ⋯   , t t , n ] S_i = [t_{i,1},t_{i,2},\cdots,t_{t,n}] Si=[ti,1,ti,2,⋯,tt,n],其中 t i , j t_{i,j} ti,j是保留后的候选关键词
构建候选关键词图 G = ( V , E ) G = (V,E) G=(V,E),其中 V V V为节点集,由上步生成的候选关键词组成,然后采用共现关系构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为 k k k的窗口中共现, k k k表示窗口大小,即最多共现 k k k个单词
根据上面的公式,迭代传播各节点的权重,直至收敛
对节点权重进行倒序排列,从而得到最重要的 T T T个单词,作为候选关键词
由上步得到最重要的 T T T个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词
上面最后一步相当于是对 TextRank 结果进行处理,或者可以考虑候选关键词在文本中出现的位置来进一步处理,一般出现在文档靠前以及靠后的词更重要.
提取关键词短语的方法基于关键词提取,可以简单认为:如果提取出的若干关键词在文本中相邻,那么构成一个被提取的关键短语。
如果是生成摘要,则将文本中的每个句子分别看做一个节点,如果两个句子有相似性,那么认为这两个句子对应的节点之间存在一条无向有权边。考察两个句子的相似度就有很多方法了。
常见的方法是:
分子是在两个句子中都出现的单词的数量。 ∣ S i ∣ |S_i| ∣Si∣是句子 i i i的单词数。
其主要步骤如下:
预处理:将输入的文本或文本集的内容分割成句子 T = [ S 1 , S 2 , ⋯   , S m ] T = [S_1,S_2,\cdots,S_m] T=[S1,S2,⋯,Sm],构建图 G = ( V , E ) G = (V,E) G=(V,E),其中 V V V为句子集,对句子进行分词、去除停止词,得 S i = [ t i , 1 , t i , 2 , ⋯   , t t , n ] S_i = [t_{i,1},t_{i,2},\cdots,t_{t,n}] Si=[ti,1,ti,2,⋯,tt,n],其中 t i , j t_{i,j} ti,j是保留后的候选关键词。
句子相似度计算:构建图 G G G中的边集 E E E,给定两个句子 S i , S j S_i,S_j Si,Sj,采用上述公式进行计算句子之间的相似度;若两个句子之间的相似度大于给定的阈值,就认为这两个句子语义相关并将它们连接起来,边的权值即为句子的相似度
句子权重计算:根据TextRank的公式,迭代传播权重计算各句子的得分;
抽取摘要句:将3得到的句子得分进行倒序排序,抽取重要度最高的 T T T个句子作为候选摘要句。
形成摘要:根据字数或句子数要求,从候选摘要句中抽取句子组成摘要。
详见参考文献【2】。该篇文章还给出了jieba的TF-IDF和TextRank源码分析。
【1】TF-IDF与余弦相似性的应用(一):自动提取关键词
【2】结巴分词5–关键词抽取
【3】TextRank算法总结
【4】PageRank与TextRank算法