NLP从零开始------7基础文本处理之关键词提取

1.关键词提取技术简介

        在现代。文本是海量的信息中量最大的、使用最广泛的一种数据类型。这些信息数据虽然能为人们的生活提供便利。但是在提取有价值的信息时仍面临着困难。通过关键词提取可以快速地提取一篇新闻的关键信息。

        关键词是能够反应文本主题或内容的词语。关键词这个概念是随着信息检索学科的出现而被提出,关键词提取是从单个文本或一个语料库中,根据核心词语的统计和语义分析,选择适当的,能够完整的表达主题内容的特征项的过程。

        关键词提取技术的应用非常广泛,主要应用对象可以分为人类用户和机器用户。在面向读者的应用中,要求所提取的关键词具有很高的可读性、信息性和简约性。 关键词提取技术的主要应用有新闻阅读、广告推荐、历史文化研究、论文索引等领域。在NLP中,关键词作为中间产物,应用也非常广泛,主要应用有文本聚类、文本分类、机器翻译、语音识别等领域。

        由于关键词具有非常广泛的用途,因此开发出一套实用的关键词提取系统非常重要。这就要求关键词提取算法不仅在理论上正确,更要求在工程上具有很好的实践效果。 关键词提取系统的实用性主要表现在以下4个方面:

        1.可读性。一方面,由于中文的字与字之间是没有空格隔开的,需要分词工具对文本进行切分,而分词工具对于专有名词的切分准确率还很低。另一方面,词的表达能力也非常有限,如“市场/经济”,任何一个词“市场”或“经济”都无法表达整个短语的含义。因此,系统所提取出的关键词的可读性对系统的实用性是一个很大的考验。不需要人工标注语料辅进行训练。

        2.高速性。系统应该具有较快的速度,能够及时处理大量的文本。如一个针对各类新闻的关键词提取系统,当新闻产生后,应该能在数秒内提取出该新闻的关键词,才能保证新闻的实时性。            3.学习性。实用的关键词提取系统,应该能处理非常广泛的领域的文本,而不是仅仅局限于特定领域。随着社会的高速发展,各种未登录词、网络新词频频出现,系统应具有较强的学习能力。

         4.健壮性。系统应该具有处理复杂文本的能力,如中、英文混杂,文本、图表、公式混杂的文本。

2.关键词提取算法

        关键词能概括文本的主题,因而能帮助读者快速辨别出所选内容是不是感兴趣的内容。目前较常用的无监督关键词提取算法有TF-IDF算法,TextRank算法和主题模型算法(包括LSA、LSI、LDA等)。

2.1 TF-IDF算法

        TF-IDF算法是基于统计的最传统也是最经典的算法,拥有简单有迅速的优点。TF-IDF算法的主要思想是字词的重要性随着它在文档中出现次数的增加而上升,并随着它在语料库中出现频率的升高而下降。

        算法主要流程如下:

        2.1.1 词频

        词频是统计一个词在一篇文档中出现频次的统计量。一个词在一篇文档中出现的频次越高,其对文档的表达能力越强。词频统计量的计算公式如下:

                                                                

        其中,   表示词  ,在文档 中出现的频次,表示文档的总词数。

        2.1.2 逆文档频率

        逆文档频率是统计一个词出现在文档集中文档频次的统计量。一个词在文档集中越少的出现在文档中,说明这个词对文档的区分能力越强,逆文档频率统计量的计算公式如下所示:

                                                         

        其中,表示文档集中的总文档数,表示文档集中文档出现词的文档个数,分母加一是为了避免文档集中没有出现词 ,导致分母为零的情况。

        

2.1.3 模型建立

        词频TF注重词在文档中的出现频次,没有考虑到词在其他文档下的出现频次,缺乏对文档的区分能力。逆文档频率IDF则更注重词的区分能力。 两种算法各有不足之处。

        假设有如下文档:“在山里,孩子们能享受的快乐只有大山和水,多数时候孩子们都是快乐的,他们的想法都是简单且容易满足的,他们总是期望了解大山外面的世界。”。 文中“孩子们”“快乐”“都是”“他们”“大山”几个词出现次数都是2,文档总词数是60。由逆文档频率统计量公式可知,这几个词语tf值都为0.033,但实际上在这段文本中,“孩子们”“快乐”“大山”这3个词语更为重要。 同样地,假设文档集共有2000篇文档,出现“孩子们”“快乐”“都是”“他们”“大山”这几个词的文档数分别为60、30、250、200、20,那么每个词的值分别为1.516、1.810、0.901、0.998、1.979。 按照IDF算法计算,“大山”“孩子们”“快乐”比较重要,而“都是”“他们”这类文档中常见的词语,就被赋予较低的idf值。

        综合权衡词频、逆文档频率两个方面衡量词的重要程度,TF-IDF算法的计算公式如下所示。                                                        

        根据TF-IDF算法计算公式,上列中每个词语的tf值和idf值相乘,得到5个词语的TF-IDF值分别为0.0455、0.0543、0.027、0.0299、0.0594。因此,选取TF-IDF值中相对较大的前3个关键词,即“大山”“孩子们”“快乐”作为这篇文档的关键词。 通常,关键词的数量按照TF-IDF值降序排序,选出前几个值较大的作为关键词,也可以根据实际情况确定数量。

        TF-IDF算法倾向于过滤常用的词语,保留相对重要的词语,它实际上只考虑了词的出现频次、出现文档的个数这两个信息,对文本内容的利用程度较低。 因此,利用更多的信息进行关键词提取,会对提升关键词提取的效果有很大帮助,如考虑每个词的词性、词的位置信息和出现场合等。 当考虑词的词性时,可以对名词赋予较高的权重,名词往往含有更多的关键信息。 当考虑词的位置时,同样对文本的起始和末尾位置的词赋予较高的权重,始末位置的词往往更为重要。在实际应用中,可以结合应用情况,对算法进行适当的调整,从而达到更好的提取效果。

2.2TextRank算法

        TextRank算法是一种基于图的文本排序算法,它可以用于自动摘要和提取关键词。 TextRank算法与TF-IDF算法比较,TextRank算法不同的地方在于,它不需要依靠现有的文档集提取关键词,只需利用局部词汇之间的关系对后续关键词进行排序,随后从文本中提取词或句子,实现提取关键词和自动摘要。 TextRank算法的基本思想来自Google的PageRank算法。

2.2.1 PageRank算法

        PageRank算法最初是在1997年,由Google创始人拉里·佩奇和谢尔盖・布林构建早期的搜索引擎时提出的链接分析算法。最早的搜索引擎是人工对网页进行分类,从而将不同质量的网站区别开。 随着互联网的发展,人工分类的方法开始无法处理与日俱增的网站。搜索引擎采用计算用户查询关键词和网页内容的相关性的方法给出搜索结果,但这种方法有其局限性。 因此,Google创始人开始研究网页排序问题,PageRank算法由此诞生。该算法是标识网页重要性的一种网页排名算法,也是用于衡量一个站点好坏的标准。通过PageRank算法计算网页的重要性,使更重要的网页在结果搜索中靠前出现。

        将每一个网页视为一个节点,将网页之间的链接看作有向边,网页之间将构成一张有向图,即网页链接图,如下图所示,网页的得分越高,表示该网页重要程度越高。

              

        网页A自身网页得分为0.86,分别被网页C和网页D链接到,那么网页A会将其得分平均地贡献出去,网页C和D各获得得分0.42。网页B自身得分为0.6,同样将自身得分平均地贡献给链接到的网页,这时网页C和D各获得得分0.3。 将网页C和D各自获得的总得分,作为其网页得分。网页C有两个输出链接,网页D有3个,它们将按照链接的个数,再次平均地分配给接下来链接到的网页,以此类推。

        要获取网页链接图,通常会遇到以下两个问题。 未知上一个网页的初始得分。在计算网页得分时需要得知上一个链接网页的得分,这时就需要对该方法进行调整。首先,将所有网页的初始得分设置为1,再以迭代的方式求得每个网页的分数,或控制最大迭代次数,最终得到网页的总得分。 孤立网页没有得分。在计算过程中会遇到一些孤立网页,它没有输入链接和输出链接,网页得分将会被计算为0,这时需要对PageRank算法进行调整,加入阻尼系数,使得孤立网页也有网页得分。

        PageRank算法的基本思想包括两方面内容。一方面,一个网页被越多其他的网页链接,说明这个网页越重要。另一方面,一个网页被越高权值的网页链接,说明这个网页越重要。根据PageRank算法的基本思想,计算一个网页的PageRank值的公式如下所示。

                                 

        其中,S(V_{i})为网页 V 的得分,V_{j}为链接到网页的 V_{i},网页 In(V_{i})为网页 V_{i}的入链集合,Out(V_{j})为网页V_{j}的出链集合,Out(V_{j})是出链网页的数量,d 为阻尼系数,表示某一网页链接到其他任意网页的概率,取值范围在 0~1 之间。假设 V_{i} 是指网页 C,那么 V_{j}是指网页 A 和网页 B。每一个网页将所有入链得分加起来,就是网页自身的得分,再将自身的得分平均地分配给每一个出链。

  2.2.2 TextRank算法

        TextRank算法通过将文本切分成若干个词或句子建立图模型,采取投票的方式,对文档中的重要成分进行排序,进而实现关键词提取。 TextRank算法与PageRank的算法思路类似,不同之处在于,TextRank算法实现关键词提取时,需要考虑链接词的重要性和词之间的相似性,它将构成一个加权图,而PageRank算法构成有向无权图。

        TextRank算法在计算每个词的链接词得分时,通过赋予不同权重的方式分配得分,不再采取PageRank算法平均分配的方式,并且TextRank算法默认所有词之间都存在链接关系。 两个词之间的权重越大,相似度则越高。用  W_{ji}表示权重,其他部分与PageRank算法类似。TextRank关键词提取算法公式如下所示。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        其中,    WS_{V_{i}}为词 V_{i} 的得分,V_{j} 为链接到的V_{i}词,为词的入链集合,为词V_{j}的出链集合,是出链的数量,d为阻尼系数,表示某个词链接到其他任意词的概率,取值范围在0~1之间。

        TextRank关键词提取算法步骤如下。 将给定的文本内容T依照完整句子切分开,即 T=\left \{ S_{1},S_{2},...,S_{n} \right \} 。 对每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留特定词性的词,如名词、动词、形容词。记 ,其中是保留后的候选关键词。 构建候选关键词图G=(V,E),其中V为节点集,由上步生成的候选关键词组成,然后采用共现关系构造任意两点之间的边,两个节点之间存在边当且仅当候选关键词在长度为k的窗口中时共现(k表示窗口大小,即最多共现k个词)。 根据TextRank关键词提取算法公式,初始化权重,迭代地计算各个节点的权重,直到收敛为止。 对节点的权重进行降序排序,得到最重要的前n个候选关键词。 查看这n个候选关键词是否有相邻出现的情况,相邻出现则组合成为多词关键词,否则单独成为关键词。

     

2.3 主题模型算法

        TF-IDF算法和TextRank算法在文本处理领域各有其优势,但它们在某些情况下可能无法有效捕捉文本的深层语义信息。例如,当一篇讨论各种水果及其功效的文章并未直接使用“水果”这一关键词时,这两种算法就难以准确识别出这一主题。

        主题模型算法提供了一种解决上述问题的方法。它们基于这样的理念:文档由多个主题组成,每个主题可以看作是词的概率分布。在这一框架下,文档中每个词的出现都是通过两个步骤的概率选择过程:首先文档以一定的概率选择了一个主题,然后在这个主题下以一定的概率选择了特定的词。这种算法能够自动分析文档,统计词语出现的频率,并据此判断文档中包含哪些主题以及各主题所占的比例。

        直观来看,如果一篇文章围绕一个中心思想展开,那么与之相关的特定词语会出现得更频繁。例如,一篇关于汽车的文章可能会更频繁地使用“汽车”和“驾驶”等词汇。通常情况下,一篇文章会包含多个主题,每个主题所占的比例也不尽相同。主题模型通过数学方法捕捉这种特点,反映在文档中关键词的出现频率上。

        常见的主题模型包括:潜在语义分析(LSA),概率潜在语义分析(PLSA),潜在狄利克雷分布(LDA),基于深度学习的lda2vec.所有这些主题模型都基于两个基本假设:每个文档都包含多个主题,而每个主题又由多个词组成。LSA和潜在语义索引(LSI)虽然在实践中可能被视为相同的算法,但它们在应用场景上有所不同,LSI在分析文档的潜在语义后,还会利用这些分析结果来构建相关的索引。

        主题模型的优势在于它们能够揭示文档中隐含的主题结构,即使某些关键词并未直接出现,也能够通过词的概率分布来推断文档的潜在主题,这对于文本挖掘和信息检索等领域具有重要意义

        

2.3.1 LSA算法

        2.3.1.1 词语-文档矩阵

        LSA算法使用向量表示词和文档,词袋(Bag of Words,BOW)模型是文本向量化的最简单的模型。 BOW模型就是将一个文本中的所有词语装进一个袋子里,不考虑其词法和语序的问题,每个词语都是独立的,将每一个单词都进行统计,同时计算每个单词出现的次数。 BOW模型首先对文本进行分词,然后统计每个词在文档中出现的次数。

        如有两个短文本,通过分词后得到如下结果。 张三/喜欢/外出/旅行,李四/也/喜欢/外出/旅行。 张三/喜欢/看电影。

        将这两个短文本所有词语装进一个袋子里,构成一个BOW。BOW中包含了七个不重复的词{张三、喜欢、外出、旅行、李四、也、看电影}。BOW模型规定每个文本向量长度为词袋中词的个数,文本向量的分量对应词袋中词出现的次数。 例如,在第一个短文本中,“喜欢”“外出”“旅行”3个词语在第一个短文本中出现了两次,“张三”“李四”“也”3个词语出现了一次,“看电影”一词则没有出现。 在BOW中对应的位置上标上词的出现次数,得到第一个短文本对应的向量为[1, 2, 2, 2, 1, 1, 0]。在第二个短文本中,“张三”“喜欢”“看电影”3个词各出现了一次,其他词语出现次数都为0,得到第二个短文本对应的向量为[1, 1, 0, 0, 0, 0, 1]。 因为BOW模型不考虑词语的顺序,所以得到的向量不会保存原始句子中词的顺序。

        每个文本可以利用BOW模型得到一个向量,将所有文本的向量合在一起即可得到一个词语-文档矩阵。 例如,有词语-文档矩阵如下表所示,共有4个词和4个文档,词语-文档矩阵的每一列为文档(文本)的向量,每一行表示词在文档中出现的次数。

文档1

文档2

文档3

文档4

词语1

0

1

1

2

词语2

1

1

0

0

词语3

1

2

0

2

词语4

0

1

1

1

2.3.1.2  矩阵奇异值分解

        如果在语料库中给出m个词和n个文档,可以构造一个m×n阶矩阵A,其中每行代表一个词,每列代表一个文档。当拥有词语-文档矩阵A即可开始思考文本潜在的主题。但是词语-文档矩阵 极有可能非常稀疏、噪声很大,并且在很多维度上非常冗余。 因此,为了找出能够捕捉词和文档关系的少数潜在主题,希望能降低矩阵 的维度。线性代数中的一种截断奇异值分解(Singular Value Decomposition,SVD)技术可以达到矩阵奇异值分解从而降维的目的。

        设矩阵A为一个m×n 阶的矩阵,其中的元素全部属于实数域或复数域,那么矩阵A的SVD如下式所示。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        其中,U是一个m×m 阶正交矩阵(行向量和列向量皆为正交的单位向量) 是m×n 阶半正定对角矩阵(对角元素为非负的对角阵),其主对角线上的每个元素称为奇异值, 是 阶正交矩阵,U的列向量称为左奇异向量,的列向量称右奇异向量,并且满足

        SVD有如下性质。 一个 m×n阶矩阵至多有 个不同的奇异值,每个主题包含多个词。 奇异值包含着矩阵中的重要信息,值越大表示越重要。 词语-文档矩阵A经过SVD后的U和  的维度较大,需要进行降维,原因有以下几点。 原始的词语-文档矩阵维度太大并且过于稀疏,计算复杂度过高,无法准确地反映每个词是否出现在某些文档之中。 矩阵降维可以对矩阵数据进行去噪,得到重要特征。 矩阵降维可以降低同义词和多义词的影响,减少数据冗余。

        截断奇异值分解,就是奇异值从大到小排序,取前 个非零奇异值对应的奇异向量代表矩阵A的主要特征,如下式所示。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        左奇异向量矩阵U代表词的部分特征,矩阵中的每一列由m个词按照一定的权重组合而来,它们相互独立并且各代表一个潜在语义,这 r个潜在语义共同构成一个语义空间。 中间的奇异值矩阵包含了词和文档的重要程度的信息,其数值越大,重要程度越高。右奇异向量矩阵  则代表文档的部分特征。 通过SVD可以得到文档、词与主题、语义之间的相关性。通过这些文档向量和词向量,应用余弦相似度等度量评估不同文档的相似度、不同单词的相似度和词语与文档的相似度

 2.3.1.3 LSA算法步骤

        LSA关键词提取算法的具体步骤如下。

        利用BOW模型将文档集中每个文档表示为向量。

        将文档集中的所有词语和文档向量构成一个是m×n阶的词语-文档矩阵。其中,文档集中的每一篇文档作为矩阵的列,文档集中的所有词语作为矩阵的行。

        采用SVD,将该矩阵分解为3个矩阵,分别是 m×r阶左奇异矩阵、r ×r阶奇异值对角矩阵、r ×n 阶右奇异矩阵。

        根据SVD的结果,取前 个非零奇异值对应的向量,用于代表该矩阵的主要特征,构建潜在语义空间,计算每个词语和每个文档之间的相似度,相似度最高的词将作为该文档的关键词。

        以下举例说明LSA关键词提取算法实现过程。 假设有词语-文档矩阵如下表所示,共有城市、密集型、必须、我国、行业、轨道交通、运营、里程这8个词,d1~d7分别代表了7个文档。矩阵中每一行代表词在对应文档中出现的次数,每一列表示每一个文档包含了哪些词。

词语

文档

d1

d2

d3

d4

d5

d6

d7

城市

0

0

1

1

0

0

1

密集型

0

0

1

1

0

0

0

必须

0

0

1

2

0

0

0

我国

1

0

0

0

0

0

1

行业

0

0

1

1

1

1

0

轨道交通

1

0

1

1

0

0

1

运营

0

1

0

0

1

0

0

里程

0

2

0

0

0

0

0

        对词语-文档矩阵进行SVD,选取奇异值最大的3项,得到分解后的3个矩阵,从左到右分别是左奇异矩阵、奇异值矩阵和右奇异矩阵。

​​​​​​​

        观察左奇异矩阵表和右奇异矩阵表可以发现,每个词和每个文档都可以用用一个三维向量表示,如“城市”一词可用向量表示为(-0.42,-0.35,-0.55),文档d1可用向量表示为(-0.15,0.06,-0.59)。 这说明,通过SVD将每个词和每个文档都映射到一个三维空间上。可以将这个三维空间看作是一个三维语义空间,3个维度的潜在语义可以表示为如下形式。 第一维度:-0.42×城市+0.05×密集型-0.18×必须-0.11×我国+0.83×行业-0.18×轨道交通-0.22×运营-0.01×里程。 第二维度:-0.35×城市+0.01×密集型+0.17×必须-0.2×我国+0.03×行业+0.09×轨道交通+0.68×运营+0.58×里程。 第三维度:-0.55×城市+0.02×密集型+0.3×必须-0.41×我国-0.44×行业-0.27×轨道交通-0.42×运营+0.01×里程。

        当词与文档同在一个空间上的时候,可以获得两个比较重要的信息。 一是当两个词或两个文档在空间上的距离比较近的时候,可以认为两个词是近义词或两个文档有较高的相似度。 二是当一个词与某个文档在空间上的距离比较近的时候,可以认为这个词是文档的关键词。 取左、右奇异向量矩阵的第二、第三个维度,投影到同一平面上,将各个词和文档标注在图中,距离相近的用椭圆线画出来,得到左、右奇异向量的空间投影图,如图所示。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        在左、右奇异向量空间投影图中,词与词之间或文档之间的距离相近,说明它们具有较高的相似度。文档d1和d7距离最近,相似度最高,因而被聚为一类。 同样地,文档d3、d4和d6也被聚为一类。而“城市”“轨道交通”“我国”3词距离很近,相似度高,也被聚为一类。 依照左、右奇异向量矩阵后两个维度的距离信息,可以近似地提取出文档中的近义词。另一方面,计算每个词语和每个文档之间的相似度,相似度较高的词可以认为是该文档的关键词。 LSA算法利用SVD将词语、文档映射到更低维度的空间。低维空间去除了部分噪声,大大降低计算代价,也更容易发现同义词和相似的主题,更好地剖析词语和文档中的潜在语义。

        LSA模型仍存在许多不足之处。 SVD计算复杂度高,尤其对于文本处理,SVD用于高维度矩阵时效率较低。当新文档进入特征空间时,需要重新训练模型。 没有解决多义词的问题,每一个词语仅仅对应映射空间中的一个点,多个含义的词语在映射空间中没有区分开。 LSA受BOW模型的影响,会忽略文档中句子的先后顺序。 LSA缺乏严谨的统计基础,难以直观进行解释。

2.3.2 LDA模型

2.3.2.1 LDA模型

        由于LSA算法存在诸多不足,于是产生了PLSA算法,它是一个概率模型算法,采用更为符合文本特性的多项式分布和最大期望算法(Expectation-Maximization algorithm,EM)算法拟合概率分布信息,使得模型中的变量的概率分布都有更好的解释。 但PLSA算法仍然不够完善,它只能生成所在文档集的文档的模型,当使用EM算法进行反复迭代时,计算量会很大,当文档和词语数量增多时,模型训练参数的值也会随之线性增加,容易导致过度拟合。因此,在对PLSA算法修改的基础上,LDA算法被提出。

        LDA模型是应用比较广泛的一种主题模型,包含词、主题和文档3层结构。LDA模型假定词语之间没有顺序,所有的词语都无序地放在一个袋子里,并且认为一个文档可以有多个主题,每个主题对应有不同的词语。 假设语料库包含 m个词,n 个文档,每个文档包含 k个主题。其中 分别表示词和文档,代表第 k个主题。LDA模型可以表示为如下式所示。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​  

        假设分别称为词-文档、词-主题和主题-文档概率分布矩阵,则上个式子中3个概率分布矩阵分别表示如下,LDA主题模型的矩阵形式可以表示为

         当LDA模型对一篇文档进行关键词抽取时,根据LDA模型能够得到每个主题,生成每个词的概率,然后将每个主题中的概率最大的前k个词取出并作为该文档的关键词。

        

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

2.3.2.2 LDA模型的概率分布

        LDA模型的概率分布可以描述为已知概率分布矩阵,求概率分布矩阵 和     。模型的主题的先验分布和主题中词的先验分布假设如下。

        假设文档主题的先验分布为Dirichlet分布,即对于任一文档i ,其主题分布如下式所示,其中, 为文档主题的超参数,是一个K维向量。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        假设主题中词的先验分布为Dirichlet分布,即对k第 个主题,其词分布 如下式所示。其中  为分布的超参数,是一个 m维向量。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​     

        对于数据库中任一文档  中的第 j个词,由主题分布可以得到它的主题编号 的分布为多项式分布,如下式所示。

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​  

        对于主题编号 ,可以得到词 的概率分布为多项式分布表,如下所示。

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

    2.3.2.3 LDA模型生成文档的步骤

        LDA主题模型是一种文档生成模型,它认为一篇文档有多个主题,每个主题对应着不同的词。 一篇文档的生成过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率选出某一个词,这样就生成了这篇文档的第一个词。不断重复这个过程,就生成了整篇文章。 这里假定词与词之间是没有顺序的,即所有词无序的堆放在一个大袋子中,称之为词袋,这种方式使得算法相对简化一些。在LDA模型中,一篇文档生成的步骤如下。 按照先验概率 选择一篇文档   。人为设置超参数 ,获得主题分布

        设置文档 中对应主题每个词的个数,如文档 中有5个词对应主题1,有7个词对应主题2,…,4个词对应主题 ,得到 。 由  ,采样生成文档的主题分布 。 获取主题索引。由取样生成文档第j个词的主题索引。 人为设置超参数,获取隐含参数。设置主题 产生字典中各个词的数量。由 ,采样生成主题对应词的分布。 获取文档i第j个词的索引。由,采样生成

        2.3.2.4 Gibbs采样算法

        在LDA模型生成文档的步骤中,主题对应词的分布,以及文档 i第 j个词的索引都是通过采样生成。LDA的算法使用的是Gibbs采样算法。 LDA的算法中,超参数  、是已知的先验输入,算法的目标是通过Gibbs采样算法得到各个对应的整体 、 的概率分布,即文档主题的分布和主题词的分布。 Gibbs采样算法的运行方式是每次选取概率向量的一个维度,给定其他维度的变量值,采样当前维度的值。不断迭代,直到收敛输出待估计的参数。

        Gibbs采样算法在LDA模型中的抽样过程如下。 首先从文本集合中抽取一个词标记,在其他所有词标记和主题给定的条件下,选定的词分配给一个主题的概率为。然后从中抽取一个主题 取代当前词的主题,不断循环这个过程,最终会收敛于一个不变点。具体的计算公式如下所示。

                                

         其中, 表示单词 w被分配给主题 而没有包含当前主题 的次数,表示在文档 中分配给主题j 的词而没有包含当前主题 i的次数。 如果通过采样得到了所有词的主题,那么通过统计所有词的主题计数,即可得到各个主题的词分布。接着统计各个文档对应词的主题计数,即可得到各个文档的主题分布。

3.自动提取文本关键词

        根据算法原理自定义TF-IDF、TextRank和LSA3种算法的函数,并通过实例完成关键词自动提取。 关键词提取流程主要包括数据预处理、算法实现和结果分析等步骤。 在提取关键词之前,需要先输入准备好文档。

        文档准备好之后,需要加载停用词,并对当前文档进行分词和词性标注,过滤一些对提取关键词帮助不大的词性。 将名词作为候选关键词,在过滤词性中只留下名词,并且删除长度小于或等于1的无意义词语。

3.1 文件预处理

        文本预处理的步骤如下。

        1.加载停用词文件stopword.txt并按行读取文件中的停用词,将文本中多余的换行符进行替换,最终获取停用词列表。其中自定义Stop_words函数用于获取停用词列表。

        2. 对当前文档过滤停用词。自定义Filter_word函数用于对当前文档进行处理,输入参数为当前文档内容。处理后的文档存放在filter_word变量中,它是一个包含着多个字符串的列表。

        3.对文档集corpus.txt过滤停用词。文档集选取国内2012年6-7月期间,搜狐新闻中国际、体育、社会、娱乐等18个频道的新闻内容,其中包含多行文本内容,读取时以列表的形式追加,每个文档以字符串的形式存放在列表当中。

        4. 自定义Filter_words函数用于对文档集进行处理,输入参数是文档集路径。处理后的文档集存放在document变量中,它是一个包含着多个列表的列表,相当于将多个filter_word变量组合为一个列表。

3.2 TD-IDF算法实现

        自定义的TF-IDF算法函数名为tf_idf,其算法实现包括以下3个步骤。 对TF值进行统计。调用自定义Filter_word函数处理当前文档,统计当前文档中每个词的TF值。 对IDF值进行统计。调用自定义Filter_words函数处理文档集,统计IDF值。 对TF值和IDF值进行统计,二者结果相乘,得到TF-IDF值。

3.3 TD-IDF代码实现

3.3.1 准备环境:

conda activate nlp
conda install numpy 
conda install pandas

3.3.2 难点说明

1.如果要直接使用本段代码,首先要将stopword.txt 和trainCorpus.txt 放在和本py文件同一目录下

2.stopword.txt 和trainCorpus.txt要调整到utf-8编译,下图红圈哪里点开,然后找UTF-8

3.stopword.txt 和trainCorpus.txt文件直接在本文顶部

​​​​​​​​​​​​​​

3.3.3 代码讲解

import jieba
import jieba.posseg
import numpy as np
import pandas as pd
import math
import operator
from gensim import corpora,models

text=''' 嫦娥五号实现首次地外天体起飞
科技日报北京12月3日电 (李晨 记者付毅飞)记者从国家航天局获悉,
12月3日23时10分,嫦娥五号上升器3000牛发动机工作约6分钟,成功将携带样品的上升器送入到预定环月轨道。
这是我国首次实现地外天体起飞。
与地面起飞不同,嫦娥五号上升器月面起飞不具备成熟的发射塔架系统,
着陆器相当于上升器的“临时塔架”,上升器起飞存在起飞初始基准与起飞平台姿态不确定、发动机羽流导流空间受限、地月环境差异等问题。
另外由于月球上没有导航星座,上升器起飞后,需在地面测控辅助下,借助自身携带的特殊敏感器实现自主定位、定姿。
点火起飞前,着上组合体实现月面国旗展开以及上升器、着陆器的解锁分离。
此次国旗展开是我国在月球表面首次实现国旗的“独立展示”。点火起飞后,上升器经历垂直上升、姿态调整和轨道射入三个阶段,进入预定环月飞行轨道。
随后,上升器将与环月等待的轨返组合体交会对接,将月球样品转移到返回器,后者将等待合适的月地入射窗口,做好返回地球的准备。
'''
#获取提供用词
def Stop_words():
    stopword=[]
    data=[]
    f=open('stopword.txt',encoding='utf8')
    for line in f.readlines():
        data.append(line.strip())
    for i in data:
        output=i.replace('\n','')
        stopword.append(output)
    return stopword

#采用jieba进行词性标注,对于当前文档过滤指定词性的词和停用词
def Filter_word(text):
    filter_word=[]
    stopword=Stop_words()
    text=jieba.posseg.cut(text)
    for word,flag in text:
        if flag.startswith('n') is False:
            continue
        if not word in stopword and len(word)>1:
            filter_word.append(word)
    return filter_word

#加载文档集,对文档集过滤指定词性的词和停用词
def Filter_words(data_path='trainCorpus.txt'):
    document=[]
    for line in open(data_path,'r',encoding='utf8'):
        segment=jieba.posseg.cut(line.strip())
        filter_words=[]
        stopword=Stop_words()
        for word,flag in segment:
            if flag.startswith('n') is False:
                continue
            if not word in stopword and len(word)>1:
                filter_words.append(word)
        document.append(filter_words)
    return document


#构建TF-IDF模型
def tf_idf():
    #统计TF值
    tf_dict={}
    filter_word=Filter_word(text)
    for word in filter_word:
        if word not in tf_dict:
            tf_dict[word]=1
        else:
            tf_dict[word]+=1
    for word in tf_dict:
        tf_dict[word]=tf_dict[word]/len(text)
    #统计IDF值
    idf_dict={}
    document=Filter_words()
    doc_total=len(document)
    for doc in document:
        for word in set(doc):
            if word not in idf_dict:
                idf_dict[word]=1
            else:
                idf_dict[word]+=1
    for word in idf_dict:
        idf_dict[word]=math.log(doc_total/idf_dict[word]+1)

    #计算TF-IDF值
    tf_idf_dict={}
    for word in filter_word:
        if word not in idf_dict:
            idf_dict[word]=0
        tf_idf_dict[word]=tf_dict[word]*idf_dict[word]

    #提取前十个关键词
    keyword=10
    print('TF-IDF模型结果是:')
    for key,value in sorted(tf_idf_dict.items(),key=operator.itemgetter(1)
                            ,reverse=True)[:keyword]:
        print(key+'/',end='')


tf_idf()

结果如下:

注意点:TF-IDF算法结果较好,因为有些词在文件中出现的频率,词性信息比较接近。因此在多次运行时,关键词出现的结果可能有所改变。

D:\ana\envs\nlp\python.exe D:\pythoncode\nlp\df.py 
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\86130\AppData\Local\Temp\jieba.cache
Loading model cost 0.457 seconds.
Prefix dict has been built successfully.
TF-IDF模型结果是:
嫦娥/天体/科技日报/北京/李晨/记者/付毅飞/国家航天局/发动机/样品/
进程已结束,退出代码为 0

这段代码其中有两段注意点:

1.文本预处理的实现其中startswith函数用于判断字符串第一个字符是否是某个字符。startswith函数的使用格式如下:

tytes.startswith(prefix[,start[,end])
startswith函数常用参数
prefix接受str,tuple。表示需要进行判断的内容。无默认值
start

接受str。表示从指定位置开始进行测试。无默认值

end接受str。表示停止在该位置比较。无默认值

在上述代码中,其中参数‘n’表示词为名词。

2.TF-IDF具体实现中,其中set类用于去重,使集合中的每个元素都不会重复。operator.itemgetter(1)用于获取序列的第一个域的值,获取降序列表中的关键词。set类使用格式如下:

class set([iterable])

set参数说明

iterable接受Series。表示需要从中获取的对象。无默认值

3.4 由于篇幅原因会说明其他算法实现代码思想,具体代码省略,有时间回补,不好意思。

3.4.1 TextRank算法

        自定义TextRank算法的函数名为TextRank,其算法实现包括以下3个步骤。  构建每个节点对应的窗口集合,当不同窗口中出现相同的词语时,相互连接形成边。  构建以边相连的关系矩阵,对矩阵进行归一化。  根据TextRank算法公式计算对应的TextRank值,提取关键词。

3.4.2 LSI算法

        由于gensim库中只定义了LSI模型,而LSA算法和LSI算法原理基本一致,因此这里用LSI模型替代LSA模型。自定义LSI算法的函数名为lsi,其算法实现包括以下3个步骤。 构建基于文档集的词空间。使用BOW模型对每篇文档进行向量化,得到每一篇文档对应的稀疏向量。向量中包括向量的id和词频,其中id表示文档中每一个词语的索引,词频表示词语出现在文档中的次数,都以数字的形式表示。 构建TF-IDF模型,在此基础上加入向量化后的文档集语料corpus,结合成为经过TF-IDF加权的文档向量。基于SVD建立主题模型,得到当前文档和主题之间的分布。  采用余弦相似度计算相似度,求得当前文档与文档中的词语的相似度,相似度最高的前十个词作为当前文档的关键词。

3.4.3 三种算法总结

        基于当前文档,在3种模型中,TF-IDF模型的结果较好,其次是TextRank算法,最后是LSI模型。LSI模型是较早期的主题模型,存在诸多不足之处,因此用于提取关键词时效果不太理想,相较之下TF-IDF算法和TextRank算法结果会比较好。

         由于提取关键词时,有些词语在文档中出现的频次、词性等信息比较接近,因此提取关键词时出现的概率很有可能一样,多次运行程序时,关键词出现顺序会往前或往后改变。

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值