精华内容
下载资源
问答
  • 与此同时,不管是基于文本的推荐还是基于文本的搜索,对于文本关键词的依赖也很大,关键词提取的准确程度直接关系到推荐系统或者搜索系统的最终效果。因此,关键词提取在文本挖掘领域是一个很重要的部分。关键词:...

    0 概述

    在自然语言处理领域,处理海量的文本文件最关键的是要把用户最关心的问题提取出来。而无论是对于长文本还是短文本,往往可以通过一些关键词窥探整个文本的主题思想。与此同时,不管是基于文本的推荐还是基于文本的搜索,对于文本关键词的依赖也很大,关键词提取的准确程度直接关系到推荐系统或者搜索系统的最终效果。因此,关键词提取在文本挖掘领域是一个很重要的部分。

    关键词:来源英文keywords,从应用上看,是指单个媒体在制作使用索引时,所用到的词汇。从学术上看,是指为了文献标引工作从报告、论文中选取出来的用以表示全文主题内容信息款目的单词或术语。其中单词是指能包含一个词素(语言中最小的有意义的单位)的词或语言里最小的可以自由运用的单位,术语则是指某个学科中的专业用语。综上所述,关键词是表达文本主题内容的词,包括单词,术语和短语,在含义上是独立非复合的。包含一定的信息量,对文本内容的理解有作用。根据包含文本信息量的大小,分为核心关键词,拓展关键词,(无价值词,非关键词)

    核心关键词:包含文本主题核心内容的关键词,一般不超过文本内容的3%,个数不超过5个。

    拓展关键词:核心关键词之外的关键词,不是文本的核心内容,但与文本内容相关,具有一定的信息量。

    1 基本流程图

    723052d3437f786fcd24940359633153.png

    2 算法介绍

    2.1 主要分类

    关于文本的关键词提取方法分为有监督、半监督和无监督三种:

    1)有监督

    将关键词抽取算法看作是二分类问题,判断文档中的词或者短语是或者不是关键词。既然是分类问题,就需要提供已经标注好的训练预料,利用训练语料训练关键词提取模型,根据模型对需要抽取关键词的文档进行关键词抽取。

    2)半监督

    只需要少量的训练数据,利用这些训练数据构建关键词抽取模型,然后使用模型对新的文本进行关键词提取,对于这些关键词进行人工过滤,将过滤得到的关键词加入训练集,重新训练模型。

    3)无监督

    不需要人工标注的语料,利用文本语言特点发现其中比较重要的词作为关键词,进行关键词抽取。

    注:因有监督的文本关键词提取算法需要人工标注训练样本,成本很高,所以常见的文本关键词提取主要采用适用性较强的无监督关键词抽取。

    2.2 主要算法

    关键词抽取的算法如下图:

    d991a28275b0e04b5be5784725c38582.png

    2.2.1基于统计特征的关键词提取算法

    基于于统计特征的关键词抽取算法的思想是利用文档中词语的统计信息抽取文档的关键词。通常将文本经过预处理得到候选词语的集合,然后采用特征值量化的方式从候选集合中得到关键词。基于统计特征的关键词抽取方法的关键是采用什么样的特征值量化指标的方式,目前常用的有三类:

    2.2.1.1基于词权重的特征量化

    基于词权重的特征量化主要包括词性、词频、逆向文档频率、相对词频、词长等。

    2.2.1.2基于词的文档位置的特征量化

    这种特征量化方式是根据文章不同位置的句子对文档的重要性不同的假设来进行的。通常,文章的前N个词、后N个词、段首、段尾、标题、引言等位置的词具有代表性,这些词作为关键词可以表达整个的主题。

    2.2.1.3基于词的关联信息的特征量化

    词的关联信息是指词与词、词与文档的关联程度信息,包括互信息、hits值、贡献度、依存度、TF-IDF值等。

    下面介绍几种常用的特征值量化指标。

    1)词性

    词性是通过分词、语法分析后得到的结果。现有的关键词中,绝大多数关键词为名词或者动名词。一般情况下,名词与其他词性相比更能表达一篇文章的主要思想。但是,词性作为特征量化的指标,一般与其他指标结合使用。

    2)词频

    词频表示一个词在文本中出现的频率。一般我们认为,如果一个词在文本中出现的越是频繁,那么这个词就越有可能作为文章的核心词。词频简单地统计了词在文本中出现的次数,但是,只依靠词频所得到的关键词有很大的不确定性,对于长度比较长的文本,这个方法会有很大的噪音。

    3)位置信息

    一般情况下,词出现的位置对于词来说有着很大的价值。例如,标题、摘要本身就是作者概括出的文章的中心思想,因此出现在这些地方的词具有一定的代表性,更可能成为关键词。但是,因为每个作者的习惯不同,写作方式不同,关键句子的位置也会有所不同,所以这也是一种很宽泛的得到关键词的方法,一般情况下不会单独使用。

    4)互信息

    互信息是信息论中概念,是变量之间相互依赖的度量。互信息并不局限于实值随机变量,它更加一般且决定着联合分布 p(X,Y) 和分解的边缘分布的乘积 p(X)p(Y) 的相似程度。互信息的计算公式如下:

    43fe232ec5ef86399925100985fb434e.png

    其中,p(x,y)是X和Y的联合概率分布函数,p(x)和p(y)分别为X和Y的边缘概率分布函数。当使用互信息作为关键词提取的特征量化时,应用文本的正文和标题构造PAT树,然后计算字符串左右的互信息。

    5)词跨度

    词跨度是指一个词或者短语在文中首次出现和末次出现之间的距离,词跨度越大说明这个词对文本越重要,可以反映文本的主题。一个词的跨度计算公式如下:

    9e79a464d0a869d0bb97f088d6809679.png

    其中,表示词i在文本中最后出现的位置, 表示词 i 在文本中第一次出现的位置,sum表示文本中词的总数。

    词跨度被作为提取关键词的方法是因为在现实中,文本中总是有很多噪声(指不是关键词的那些词),使用词跨度可以减少这些噪声。

    6)TF-IDF值

    TF是指这个词在文档中出现的频率,假设一个词w在文本中出现了m次,而文本中词的总数为n,那么tf就是m/n。IDF是根据语料库得出的,表示这个词在整个语料库中出现的频率。公式为:

    add001ea282cc4b2d2574c5d0ef8b5ca.png

    假设整个语料库中,包含词w的文本一共有M篇,语料库中的文本一共有N篇,则IDF就是log(N+1)/(M+1) + 1。由此可得词w的TF-IDF值为:m/n*(log(N+1)/(M+1)+1)。

    TF-IDF的优点是实现简单,相对容易理解。但是,TFIDF算法提取关键词的缺点也很明显,严重依赖语料库,需要选取质量较高且和所处理文本相符的语料库进行训练。另外,对于IDF来说,它本身是一种试图抑制噪声的加权,本身倾向于文本中频率小的词,这使得TF-IDF算法的精度不高。TF-IDF算法还有一个缺点就是不能反应词的位置信息,在对关键词进行提取的时候,词的位置信息,例如文本的标题、文本的首句和尾句等含有较重要的信息,应该赋予较高的权重。

    基于统计特征的关键词提取算法通过上面的一些特征量化指标将关键词进行排序,获取TopK个词作为关键词。其重点在于特征量化指标的计算,不同的量化指标得到的记过也不尽相同。同时,不同的量化指标作为也有其各自的优缺点,在实际应用中,通常是采用不同的量化指标相结合的方式得到Topk个词作为关键词。

    2.2.2 基于词图模型的关键词抽取算法

    基于词图模型的关键词抽取首先要构建文档的语言网络图,然后对语言进行网络图分析,在这个图上寻找具有重要作用的词或者短语,这些短语就是文档的关键词。语言网络图中节点基本上都是词,根据词的链接方式不同,语言网络的主要形式分为四种:共现网络图、语法网络图、语义网络图和其他网络图。

    在语言网络图的构建过程中,都是以预处理过后的词作为节点,词与词之间的关系作为边。语言网络图中,边与边之间的权重一般用词之间的关联度来表示。在使用语言网络图获得关键词的时候,需要评估各个节点的重要性,然后根据重要性将节点进行排序,选取TopK个节点所代表的词作为关键词。节点的重要性计算方法有以下几种方法。

    2.2.2.1综合特征法

    综合特征法也叫社会网络中心性分析方法,这种方法的核心思想是节点中重要性等于节点的显著性,以不破坏网络的整体性为基础。此方法就是从网络的局部属性和全局属性角度去定量分析网络结构的拓扑性质,常用的定量计算方法如下:

    1)度

    节点的度是指与该节点直接向量的节点数目,表示的是节点的局部影响力。

    2)接近性

    节点的接近性是指节点到其他节点的最短路径之和的倒数,表示的是信息传播的紧密程度。

    3)特征向量

    特征向量的思想是节点的中心化测试值由周围所有连接的节点决定,即一个节点的中心化指标应该等于其相邻节点的中心化指标之线性叠加,表示的是通过与具有高度值的相邻节点所获得的间接影响力。

    4)集聚系数

    节点的集聚系数是它的相邻的节点之间的连接数与他们所有可能存在来链接的数量的比值,用来描述图的顶点之间集聚成团的程度的系数。

    5)平均最短路径

    节点的平局最短路径也叫紧密中心性,是节点的所有最短路径之和的平均值,表示的是一个节点传播信息时对其他节点的依赖程度。如果一个节点离其他节点越近,那么他传播信息的时候也就越不需要依赖其他人。一个节点到网络中各点的距离都很短,那么这个点就不会受制于其他节点。

    因为每个算法的侧重方向的不同,在实际的问题中所选取的定量分析方法也会不一样。同时,对于关键词提取来说,也可以和上一节所提出的统计法得到的词的权重,例如词性等相结合构建词搭配网络,然后利用上述方法得到关键词。

    2.2.2.2系统科学法

    系统科学法进行中心性分析的思想是节点重要性等于这个节点被删除后对于整个语言网络图的破坏程度。重要的节点被删除后会对网络的呃连通性等产生变化。如果我们在网络图中删除某一个节点,图的某些指定特性产生了改变,可以根据特性改变的大小获得节点的重要性,从而对节点进行筛选。

    2.2.2.3随机游走法

    随机游走算法时网络图中一个非常著名的算法,它从给定图和出发点,随机地选择邻居节点移动到邻居节点上,然后再把现在的节点作为出发点,迭代上述过程。

    pagerank

    随机游走算法一个很出名的应用是PageRank算法,PageRank算法是整个google搜索的核心算法,是一种通过网页之间的超链接来计算网页重要性的技术,其关键的思想是重要性传递。在关键词提取领域, Mihalcea 等人所提出的TextRank算法就是在文本关键词提取领域借鉴了这种思想。

    PageRank算法将整个互联网看作一张有向图,网页是图中的节点,而网页之间的链接就是图中的边。根据重要性传递的思想,如果一个大型网站A含有一个超链接指向了网页B,那么网页B的重要性排名会根据A的重要性来提升。网页重要性的传递思想如下图所示:

    85edd1de1a7893b5e4a9f6cfe0991697.png

    在PageRank算法中,最主要的是对于初始网页重要性(PR值)的计算,因为对于上图中的网页A的重要性我们是无法预知的。但是,在原始论文中给出了一种迭代方法求出这个重要性,论文中指出,幂法求矩阵特征值与矩阵的初始值无关。那么,就可以为每个网页随机给一个初始值,然后迭代得到收敛值,并且收敛值与初始值无关。

    PageRank求网页i的PR值计算如下:

    9f5b816a0a516bf35454ad635a6798b2.png

    其中,d为阻尼系数,通常为0.85。In(vi)是指向网页 i 的网页集合。out(vj)是指网页j中的链接指向的集合,|out(vj)|是指集合中元素的个数。

    TextRank

    TextRank算法的思想是基于PageRank,在构建图的时候将节点由网页改成了句子,并为节点之间的边引入了权值,其中权值表示两个句子的相似程度。其计算公式如下:

    d2283b6b1e1c53c1e63d6b1f08761a51.png

    公式中的wij为图中节点vi和边vj的权重。其他符号与PageRank公式相同。

    TextRank算法除了做文本关键词提取,还可以做文本摘要提取。但是TextRank的计算复杂度较高,具体流程如下:

    1)将原文本拆分为句子,在每个句子中过滤掉停用词,并只保留指定词性的单词,得到句子的集合和单词的集合。

    2)每个单词作为pagerank中的一个节点。设定窗口大小为k,假设一个句子依次由下面的单词组成:w1,w2,w3,w4,w5,…,wn,划分的窗口为:[w1,w2,…,wk]、[w2,w3,…,wk+1]、[w3,w4,…,wk+2]等。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边。

    3)基于上面构成图,可以计算出每个单词节点的重要性。选取最重要的若干单词可以作为关键词。

    2.2.3 基于主题模型的关键词抽取

    基于主题关键词提取算法主要利用的是主题模型中关于主题的分布的性质进行关键词提取。算法步骤如下:

    1)获取候选关键词:从文章中获取候选关键词。一般从文本分词和词性选取候选关键词。

    2)语料学习:根据大规模语料学习得到主题模型。

    3)计算文章主题模型:根据得到的隐含主题模型,计算文章的主题分布和候选关键词分布。

    4)排序:计算文档和候选关键词的主题相似度并排序,选取前n个词作为关键词。

    算法的关键在于主题模型的构建。主题模型是一种文档生成模型,对于一篇文章,通常思路是先确定几个主题,然后根据主题想好描述主题的词汇,将词汇按照语法规则组成句子、段落,最后生成一篇文章。

    pLSA

    主题模型也是基于这个思想,它认为文档是一些主题的混合分布,主题又是词语的概率分布,pLSA模型就是第一个根据这个想法构建的模型。同样地,我们反过来想,我们找到了文档的主题,然后主题中有代表性的词就能表示这篇文档的核心意思,就是文档的关键词。

    pLSA模型认为,一篇文档中的每一个词都是通过一定概率选取某个主题,然后再按照一定的概率从主题中选取得到这个词语,这个词语的计算公式为:

    827ac93aa4ec12e37b42f7fb78a55781.png

    一些贝叶斯学派的研究者对于pLSA模型进行了改进,他们认为,文章对应主题的概率以及主题对应词语的概率不是一定的,也服从一定的概率,于是就有了更常用的LDA主题模型。

    LDA

    LDA是D.M.Blei在2003年提出的。LDA采用了词袋模型的方法简化了问题的复杂性。在LDA模型中,每一篇文档是一些主题的构成的概率分布,而每一个主题又是很多单词构成的一个概率分布。同时,无论是主题构成的概率分布还是单词构成的概率分布也不是一定的,这些分布也服从Dirichlet 先验分布。

    文档的生成模型可以用如下图模型表示:

    5b4a46b12f12a2fd296bbb3f74f26762.png

    LDA挖掘了文本的深层语义即文本的主题,用文本的主题来表示文本的也从一定程度上降低了文本向量的维度,很多人用这种方式对文本做分类,取得了不错的效果。

    LDA关键词提取算法利用文档的隐含语义信息来提取关键词,但是主题模型提取的关键词比较宽泛,不能很好的反应文档主题。另外,对于LDA模型的时间复杂度较高,需要大量的实践训练。

    2.3 算法评估

    2.3.1 数据

    2.3.1.1数据来源

    业务方提供及累积数据

    2.3.1.2数据标注

    作用:1)用于指标评估及监控。2)用于监督学习语料训练。

    生成的每个关键词标注四档,包括核心:3,拓展:2;无价值:1;错误:0,具体说明如下:

    1)核心:为核心关键词,能反映文本主题内容的词。

    2)拓展:为拓展关键词,非核心内容,有实际含义,能够反映文档内容;

    3)无价值:是正确的词,但没有实际含义,不能反映文档内容;

    如:发生,生成,前进,分明,成为等

    注:带有情感类的词是有价值的,应标为1:如:高兴,美丽,美好等

    4)错误:主要是两种情况:

    a:分词边界不正确,如:北京海淀区长年干旱。得到的关键词应该是“海淀区”而不应该是 “区长”;

    b:本身是词,但属于另一个词的一部分,独立出来含义有变化,剩余部分不构成词。如:科创板政策基本已经出台完毕。 得到关键词应该是:“科创板”而不是“科创”,因为剩余的“板”不是词。

    2.3.2评估指标

    2.3.2.1 Mean Average Precision (MAP)

    计算公式为:

    719a644dda3d40ff2c5e789126e68ea0.png

    其中,yi,jyi,j:排序中第j个元素对于查询i是否是相关的;相关为1,不相关为0。

    517eaf626ae6ebcf3c9e96893ec1da01.png

    ,πi(j)为j的排序位置。

    例如:

    363ee73629d354a4110666d0519dd227.png

    根据AP计算公式:AP = (1*1 + (1/2) *0+ (2/3)*1 + (2/4)*0 + (3/5)*1 + (3/6)*0) /3 = 0.755

    举例,第一项,P(1) = 它前面的项(包括自己)相关的个数除所在排序的位置(也就是1)。第一位及前面(前面没有)相关的个数就是它本身,所以P(1)的分子就是1,分母也是1.所以取值为1。同时y值为1.最终的对应AP中的项就是1,其他以此类推。

    AP的最大值为1(也就是当相关的全部排在不相关的前面的时候),MAP就是对所有query的AP求平均。

    2.3.2.2 Mean Reciprocal Rank (MRR)

    计算公式为:

    879a5b02aa8006c1de88e5fd314b12b3.png

    其中|Q|是查询个数,是第个查询,第一个相关的结果所在的排列位置。

    举例:

    对于三个查询,每个查询的ranki分别为3、2、1。所以,MRR=1/3∗(1/3+1/2+1/1)MRR=1/3∗(1/3+1/2+1/1)

    2.3.2.3 NDCG

    首先是DCG的定义:

    01d9786f6ef40fc6ca30f1a408d46090.png

    其中,reli为排在第i个位置的物品实际的评价分值(也就是和查询相关的程度)

    举例:

    4628e09f6d8b94e855175bc642bb7703.png

    所以:

    13e070c9a29cfabd8518f37c5d910dbd.png

    理想的DCG,也就是排序是最理想的情况(3,3,2,2,1,0):IDCG_6=7.141

    最终的NDCG为:

    5a3474867d9886f6b0a950f580ae6de4.png

    3 应用

    现阶段,文本的关键词提取在基于文本的搜索、推荐以及数据挖掘领域有着很广泛的应用。同时在实际应用中,因为应用环境的复杂性,对于不同类型的文本,例如长文本和短文本,用同一种文本关键词提取方法得到的效果并相同。因此,在实际应用中针对不同的条件环境所采用的算法会有所不同,没有某一类算法在所有的环境下都有很好的效果。

    相对于上文中所提到的算法,一些组合算法在工程上被大量应用以弥补单算法的不足,例如将TF-IDF算法与TextRank算法相结合,或者综合TF-IDF与词性得到关键词等。同时,工程上对于文本的预处理以及文本分词的准确性也有很大的依赖。对于文本的错别字,变形词等信息,需要在预处理阶段予以解决,分词算法的选择,未登录词以及歧义词的识别在一定程度上对于关键词突提取会又很大的影响。

    展开全文
  • 1 简介关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来。这个可以追溯到文献检索初期,当时还不支持全文搜索的时候,关键词就可以作为搜索这篇论文的词语。因此,目前依然可以在论文中看到关键词这...

    1 简介

    关键词抽取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来。这个可以追溯到文献检索初期,当时还不支持全文搜索的时候,关键词就可以作为搜索这篇论文的词语。因此,目前依然可以在论文中看到关键词这一项。

    除了这些,关键词还可以在文本聚类、分类、自动摘要等领域中有着重要的作用。比如在聚类时将关键词相似的几篇文档看成一个团簇,可以大大提高聚类算法的收敛速度;从某天所有的新闻中提取出这些新闻的关键词,就可以大致了解那天发生了什么事情;或者将某段时间内几个人的微博拼成一篇长文本,然后抽取关键词就可以知道他们主要在讨论什么话题。

    总之,关键词就是最能够反映出文本主题或者意思的词语。但是网络上写文章的人不会像写论文那样告诉你本文的关键词是什么,这个时候就需要利用计算机自动抽取出关键词,算法的好坏直接决定了后续步骤的效果。

    关键词抽取从方法来说大致有两种:

    - 第一种是关键词分配,就是有一个给定的关键词库,然后新来一篇文档,从词库里面找出几个词语作为这篇文档的关键词;

    - 第二种是关键词抽取,就是新来一篇文档,从文档中抽取一些词语作为这篇文档的关键词;

    目前大多数领域无关的关键词抽取算法(领域无关算法的意思就是无论什么主题或者领域的文本都可以抽取关键词的算法)和它对应的库都是基于后者的。从逻辑上说,后者比前着在实际使用中更有意义。

    从算法的角度来看,关键词抽取算法主要有两类:

    - 有监督学习算法,将关键词抽取过程视为二分类问题,先抽取出候选词,然后对于每个候选词划定标签,要么是关键词,要么不是关键词,然后训练关键词抽取分类器。当新来一篇文档时,抽取出所有的候选词,然后利用训练好的关键词抽取分类器,对各个候选词进行分类,最终将标签为关键词的候选词作为关键词;

    - 无监督学习算法,先抽取出候选词,然后对各个候选词进行打分,然后输出topK个分值最高的候选词作为关键词。根据打分的策略不同,有不同的算法,例如TF-IDF,TextRank等算法;

    jieba分词系统中实现了两种关键词抽取算法,分别是基于TF-IDF关键词抽取算法和基于TextRank关键词抽取算法,两类算法均是无监督学习的算法,下面将会通过实例讲解介绍如何使用jieba分词的关键词抽取接口以及通过源码讲解其实现的原理。

    2 示例

    下面将会依次介绍利用jieba分词系统中的TF-IDF及TextRank接口抽取关键词的过程。

    2.1 基于TF-IDF算法进行关键词抽取

    基于TF-IDF算法进行关键词抽取的示例代码如下所示,

    from 

    控制台输出,

        keywords by tfidf:
    

    2.2 基于TextRank算法进行关键词抽取

    基于TextRank算法进行关键词抽取的示例代码如下所示,

    from 

    控制台输出,

        keywords by textrank:
    

    3 理论分析

    下面将会依次分析TF-IDF算法及TextRank算法的原理。

    3.1 TF-IDF算法分析

    在信息检索理论中,TF-IDF是Term Frequency - Inverse Document Frequency的简写。TF-IDF是一种数值统计,用于反映一个词对于语料中某篇文档的重要性。在信息检索和文本挖掘领域,它经常用于因子加权。

    TF-IDF的主要思想就是:如果某个词在一篇文档中出现的频率高,也即TF高;并且在语料库中其他文档中很少出现,即DF的低,也即IDF高,则认为这个词具有很好的类别区分能力。

    TF-IDF在实际中主要是将二者相乘,也即TF * IDF,TF为词频(Term Frequency),表示词t在文档d中出现的频率;IDF为反文档频率(Inverse Document Frequency),表示语料库中包含词t的文档的数目的倒数。

    TF公式:

    TF计算公式为,

    式中,count(t)表示文档di中包含词t的个数;

    count(di)表示文档di的词的总数;

    IDF公式:

    IDF计算公式为,

    式中,num(corpus)表示语料库corpus中文档的总数;

    num(t)表示语料库corpus中包含t的文档的数目;

    应用到关键词抽取:

        1. 预处理,首先进行分词和词性标注,将满足指定词性的词作为候选词;
        2. 分别计算每个词的TF-IDF值;
        3. 根据每个词的TF-IDF值降序排列,并输出指定个数的词汇作为可能的关键词;

    3.2 TextRank算法分析

    类似于PageRank的思想,将文本中的语法单元视作图中的节点,如果两个语法单元存在一定语法关系(例如共现),则这两个语法单元在图中就会有一条边相互连接,通过一定的迭代次数,最终不同的节点会有不同的权重,权重高的语法单元可以作为关键词。

    节点的权重不仅依赖于它的入度结点,还依赖于这些入度结点的权重,入度结点越多,入度结点的权重越大,说明这个结点的权重越高;

    TextRank迭代计算公式为,

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

    阻尼系数 d 一般取0.85;

    算法通用流程:

        1. 标识文本单元,并将其作为顶点加入到图中;
        2. 标识文本单元之间的关系,使用这些关系作为图中顶点之间的边,边可以是有向或者无向,加权或者无权;
        3. 基于上述公式,迭代直至收敛;
        4. 按照顶点的分数降序排列;

    - 1.本模型使用co-occurrence关系,如果两个顶点相应的语义单元共同出现在一个窗口中(窗口大小从2-10不等),那么就连接这两个顶点;

    - 2.添加顶点到图中时,需要考虑语法过滤,例如只保留特定词性(如形容词和名词)的词;

    应用到关键短语抽取:

        1. 预处理,首先进行分词和词性标注,将单个word作为结点添加到图中;
        2. 设置语法过滤器,将通过语法过滤器的词汇添加到图中;出现在一个窗口中的词汇之间相互形成一条边;
        3. 基于上述公式,迭代直至收敛;一般迭代20-30次,迭代阈值设置为0.0001;
        4. 根据顶点的分数降序排列,并输出指定个数的词汇作为可能的关键词;
        5. 后处理,如果两个词汇在文本中前后连接,那么就将这两个词汇连接在一起,作为关键短语;

    4 源码分析

    jieba分词的关键词抽取功能,是在jieba/analyse目录下实现的。

    其中,__init__.py主要用于封装jieba分词的关键词抽取接口;

    tfidf.py实现了基于TF-IDF算法抽取关键词;

    textrank.py实现了基于TextRank算法抽取关键词;

    4.1 TF-IDF算法抽取关键词源码分析

    基于TF-IDF算法抽取关键词的主调函数是TFIDF.extract_tags函数,主要是在jieba/analyse/tfidf.py中实现。

    其中TFIDF是为TF-IDF算法抽取关键词所定义的类。类在初始化时,默认加载了分词函数tokenizer = jieba.dt、词性标注函数postokenizer = jieba.posseg.dt、停用词stop_words = self.STOP_WORDS.copy()、idf词典idf_loader = IDFLoader(idf_path or DEFAULT_IDF)等,并获取idf词典及idf中值(如果某个词没有出现在idf词典中,则将idf中值作为这个词的idf值)。

    def 

    然后开始通过TF-IDF算法进行关键词抽取。

    首先根据是否传入了词性限制集合,来决定是调用词性标注接口还是调用分词接口。例如,词性限制集合为["ns", "n", "vn", "v", "nr"],表示只能从词性为地名、名词、动名词、动词、人名这些词性的词中抽取关键词。

    1) 如果传入了词性限制集合,首先调用词性标注接口,对输入句子进行词性标注,得到分词及对应的词性;依次遍历分词结果,如果该词的词性不在词性限制集合中,则跳过;如果词的长度小于2,或者词为停用词,则跳过;最后将满足条件的词添加到词频词典中,出现的次数加1;然后遍历词频词典,根据idf词典得到每个词的idf值,并除以词频词典中的次数总和,得到每个词的tf * idf值;如果设置了权重标志位,则根据tf-idf值对词频词典中的词进行降序排序,然后输出topK个词作为关键词;

    2) 如果没有传入词性限制集合,首先调用分词接口,对输入句子进行分词,得到分词;依次遍历分词结果,如果词的长度小于2,或者词为停用词,则跳过;最后将满足条件的词添加到词频词典中,出现的次数加1;然后遍历词频词典,根据idf词典得到每个词的idf值,并除以词频词典中的次数总和,得到每个词的tf * idf值;如果设置了权重标志位,则根据tf-idf值对词频词典中的词进行降序排序,然后输出topK个词作为关键词;

    def 

    4.2 TextRank算法抽取关键词源码分析

    基于TextRank算法抽取关键词的主调函数是TextRank.textrank函数,主要是在jieba/analyse/textrank.py中实现。

    其中,TextRank是为TextRank算法抽取关键词所定义的类。类在初始化时,默认加载了分词函数和词性标注函数tokenizer = postokenizer = jieba.posseg.dt、停用词表stop_words = self.STOP_WORDS.copy()、词性过滤集合pos_filt = frozenset(('ns', 'n', 'vn', 'v')),窗口span = 5,(("ns", "n", "vn", "v"))表示词性为地名、名词、动名词、动词。

    首先定义一个无向有权图,然后对句子进行分词;依次遍历分词结果,如果某个词i满足过滤条件(词性在词性过滤集合中,并且词的长度大于等于2,并且词不是停用词),然后将这个词之后窗口范围内的词j(这些词也需要满足过滤条件),将它们两两(词i和词j)作为key,出现的次数作为value,添加到共现词典中;

    然后,依次遍历共现词典,将词典中的每个元素,key = (词i,词j),value = 词i和词j出现的次数,其中词i,词j作为一条边起始点和终止点,共现的次数作为边的权重,添加到之前定义的无向有权图中。

    然后对这个无向有权图进行迭代运算textrank算法,最终经过若干次迭代后,算法收敛,每个词都对应一个指标值;

    如果设置了权重标志位,则根据指标值值对无向有权图中的词进行降序排序,最后输出topK个词作为关键词;

    def 

    其中,无向有权图的的定义及实现是在UndirectWeightedGraph类中实现的。根据UndirectWeightedGraph类的初始化函数__init__,我们可以发现,所谓的无向有权图就是一个词典,词典的key是后续要添加的词,词典的value,则是一个由(起始点,终止点,边的权重)构成的三元组所组成的列表,表示以这个词作为起始点的所有的边。

    无向有权图添加边的操作是在addEdge函数中完成的,因为是无向图,所以我们需要依次将start作为起始点,end作为终止点,然后再将start作为终止点,end作为起始点,这两条边的权重是相同的。

    def 

    执行textrank算法迭代是在rank函数中完成的。

    首先对每个结点赋予相同的权重,以及计算出该结点的所有出度的次数之和;

    然后迭代若干次,以确保得到稳定的结果;

    在每一次迭代中,依次遍历每个结点;对于结点n,首先根据无向有权图得到结点n的所有

    入度结点(对于无向有权图,入度结点与出度结点是相同的,都是与结点n相连的结点),在前面我们已经计算出这个入度结点的所有出度的次数,而它对于结点n的权值的贡献等于它本身的权值 乘以 它与结点n的共现次数 / 这个结点的所有出度的次数 ,将各个入度结点得到的权值相加,再乘以一定的阻尼系数,即可得到结点n的权值;

    迭代完成后,对权值进行归一化,并返回各个结点及其对应的权值。

    def 

    4.3 使用自定义停用词集合

    jieba分词中基于TF-IDF算法抽取关键词以及基于TextRank算法抽取关键词均需要利用停用词对候选词进行过滤。实现TF-IDF算法抽取关键词的类TFIDF和实现TextRank算法抽取关键词的类TextRank都是类KeywordExtractor的子类。而在类KeywordExtractor,实现了一个方法,可以根据用户指定的路径,加载用户提供的停用词集合。

    类KeywordExtractor是在jieba/analyse/tfidf.py中实现。

    类KeywordExtractor首先提供了一个默认的名为STOP_WORDS的停用词集合。

    然后,类KeywordExtractor实现了一个方法set_stop_words,可以根据用户指定的路径,加载用户提供的停用词集合。

    可以将extra_dict/stop_words.txt拷贝出来,并在文件末尾两行分别加入“一个”和

    “每个”这两个词,作为用户提供的停用词文件,使用用户提供的停用词集合进行关键词抽取的实例代码如下,

    from 

    关键词结果为,

        keywords by tfidf:
    

    对比章节2.1中的关键词抽取结果,可以发现“一个”和“每个”这两个词没有抽取出来。

        keywords by tfidf:
        线程/ CPU/ 进程/ 调度/ 多线程/ 程序执行/ 每个/ 执行/ 堆栈/ 局部变量/ 单位/ 并发/ 分派/ 一个/ 共享/ 请求/ 最小/ 可以/ 允许/ 分配/ 

    实现原理 ,这里仍然以基于TF-IDF算法抽取关键词为例。

    前面已经介绍了,jieba/analyse/__init__.py主要用于封装jieba分词的关键词抽取接口,在__init__.py首先将类TFIDF实例化为对象default_tfidf,而类TFIDF在初始化时会设置停用词表,我们知道类TFIDF是类KeywordExtractor的子类,而类KeywordExtractor中提供了一个名为STOP_WORDS的停用词集合,因此类TFIDF在初始化时先将类KeywordExtractor中的STOP_WORDS拷贝过来,作为自己的停用词集合stop_words。

    # 实例化TFIDF类
        

    如果用户需要使用自己提供的停用词集合,则需要调用analyse.set_stop_words(stop_words_path)这个函数,set_stop_words函数是在类KeywordExtractor实现的。set_stop_words函数执行时,会更新对象default_tfidf中的停用词集合stop_words,当set_stop_words函数执行完毕时,stop_words也就是更新后的停用词集合。我们可以做个实验,验证在调用analyse.set_stop_words(stop_words_path)函数前后,停用词集合是否发生改变。

    from 

    结果如下所示,

    True
        

    说明:

    - 没有加载用户提供的停用词集合之前,停用词集合就是类KeywordExtractor中的STOP_WORDS拷贝过来的;

    - 加载用户提供的停用词集合之后,停用词集合在原有的基础上进行了扩充;

    证明了我们的想法。

    5 Reference

    关键词抽取简介ling0322.infoTF-IDF与余弦相似性的应用(一):自动提取关键词 - 阮一峰的网络日志www.ruanyifeng.com
    7529c37ec8e260fefad51e942d23fb92.png
    TextRank: Bringing Order into Textsweb.eecs.umich.edu
    展开全文
  • 1 对关键词的词频进行统计 下面展示一些 内联代码片。 # encoding=utf-8 import openpyxl wb = openpyxl.Workbook() wb = openpyxl.load_workbook('copy1.xlsx') # Excel名 sh = wb['all'] # sheet名 ''' 换一种写法...

    1 对关键词的词频进行统计

    下面展示一些 内联代码片

    # encoding=utf-8
    import openpyxl
    wb = openpyxl.Workbook()
    wb = openpyxl.load_workbook('copy1.xlsx')       # Excel名
    sh = wb['all']                              # sheet名
    '''
    换一种写法
    row=sh.max_row                             # 得到行数
    '''
    cons=[]  # 将所有数据append成一个list
    for cases in list(sh.rows)[1:9240]: # 行数,也可以通过代码来带入 即row
        case_D = cases[2].value         # 关键词所在的列
        cons.append(case_D)   
    
    result_new = []
    res2 = []
    for con in cons:
        fenci = con.strip().split('; ') # 假定关键词是以分号+空格分开的
        result_new.append(fenci)
    new = sum(result_new,[])
    res2.append(new)
    #print(res2)  # res2的形式是   [['aaa','bbb','abc']]
    
    import collections
    dic = collections.Counter(res2[0])
    
    from openpyxl import Workbook
    workbook = Workbook()
    i=2                          # 默认sheet
    sh = workbook.active
    sh.title = "count"           #sheet名     
    for key in dic:
        sh.cell(row=1, column=1, value='关键词')
        sh.cell(row=1, column=2, value='频次')    
        sh.cell(row=i, column=1, value=str(key))
        sh.cell(row=i, column=2, value=dic[key])
        i+=1
    workbook.save(r'name.xlsx')
    

    2 统计词共现的全部代码

    注意,'一行作者.txt’这个文件必须是每篇文献的作者之间通过//连接成一行,合作作者通过分号+空格连接。

    import pandas as pd
    import numpy as np
    from openpyxl import Workbook
    
    def authors_stat(co_authors_list):
        au_dict = {}  # 单个作者频次统计
        au_group = {}  # 两两作者合作
        for authors in co_authors_list:
            authors = authors.split('; ')  # 按照逗号分开每个作者
            authors_co = authors  # 合作者同样构建一个样本
            for au in authors:     # 统计单个作者出现的频次
                if au not in au_dict:
                    au_dict[au] = 1
                else:
                    au_dict[au] += 1
                # 统计合作的频次
                authors_co = authors_co[1:]  # 去掉当前作者
                for au_c in authors_co:
                    A, B = au, au_c  # 不能用本来的名字,否则会改变au自身
                    if A > B:
                        A, B = B, A  # 保持两个作者名字顺序一致
                    co_au = A+'; '+B  # 将两个作者合并起来,依然以逗号隔开
                    if co_au not in au_group:
                        au_group[co_au] = 1
                    else:
                        au_group[co_au] += 1
        return au_group, au_dict
    
    if __name__ == '__main__':
        f1 = open('一行作者.txt','r',encoding = 'utf-8')
        cons = f1.read()
        co_authors = cons
        co_authors_list = co_authors.split('//')
        au_group, au_dict = authors_stat(co_authors_list)
     
        workbook = Workbook()
        i=2   # 默认sheet
        sh = workbook.active
        sh.title = "count"
        for (k,v) in  au_group.items(): 
            sh.cell(row=1, column=1, value='合作作者')
            sh.cell(row=1, column=2, value='频次') 
            sh.cell(row=i, column=1, value=str(k))
            sh.cell(row=i, column=2, value=v)
            i+=1
        workbook.save(r'co_author.xlsx')
    

    在这里插入图片描述
    下次教画图。

    接下来就是愉快的分析啦。
    over is Over——Lee

    展开全文
  • 1 HistCite可快速绘制出某个研究领域的发展脉络,快速锁定某个研究方向的重要文献和学术大咖,还可以找到某些具有开创性成果的无指定关键词的论文。(缺点:引文数据只能来源于Web of Science的文献记录,只支持 ...
  • 需求分析从方法上可以分为定性分析和定量分析。定性分析偏向于通过用户访谈等方式展开;定量分析则通常会基于用户使用产品过程中留下的客观记录进行统计分析,这些客观记录包括行为日志、交易日志等等。今天,我们就...
  • 在学习数据分析时,我们常会提到由于某某数据是某类型,所以采取对于的统计分析方法。所以对于数据类型的了解就变得十分必要。根据存储方式划分根据存储方式,我们可以把数据分为结构化数据和非结构化数据。结构化...
  • 基于关键词共现的文本信息分析方法及应用研究--以信用评价为例,王功辉,刘卫江,关键词共现分析是文献计量学中常用的一种重要的量化研究方法,本文以文本的关键词为基础,从关键词的共同标引为切入点,采用量化
  • 本文以CiteSpace软件做的关键词共现分析为例,进行关键词共现图谱含义详细解析。 关键词是一篇论文的核心概括,对论文关键词进行分析可对文章主题窥探一二。 而一篇论文给出的几个关键词一定存在着某种关联,而这种...
  • 需要的作者共现、关键词共现次数 使用到的工具包括python和gephi 注意:gephi的安装需要java支持。 1、数据准备 在对某领域的学术论文进行描述性统计时,最常需要的是统计关键词/作者出现次数/发文数,关键词/作者...
  • python实现了知网论文的高频关键词提取,生成高频关键词矩阵,并进行了社会网络分析
  • 如何用VOSviewer分析CNKI关键词共现

    万次阅读 2018-01-05 00:00:00
    用VOSviewer尝试CNKI中文文献关键词共现(keyword co-occurence)分析时,你可能会踩到一个大坑。本文帮助你绕开这个坑,或是从坑里爬出来。(由于微信公众号外部链接的限制,文中的部分链接可能无法正确打开。如有...
  • 在做社会网络分析时,首先需要得到共现矩阵,如关键词共现矩阵、作者共现矩阵、机构共现矩阵等。可是如何把从知网里导出的这些数据做成共现矩阵就比较麻烦了。当然可以使用bibexcel或者《书目共现分析系统》...
  • “组织变革”这个词最早是由学者库尔特于1947年提出的。 在1990年代之前,大多数学者高度赞扬旧制度主义,认为组织变革是解释的总结。... 另外,我们将彻底分析与中心性强的四个关键词相关的文献。
  • 这篇随笔是写在看了若干篇关于高频关键词共现和ACA的文章之后的一个总结,这些论文大多是2010年之前发表的,这与这种方法是传统方法有很大关系。同时,这些文章不仅限于图书情报领域。 下面是正文: ①大多数论文...
  •   完全是开脑洞的一个作品。当时正值清某大学和青某市要联合建立大数据研究中心,我作为有理工科背景的社科学术农民工被拉进来贡献一份力量。窃以为“公公知识分子”那么多,也不缺我一个,就大胆地站在了批判的...
  • 共现分析软件bibexcel

    2011-05-15 22:52:18
    文献信息分析软件,可用于关键词共现分析,很好用的。
  • 本系统通过引入包括三词在内的多词共现分析方法,我们可以在更大的范围内搜寻词语之间的语义相关性,同时增强语义相关度的识别效果。目前,实现了两种推荐形式: 1)根据个人作者的名称来给出推荐结果 该形式主要...
  • Python 实现文本共现网络分析

    千次阅读 2021-01-23 19:13:30
    前两天简单地做了一个文本挖掘实战分析,里面提到了共现分析,但是并没有完成,有些遗憾 经过查阅资料,最终还是粗糙地完成了这个分析 对于共现分析 共词网络方法在知识网络研究中应用普遍,最为常见的就是利用...
  • 国内外开放存取领域的研究热点挖掘,蒋翠清,陈小维,本文以中国知网(CNKI)和Web of Science中收录的开放存取领域相关文献为数据来源,借助CiteSpace软件,利用关键词共现分析法分析国内外开
  • 文章首先通过趋势图对比当前国内外对区块链的不同研究现状,再者,运用文献计量方法分析区块链研究的时间和空间分布特征,继而使用CiteSpace工具绘制可视化知识图谱,进行关键词共现分析、作者共现分析,以展示当前的研究...
  • 共现关系

    千次阅读 2018-07-20 10:21:43
    0 前言 ...例如,需要通过分析一篇小说或剧本,来分析剧中各个角色之间的人物关系,可以用共现关系。 一般我们认为,在一篇文章中的同一段出现的两个人物之间,一定具有某种关联,因此我们的程序...
  • 文章以针对Web of Knowledge开发的文献信息共现分析的应用软件——Bibexcel为研究对象,结合CSSCI数据库数据格式特点,解决了Bibexcel不能处理中文文献的瓶颈问题,实现了知识单元共现关系矩阵。并以CSSCI数据库中...
  • citespace 2 v3.5.R6

    2013-05-18 20:27:48
    科学文献分析与知识图谱可视化软件 跨平台的JAVA程序,支持并行计算 功能强大,包括:突发词检测、共被引分析、引文耦合分析、合著网络分析、国家(机构)合作分析、期刊共被引分析、关键词共现分析…… 免费
  • 回顾上一次推文:CiteSpace关键词共现图谱含义详细解析其中有一句:当你人工已经可以很容易的进行归纳后,就不需要再利用CiteSpace聚类功能啦。我们来看一下上次推文做出来的关键词共现图谱:我们可以通过眼睛观察,...
  • 回顾上一次推文:CiteSpace关键词共现图谱含义详细解析其中有一句:当你人工已经可以很容易的进行归纳后,就不需要再利用CiteSpace聚类功能啦。我们来看一下上次推文做出来的关键词共现图谱:我们可以通过眼睛观察,...
  • 共现关系在文献计量学中,关键词的共词方法常用来确定该文献集所代表学科中各主题之间的关系。而在这里,我们需要通过分析一篇小说或剧本,来分析剧中各个角色之间的人物关系。两者有很相同的地方。一般我们认为,在...

空空如也

空空如也

1 2 3 4 5
收藏数 82
精华内容 32
关键字:

关键词共现分析