关键词提取算法

Table of Contents

概述

TF-IDF算法

传统算法

加权变种

TextRank算法

PageRank

TextRank

LSA/LSI/LDA算法

LSA/LSI

LDA


概述

关键词是代表文章重要内容多一组词,对文本聚类、分类、自动摘要等起重要的作用。现实中大量文本不包含关键词,如果我们可以准确的将所有文档都用几个简单的关键词描述出来,就能使人们便捷地浏览和获取信息。类似于NLP其它处理技术,关键词提取算法一般也可以分为有监督和无监督两类。

有监督的关键词提取方法主要是通过分类的方式进行,通过构建一个较为丰富和完善的词表,然后通过判断每个文档和词表中每个词都匹配程度,以类似打标签的方式,达到关键词提取的效果。这种方法精度较高,但是需要大批量的标注数据。另外,每天都有大量新的信息出现,人工维护词表需要很高的人力成本。相对于有监督的方法,无监督的方法既不需要维护词表,也不需要人工标准语料辅助训练。因此这类算法在工程中应用较广,常见的无监督学习算法有TF-IDF算法、TextRank算法和主题模型算法。

TF-IDF算法

传统算法

TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频次算法)是一种基于统计的计算方法,常用于文档集中一个词对某份文档的重要程度。详参TF-IDF与余弦相似性的应用(一):自动提取关键词

加权变种

传统的TF-IDF算法仅考虑了词的两个统计信息,对文本的信息利用程度很少。在某些特定的场景中,加上一些辅助信息,例如每个词的词性、出现的位置等,能对关键词提取的效果起到很好的提高作用。在文本中,名词作为一种定义现实实体的词,带有更多的关键信息,可以赋予更高的权重;在一些场景中,文档的起始段落河末尾段落比其它部分的文本更重要,可以对出现在这些位置等词赋于更高权重。结合具体场景,对算法进行合适的改造,可以对结果产生更好的作用。

TextRank算法

TF-IDF算法需要统计每个词在语料库中的多少个文档中出现过,主题模型要通过对大规模的文档学习来发泄文档的隐含主题。TextRank与这些算法有一点不同:它可以脱离语料库的背景,仅对单篇文档进行分析就可以提取该文档的关键词。该算法最早用于文档的自动摘要,基于句子维度的分析,利用TextRank对每个句子进行打分,挑选出分数最高的n个句子作为文档的关键句,以达到自动摘要的效果。其基本思想来源于Google的PageRank。

PageRank

PageRank是一种网页排名算法,网页质量的评估是遵循以下两个假设的:

  1. 数量假设:一个节点(网页)的入度(被链接数)越大,页面质量越高
  2. 质量假设:一个节点(网页)的入度的来源(哪些网页在链接它)质量越高,页面质量越高

详参PageRank算法简介及Map-Reduce实现

TextRank

当TextRank应用到关键字抽取时,每个词不是与文档中所有词都有链接。那么如何界定链接关系?学者们提出了一个窗口的概念。在窗口中的词相互间都有链接关系。得到了链接关系,就可以套用TextRank的公式,对每个词的得分进行计算。最后选择得分最高的n个词作为文档的关键词。

节点 i 的权重取决于节点 i 的邻居节点中 i-j 这条边的权重 / j 的所有出度的边的权重 * 节点 j 的权重,将这些邻居节点计算的权重相加,再乘上一定的阻尼系数,就是节点 i 的权重,阻尼系数 d 一般取 0.85。

TextRank 用于关键词提取的算法如下:

(1)把给定的文本 T 按照完整句子进行分割,即:

(2)对于每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词,其中 ti,j 是保留后的候选关键词。

(3)构建候选关键词图 G = (V,E),其中 V 为节点集,由(2)生成的候选关键词组成,然后采用共现关系(Co-Occurrence)构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为 K 的窗口中共现,K 表示窗口大小,即最多共现 K 个单词。

(4)根据 TextRank 的公式,迭代传播各节点的权重,直至收敛。

(5)对节点权重进行倒序排序,从而得到最重要的 T 个单词,作为候选关键词。

(6)由(5)得到最重要的 T 个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词。

LSA/LSI/LDA算法

在某些场景,关键词不一定会显示的出现在文档中,这种情况下,前面两种算法显然不能提取出隐含的主题信息,这时就需要用到主题模型。前两种算法仅用到了文本中的统计信息,并没有用到文本的语义信息。主题模型认为在词与文档之间没有直接的联系,它们应当还有一个维度将它们串联起来,将这个维度称为主题。每个文档都应该对应着一个或多个的主题,而每个主题都会有对应的词分布,通过主题,就可以得到每个文档的词分布。

P(w | d)=P(w | t)*P(t | d)

在一个已知的数据集中,每个词和文档对应的P(word | doc)都是已知的。主题模型就是更具这个已知的信息,通过计算P(w | t)和P(t | d)的值来得到主题的词分布和文档的主题分布信息。现在常用的方法有LSA(LSI)和LDA,前者主要采用SVD(奇异值分解)进行暴力破解,后者则是通过贝叶斯学派的方法对信息进行拟合。

LSA/LSI

LSA(Latent Semantic Analysis,潜在语义分析)和LSI(Latent Semantic Index,潜在语义索引)都是对文档的潜在语义进行分析,但是潜在语义索引在分析后,还会利用分析的结果建立相关的索引。二者通常被认为是同一种算法,只是应用的场景越有不同。

LSA的主要步骤:

  1. 使用BOW模型将每个文档表示为向量;
  2. 将所有的文档词向量拼接起来构成词-文档矩阵(m*n)
  3. 对词-文档矩阵进行奇异值分解(SVD)操作([m*r].[r*r].[r*n])
  4. 根据SVD结果,将词-文档矩阵映射到一个更低维度k([m*k].[k*k].[k*n],0<k<r)的近似SVD结果,每个词和文档都可以表示为k个主题构成的空间中的一个点。通过计算每个词和文档的相似度。可以得到每个文档中对每个词的相似度结果,取相似度最高的一个词即为文档的关键词。

LSA的优点:

  • 相对于传统SVM(空间向量模型)对语义信息利用的缺失,LSA通过SVD将词、文档映射到低维的语义空间,对词和文档进行更本质的表达,大大降低计算的代价,提高分析质量。

LSA的缺点:

  • SVD的计算复杂度非常高,特征空间维度较大,计算效率十分低下;
  • LSA得到的分布信息是基于已有数据集,当一个新的文档进入到已有的特征空间时,需要对整个空间重新训练,来得到加入新文档后对应的分布信息;
  • LSA对词的频率分布不敏感、物理解释性薄弱的问题。

为了解决这些问题,在LSA的基础上进行改进,提出pLSA算法,通过使用EM算法对分布信息进行拟合替代了使用SVD进行暴力破解。在pLSA基础上,又引入了贝叶斯模型,实现了现在主题模型的主流方法-LDA(Latent Derichlet Allocation,隐含狄利克雷分布)。

LDA

LDA 算法假设文档中主题的先验分布和主题中词的先验分布都服从狄利克雷分布。根据贝叶斯学派的方法,通过先验的狄利克雷分布和观测数据得到的多项式分布,得到一组Dirichlet-multi共轭,并据此来推断文档中主题的后验分布和主题中词的后验分布,也就是我们最后需要的结果。

结合吉布斯采样的LDA模型训练过程:

  1. 随机初始化,对语料中每篇文档中的每个词w,随机的赋予一个topic编号z。
  2. 重新扫描语料库,对每个词w按照吉布斯采样公式重新采样它的topic,在语料中进行更新。
  3. 重复以上语料库的重新采样过程知道吉布斯采样收敛。
  4. 统计语料库的topic-word共现频率矩阵,该矩阵就是LDA的模型。

接下来就可以按照一定的方式对新文档的主题进行预估,具体步骤如下:

  1. 随机初始化,对当前文档中的每个词w,随机地赋一个主题编号z。
  2. 重新扫描当前文档,按照吉布斯采样公式重新采样它的主题。
  3. 重复以上过程,直到吉布斯采样收敛。
  4. 统计文档中的主题分布即为预估结果。

在我们得到主题对词的分布后,也据此得到词对主题的分布。接下来,就可以通过这个分布信息计算文档与词的相似性,继而得到文档最相似的词列表,最后就可以得到文档的关键词。

参考:Python自然语言处理实战

猜你喜欢

转载自blog.csdn.net/ZJL0105/article/details/82230237