自然语言处理之——关键词提取(二)

340 阅读8分钟

一. 摘要

在通常的情况下,使用TF-IDF和TextRank算法就可以完成大部分关键词提取的任务。但还会有一些特殊场景,仅基于文档本身的关键词提取还不够准确和全面。例如记录国家地理的文档,文档中会有新疆、辽宁、四川等地名的频次会很高,但文中并不会显示的出现地理等词语。此场景下TF-IDF和TextRank算法就不能够全面的发现主题信息,这时候就需要用到主题模型。

image.png

图1:主题模型映射示意图

二. 主题模型概述

TF-IDF和TextRank算法这两种模型是直接根据词与文档的关系,对关键词进行抽取。这两种算法的原理仅用到了文档中的统计信息,对文档本身所包含的信息无法充分的利用,尤其是其中的语义信息,对文档关键词的提取是一种分厂有用的信息。相较TF-IDF和TextRank算法,主题模型认为在词与文档之间是没有直接的联系,它们还存在着一个维度将其关联,主题模型将这个维度称为主题。并且每个文档都对应着一个或多个主题,每个主题都会有对应的词分布。所以通过主题就可以得到每个文档的词分布。根据这样的原理。便得到了主题模型的核心表达式

image.png

图2:主题模型表达式

在一个已知的文本数据集中,每个词和文档对应的P(wi|dj)都是已知的。而主题模型就是通过这个已知的信息,计算P(wi|tk)和P(tk|dj)的值,从而得到主题的词分布和文档的主题分布信息。想要得到这个的分布信息,目前常用的方法就是LSA(LSI)和LDA。其中LSA主要是采用SVD(奇异值分解)进行暴力破解,而LDA采取通过贝叶斯的方法对分布信息拟合。

三. LSA/LSI算法

LSA(Latent Semantic Analysis,潜在语义分析)和LSI(Latent Semantic Index,潜在语义索引),二者原理相似,只是所应用的场景不同,LSA是在需要构建的相关任务中的叫法。LSA和LSI都是对文档的潜在语义进行分析,但是潜在语义索引在分析后,还会利用分析的结果建立相关的索引。

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个主题构成的空间中的一个点,通过计算每个词和文档的相似度,可以得到每个文档中对每个词的相似度结果,将相似度最高的词当作文档的关键词。

和传统的SVM模型比较,SVM对语义信息利用缺乏。LSA通过SVD将词、文档映射到一个低维的语义空间,可以将词、文档进行更本质的表达,提高分析质量。

四. BOW模型

BOW(Bag-of-word)模型,是信息检索领域常用文档表示方法。在信息检索中,BOW模型假定对于一个文档,忽略它的词语顺序和语法等要素,将其仅仅看作是若干词汇的一个集合,文档中每个词语的出现都是独立的,不依赖其它词语。

例子:句子1:“我喜欢坐高铁回家”。;句子2:“中国高铁非常快”。

句子1分词:“我、喜欢、坐、高铁、回家”;

句子2分词:“中国、高铁、非常、块”。

根据上述两句出现的词语,构建一个字典:{“我”:1,“喜欢”:2,“坐”:3,“高铁”:4,“回家”:5,“中国”:6,“非常”:7,“快”:8}

该字典中包含8个词,每个词都有唯一索引,并且它们出现的顺序是没有关联的,根据这个字典,我们将上述两句重新表达为两个向量:

[1,1,1,1,1,0,0,0]

[0,0,0,1,0,1,1,1]

这两个向量共包含8个元素,其中第i个元素表示字典中第i个词语在句子中出现的次数,因此BOW模型认为是一种统计直方图。在文本检索和处理中,可以通过该模型很方便的计算词频。 五. SVD奇异值分解

SVD奇异值分解可用于降维算法的特征分解。首先回顾下特征值和特征向量的定义如下:

image.png

其中A是一个n×n矩阵,x是一个n维向量,则λ是矩阵A的一个特征值,而x是矩阵A的特征值λ所对应的特征向量。

求出特征值和特征向量有什么好处呢? 我们可以将矩阵A特征分解。如果我们求出了矩阵A的n个特征值λ1<=λ2<=λ3<=...λn,以及这n个特征值所对应的特征向量w1,w2,w3,...wn。

那么矩阵A就可以用下式的特征分解表示:

image.png

其中W是这n个特征向量所张成的n×n维矩阵,而Σ为这n个特征值为主对角线的n×n维矩阵。

一般我们会把W的这n个特征向量标准化,即满足||wi||2=1,此时W的n个特征向量为标准正交基,满足WTW=I,这样我们的特征分解表达式为:

image.png

这里的矩阵A必须为方阵才可以进行特征分解。

如果A不是方阵,即行和列不相同时,我们还可以对矩阵进行分解吗?此时我们就需要借助的SVD思想解决了。

SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵A是一个m×n的矩阵,我们定义矩阵A的SVD为:

image.png

有其中U是一个m×m的矩阵,Σ是一个m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值,V是一个n×n的矩阵。U和V都是酉矩阵,即满足UTU=I,VTV=I。

image.png

图3:SVD分解图

那么后面的主要任务就是求得SVD分解后得到的U、Σ、V三个矩阵。

如果我们将A的转置和A做矩阵乘法,那么会得到n×n的一个方阵ATA。既然ATA是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:

image.png

这样我们就可以得到矩阵ATA的n个特征值和对应的n个特征向量v了。将ATA的所有特征向量张成一个n×n的矩阵V,就是我们SVD公式里面的V矩阵了。一般我们将V中的每个特征向量叫做A的右奇异向量。

如果我们将A和A的转置做矩阵乘法,那么会得到m×m的一个方阵AAT。既然AAT是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:

image.png

这样我们就可以得到矩阵AAT的m个特征值和对应的m个特征向量u了。将 AAT的所有特征向量张成一个m×m的矩阵U,就是我们SVD公式里面的U矩阵了。一般我们将U中的每个特征向量叫做A的左奇异向量。

由于Σ除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值σ就可以了。

image.png

这样我们可以求出我们的每个奇异值,进而求出奇异值矩阵Σ。

对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前10%甚至更少的的奇异值的和就占了全部的奇异值之和的99%以上的比例。这样我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。

image.png

其中k要比n小很多,也就是一个大的矩阵A可以用三个小的矩阵来表示。

image.png

图4:SVD表示图

上述是NLP中的算法潜在语义索引使用SVD求解的基础内容。

六. 总结

LSA是通过SVD方法暴力破解,可以直接的求出近似的分布信息。但作为一个初级的主题模型,还存在一下的不足:SVD的计算复杂度很高,计算效率低下;LSA得到的分布信息是基于已有数据集的,当一个新的文档进入到已有的特征空间时,需要对整个空间重新训练;LSA对词频分布敏感。