利用 Python 实现中文文本关键词抽取的三种方法
文本关键词抽取,是对文本信息进行高度凝练的一种有效手段,通过 3-5 个词语准确概括文本的主题,帮助读者快速理解文本信息。目前,用于文本关键词提取的主要方法有四种:基于 TF-IDF 的关键词抽取、基于 TextRank 的关键词抽取、基于 Word2Vec 词聚类的关键词抽取,以及多种算法相融合的关键词抽取。笔者在使用前三种算法进行关键词抽取的学习过程中,发现采用 TF-IDF 和 TextRank 方法进行关键词抽取在网上有很多的例子,代码和步骤也比较简单,但是采用 Word2Vec 词聚类方法时网上的资料并未把过程和步骤表达的很清晰。因此,本文分别采用 TF-IDF 方法、TextRank 方法和 Word2Vec 词聚类方法实现对专利文本(同样适用于其它类型文本)的关键词抽取,通过理论与实践相结合的方式,一步步了解、学习、实现中文文本关键词抽取。
1 概述
一篇文档的关键词等同于最能表达文档主旨的 N 个词语,即对于文档来说最重要的词,因此,可以将文本关键词抽取问题转化为词语重要性排序问题,选取排名前 TopN 个词语作为文本关键词。目前,主流的文本关键词抽取方法主要有以下两大类:
(1)基于统计的关键词提取方法
该方法根据统计信息,如词频,来计算得到文档中词语的权重,按权重值排序提取关键词。TF-IDF 和 TextRank 均属于此类方法,其中 TF-IDF 方法通过计算单文本词频(Term Frequency, TF)和逆文本频率指数(Inverse Document Frequency, IDF)得到词语权重;TextRank 方法基于 PageRank 的思想,通过词语共现窗口构建共现网络,计算词语得分。此类方法简单易行,适用性较强,然而未考虑词序问题。
(2)基于机器学习的关键词提取方法
该方法包括了 SVM、朴素贝叶斯等有监督学习方法,以及 K-means、层次聚类等无监督学习方法。在此类方法中,模型的好坏取决于特征提取,而深度学习正是特征提取的一种有效方式。由 Google 推出的 Word2Vec 词向量模型,是自然语言领域中具有代表性的学习工具。它在训练语言模型的过程中将词典映射到一个更抽象的向量空间中,每一个词语通过高维向量表示,该向量空间中两点之间的距离就对应两个词语的相似程度。
基于以上研究,本文分别采用 TF-IDF 方法、TextRank 方法和 Word2Vec 词聚类方法 ,利用 Python 语言进行开发,实现文本关键词的抽取。
2 开发环境准备
2.1 Python 环境
在 python 官网 https://www.python.org/downloads/ 下载计算机对应的 python 版本,笔者使用的是 Python2.7.13 的版本。
2.2 第三方模块
本实验 Python 代码的实现使用到了多个著名的第三方模块,主要模块如下所示:
(1)Jieba
目前使用最为广泛的中文分词组件。下载地址: https://pypi.python.org/pypi/jieba/
(2)Gensim
用于主题模型、文档索引和大型语料相似度索引的 python 库,主要用于自然语言处理(NLP)和信息检索(IR)。下载地址: https://pypi.python.org/pypi/gensim
本实例中的维基中文语料处理和中文词向量模型构建需要用到该模块。
(3)Pandas
用于高效处理大型数据集、执行数据分析任务的 python 库,是基于 Numpy 的工具包。
下载地址: https://pypi.python.org/pypi/pandas/0.20.1
(4)Numpy
用于存储和处理大型矩阵的工具包。
下载地址: https://pypi.python.org/pypi/numpy
(5)Scikit-learn
用于机器学习的 python 工具包,python 模块引用名字为 sklearn,安装前还需要 Numpy 和 Scipy 两个 Python 库。
官网地址: http://scikit-learn.org/stable/
本实例中主要用到了该模块中的 feature_extraction、KMeans(k-means 聚类算法)和 PCA(pac 降维算法)。
(6)Matplotlib
Matplotlib 是一个 python 的图形框架,用于绘制二维图形。
下载地址: https://pypi.python.org/pypi/matplotlib
3 数据准备
3.1 样本语料
文本将汽车行业的 10 篇专利作为样本数据集,见文件“data/sample_data.csv”。文件中依顺序包含编号(id)、标题(title)和摘要(abstract)三个字段,其中标题和摘要都要参与到关键词的抽取。各位可根据自己的样本数据进行数据读取相关代码的调整。
3.2 停用词词典
本文使用中科院计算所中文自然语言处理开放平台发布的中文停用词表,包含了 1208 个停用词。下载地址: http://www.hicode.cc/download/view-software-13784.html
另外,由于本实例的样本是专利文本,词汇专业性较高,需要人工新增停用词,可直接在上述停用词表中添加,一行为一个停用词,见文件“data/stopWord.txt”。在本例中,笔者在文件最前面人工新增了“包括、相对、免受、用于、本发明、结合”这六个停用词,用于示范,各位可根据实际情况自行删减或新增停用词。
4 基于 TF-IDF 的文本关键词抽取方法
4.1 TF-IDF 算法思想
词频(Term Frequency,TF)指某一给定词语在当前文件中出现的频率。由于同一个词语在长文件中可能比短文件有更高的词频,因此根据文件的长度,需要对给定词语进行归一化,即用给定词语的次数除以当前文件的总词数。
逆向文件频率(Inverse Document Frequency,IDF)是一个词语普遍重要性的度量。即如果一个词语只在很少的文件中出现,表示更能代表文件的主旨,它的权重也就越大;如果一个词在大量文件中都出现,表示不清楚代表什么内容,它的权重就应该小。
TF-IDF 的主要思想是,如果某个词语在一篇文章中出现的频率高,并且在其他文章中较少出现,则认为该词语能较好的代表当前文章的含义。即一个词语的重要性与它在文档中出现的次数成正比,与它在语料库中文档出现的频率成反比。
计算公式如下:
4.2 TF-IDF 文本关键词抽取方法流程
由以上可知,TF-IDF 是对文本所有候选关键词进行加权处理,根据权值对关键词进行排序。假设 D n 为测试语料的大小,该算法的关键词抽取步骤如下所示:
(1) 对于给定的文本 D 进行分词、词性标注和去除停用词等数据预处理操作。本分采用结巴分词,保留'n','nz','v','vd','vn','l','a','d'这几个词性的词语,最终得到 n 个候选关键词,即 D=[t1,t2,…,tn] ;
(2) 计算词语 t i 在文本 D 中的词频;
(3) 计算词语 t i 在整个语料的 IDF=log (D n /(D t +1)),D t 为语料库中词语 t i 出现的文档个数;
(4) 计算得到词语 t i 的 TF-IDF=TF*IDF,并重复(2)—(4)得到所有候选关键词的 TF-IDF 数值;
(5) 对候选关键词计算结果进行倒序排列,得到排名前 TopN 个词汇作为文本关键词。
4.3 代码实现
Python 第三方工具包 Scikit-learn 提供了 TFIDF 算法的相关函数,本文主要用到了 sklearn.feature_extraction.text 下的 TfidfTransformer 和 CountVectorizer 函数。其中,CountVectorizer 函数用来构建语料库的中的词频矩阵,TfidfTransformer 函数用来计算词语的 tfidf 权值。
注:TfidfTransformer()函数有一个参数 smooth_idf,默认值是 True,若设置为 False,则 IDF 的计算公式为 idf=log(D n /D t ) + 1。
基于 TF-IDF 方法实现文本关键词抽取的代码执行步骤如下:
(1)读取样本源文件 sample_data.csv;
(2)获取每行记录的标题和摘要字段,并拼接这两个字段;
(3)加载自定义停用词表 stopWord.txt,并对拼接的文本进行数据预处理操作,包括分词、筛选出符合词性的词语、去停用词,用空格分隔拼接成文本;
(4)遍历文本记录,将预处理完成的文本放入文档集 corpus 中;
(5)使用 CountVectorizer()函数得到词频矩阵,a[j][i]表示第 j 个词在第 i 篇文档中的词频;
(6)使用 TfidfTransformer()函数计算每个词的 tf-idf 权值;
(7)得到词袋模型中的关键词以及对应的 tf-idf 矩阵;
(8)遍历 tf-idf 矩阵,打印每篇文档的词汇以及对应的权重;
(9)对每篇文档,按照词语权重值降序排列,选取排名前 topN 个词最为文本关键词,并写入数据框中;
(10)将最终结果写入文件 keys_TFIDF.csv 中。
最终运行结果如下图所示。
5 基于 TextRank 的文本关键词抽取方法
5.1 PageRank 算法思想
TextRank 算法是基于 PageRank 算法的,因此,在介绍 TextRank 前不得不了解一下 PageRank 算法。
PageRank 算法是 Google 的创始人拉里·佩奇和谢尔盖·布林于 1998 年在斯坦福大学读研究生期间发明的,是用于根据网页间相互的超链接来计算网页重要性的技术。该算法借鉴了学术界评判学术论文重要性的方法,即查看论文的被引用次数。基于以上想法,PageRank 算法的核心思想是,认为网页重要性由两部分组成:
① 如果一个网页被大量其他网页链接到说明这个网页比较重要,即被链接网页的数量;
② 如果一个网页被排名很高的网页链接说明这个网页比较重要,即被链接网页的权重。
一般情况下,一个网页的 PageRank 值(PR)计算公式如下所示:
其中,PR(Pi)是第 i 个网页的重要性排名即 PR 值;ɑ 是阻尼系数,一般设置为 0.85;N 是网页总数;Mpi 是所有对第 i 个网页有出链的网页集合;L(Pj)是第 j 个网页的出链数目。
初始时,假设所有网页的排名都是 1/N,根据上述公式计算出每个网页的 PR 值,在不断迭代趋于平稳的时候,停止迭代运算,得到最终结果。一般来讲,只要 10 次左右的迭代基本上就收敛了。
5.2 TextRank 算法思想
TextRank 算法是 Mihalcea 和 Tarau 于 2004 年在研究自动摘要提取过程中所提出来的,在 PageRank 算法的思路上做了改进。该算法把文本拆分成词汇作为网络节点,组成词汇网络图模型,将词语间的相似关系看成是一种推荐或投票关系,使其可以计算每一个词语的重要性。
基于 TextRank 的文本关键词抽取是利用局部词汇关系,即共现窗口,对候选关键词进行排序,该方法的步骤如下:
(1) 对于给定的文本 D 进行分词、词性标注和去除停用词等数据预处理操作。本分采用结巴分词,保留'n','nz','v','vd','vn','l','a','d'这几个词性的词语,最终得到 n 个候选关键词,即 D=[t1,t2,…,tn] ;
(2) 构建候选关键词图 G=(V,E),其中 V 为节点集,由候选关键词组成,并采用共现关系构造任两点之间的边,两个节点之间仅当它们对应的词汇在长度为 K 的窗口中共现则存在边,K 表示窗口大小即最多共现 K 个词汇;
(3) 根据公式迭代计算各节点的权重,直至收敛;
(4) 对节点权重进行倒序排列,得到排名前 TopN 个词汇作为文本关键词。
说明:Jieba 库中包含 jieba.analyse.textrank 函数可直接实现 TextRank 算法,本文采用该函数进行实验。
5.3 代码实现
基于 TextRank 方法实现文本关键词抽取的代码执行步骤如下:
(1)读取样本源文件 sample_data.csv;
(2)获取每行记录的标题和摘要字段,并拼接这两个字段;
(3)加载自定义停用词表 stopWord.txt;
(4)遍历文本记录,采用 jieba.analyse.textrank 函数筛选出指定词性,以及 topN 个文本关键词,并将结果存入数据框中;
(5)将最终结果写入文件 keys_TextRank.csv 中。
最终运行结果如下图所示。
6 基于 Word2Vec 词聚类的文本关键词抽取方法
6.1 Word2Vec 词向量表示
众所周知,机器学习模型的输入必须是数值型数据,文本无法直接作为模型的输入,需要首先将其转化成数学形式。基于 Word2Vec 词聚类方法正是一种机器学习方法,需要将候选关键词进行向量化表示,因此要先构建 Word2Vec 词向量模型,从而抽取出候选关键词的词向量。
Word2Vec 是当时在 Google 任职的 Mikolov 等人于 2013 年发布的一款词向量训练工具,一经发布便在自然语言处理领域得到了广泛的应用。该工具利用浅层神经网络模型自动学习词语在语料库中的出现情况,把词语嵌入到一个高维的空间中,通常在 100-500 维,在新的高维空间中词语被表示为词向量的形式。与传统的文本表示方式相比,Word2Vec 生成的词向量表示,词语之间的语义关系在高维空间中得到了较好的体现,即语义相近的词语在高维空间中的距离更近;同时,使用词向量避免了词语表示的“维度灾难”问题。
就实际操作而言,特征词向量的抽取是基于已经训练好的词向量模型,词向量模型的训练需要海量的语料才能达到较好的效果,而 wiki 中文语料是公认的大型中文语料,本文拟从 wiki 中文语料生成的词向量中抽取本文语料的特征词向量。Wiki 中文语料的 Word2vec 模型训练在之前写过的一篇文章“利用 Python 实现 wiki 中文语料的 word2vec 模型构建”( http://www.jianshu.com/p/ec27062bd453 )中做了详尽的描述,在此不赘述。即本文从文章最后得到的文件“wiki.zh.text.vector”中抽取候选关键词的词向量作为聚类模型的输入。
另外,在阅读资料的过程中发现,有些十分专业或者生僻的词语可能 wiki 中文语料中并未包含,为了提高语料的质量,可新增实验所需的样本语料一起训练,笔者认为这是一种十分可行的方式。本例中为了简便并未采取这种方法,各位可参考此种方法根据自己的实际情况进行调整。
6.2 K-means 聚类算法
聚类算法旨在数据中发现数据对象之间的关系,将数据进行分组,使得组内的相似性尽可能的大,组件的相似性尽可能的小。
K-Means 是一种常见的基于原型的聚类技术,本文选择该算法作为词聚类的方法。其算法思想是:首先随机选择 K 个点作为初始质心,K 为用户指定的所期望的簇的个数,通过计算每个点到各个质心的距离,将每个点指派到最近的质心形成 K 个簇,然后根据指派到簇的点重新计算每个簇的质心,重复指派和更新质心的操作,直到簇不发生变化或达到最大的迭代次数则停止。
6.3 Word2Vec 词聚类文本关键词抽取方法流程
Word2Vec 词聚类文本关键词抽取方法的主要思路是对于用词向量表示的文本词语,通过 K-Means 算法对文章中的词进行聚类,选择聚类中心作为文章的一个主要关键词,计算其他词与聚类中心的距离即相似度,选择 topN 个距离聚类中心最近的词作为文本关键词,而这个词间相似度可用 Word2Vec 生成的向量计算得到。
假设 D n 为测试语料的大小,使用该方法进行文本关键词抽取的步骤如下所示:
(1) 对 Wiki 中文语料进行 Word2vec 模型训练,参考我的文章“利用 Python 实现 wiki 中文语料的 word2vec 模型构建”( http://www.jianshu.com/p/ec27062bd453 ),得到词向量文件“wiki.zh.text.vector”;
(2) 对于给定的文本 D 进行分词、词性标注、去重和去除停用词等数据预处理操作。本分采用结巴分词,保留'n','nz','v','vd','vn','l','a','d'这几个词性的词语,最终得到 n 个候选关键词,即 D=[t1,t2,…,tn] ;
(3) 遍历候选关键词,从词向量文件中抽取候选关键词的词向量表示,即 WV=[v 1 ,v 2 ,…,v m ];
(4) 对候选关键词进行 K-Means 聚类,得到各个类别的聚类中心;
(5) 计算各类别下,组内词语与聚类中心的距离(欧几里得距离),按聚类大小进行升序排序;
(6) 对候选关键词计算结果得到排名前 TopN 个词汇作为文本关键词。
步骤(4)中需要人为给定聚类的个数,本文测试语料是汽车行业的专利文本,因此只需聚为 1 类,各位可根据自己的数据情况进行调整;步骤(5)中计算各词语与聚类中心的距离,常见的方法有欧式距离和曼哈顿距离,本文采用的是欧式距离,计算公式如下:
6.4 代码实现
Python 第三方工具包 Scikit-learn 提供了 K-Means 聚类算法的相关函数,本文用到了 sklearn.cluster.KMeans()函数执行 K-Means 算法,sklearn.decomposition.PCA()函数用于数据降维以便绘制图形。
基于 Word2Vec 词聚类方法实现文本关键词抽取的代码执行步骤如下:
(1)读取样本源文件 sample_data.csv;
(2)获取每行记录的标题和摘要字段,并拼接这两个字段;
(3)加载自定义停用词表 stopWord.txt,并对拼接的文本进行数据预处理操作,包括分词、筛选出符合词性的词语、去重、去停用词,形成列表存储;
(4)读取词向量模型文件'wiki.zh.text.vector',从中抽取出所有候选关键词的词向量表示,存入文件中;
(5)读取文本的词向量表示文件,使用 KMeans()函数得到聚类结果以及聚类中心的向量表示;
(6)采用欧式距离计算方法,计算得到每个词语与聚类中心的距离;
(7)按照得到的距离升序排列,选取排名前 topN 个词作为文本关键词,并写入数据框中;
(8)将最终结果写入文件 keys_word2vec.csv 中。
最终运行结果如下图所示。
7 结语
本文总结了三种常用的抽取文本关键词的方法:TF-IDF、TextRank 和 Word2Vec 词向量聚类,并做了原理、流程以及代码的详细描述。因本文使用的测试语料较为特殊且数量较少,未做相应的结果分析,根据观察可以发现,得到的十个文本关键词都包含有文本的主旨信息,其中 TF-IDF 和 TextRank 方法的结果较好,Word2Vec 词向量聚类方法的效果不佳,这与文献[8]中的结论是一致的。文献[8]中提到,对单文档直接应用 Word2Vec 词向量聚类方法时,选择聚类中心作为文本的关键词本身就是不准确的,因此与其距离最近的 N 个词语也不一定是关键词,因此用这种方法得到的结果效果不佳;而 TextRank 方法是基于图模型的排序算法,在单文档关键词抽取方面有较为稳定的效果,因此较多的论文是在 TextRank 的方法上进行改进而提升关键词抽取的准确率。
另外,本文的实验目的主要在于讲解三种方法的思路和流程,实验过程中的某些细节仍然可以改进。例如 Word2Vec 模型训练的原始语料可加入相应的专业性文本语料;标题文本往往包含文档的重要信息,可对标题文本包含的词语给予一定的初始权重;测试数据集可采集多个分类的长文本,与之对应的聚类算法 KMeans()函数中的 n_clusters 参数就应当设置成分类的个数;根据文档的分词结果,去除掉所有文档中都包含某一出现频次超过指定阈值的词语;等等。各位可根据自己的实际情况或者参考论文资料进行参数的优化以及细节的调整,欢迎给我留言或者私信讨论,大家一起共同学习。
参考文献
- 基于知识图谱的问句语义理解技术研究与实现(国防科技大学·韩晗)
- 网络新闻分类系统及个性化新闻网站的研究与应用(内蒙古工业大学·王继明)
- 面向新闻站点的关系挖掘系统研究与开发(西安电子科技大学·苏赛争)
- 互联网舆情监控系统的设计与实现(北京邮电大学·唐勇)
- 面向新闻站点的关系挖掘系统研究与开发(西安电子科技大学·苏赛争)
- 面向文化领域的主题爬虫研究(北京理工大学·邱琼文)
- 基于K-Means的分布式文本聚类系统的设计与实现(西安电子科技大学·马婵媛)
- 基于知识图谱的问句语义理解技术研究与实现(国防科技大学·韩晗)
- 网络信息采集技术及中文未登录词算法研究(北京邮电大学·陈浩)
- 网络信息采集技术及中文未登录词算法研究(北京邮电大学·陈浩)
- 互联网舆情监控系统的设计与实现(北京邮电大学·唐勇)
- 基于页面分析的网络爬虫系统的设计与实现(华中科技大学·郝以珍)
- 融入Web数据挖掘的校企人才对接平台的研究和实现(华侨大学·简圣光)
- 基于网络爬虫的信息采集分类系统设计与实现(厦门大学·周茜)
- 基于知识图谱的问句语义理解技术研究与实现(国防科技大学·韩晗)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设客栈 ,原文地址:https://bishedaima.com/yuanma/35980.html