关键词抽取模型常见的算法有TF-IDF、TextRank等,本文仅在这里对这两种方法作原理的简单介绍。
TF-IDF(term frequency-inverse document frequency) :一种用于资讯检索于资讯探勘的常用加权技术。是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数呈正比地增加,但同时也会随着它在语料库中出现的频率呈反比地下降。
主要思想:如果某个词或短语在一篇文章中出现的频率(Term Frequency,TF)高,并且在其他的文章出现得少,即反文档频率(Inverse Documnet Frequency,IDF)低,则认为此词或短语具有很好的类别区分能力,适合用来分类。
具体计算公式:
其中,
:指词i对文档j的重要程度;
:指词i在文档j中出现的次数占比。计算公式如:
其中,指词i在文档j中出现的次数,指文档j中所有词出现的次数之和;
:指词i的你文档频率,是指总文档数与词i所在文档数目之比,其计算公式如:
其中,为文档总书目,表示包含词 的文档数目。
文档1:程序员从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统程序员和项目经理四大类。
文档2:现在网络流行上把那程序员称为“程序猿”,女程序员称为“程序媛”。目前从事IT技术行业的大多数为男性,女性多数从事其他(如:会计、行政、人力资源等)种类的工作,在IT技术里女程序员是很受欢迎的,因此人们爱称女程序员为“程序媛”。
以上述两个文档,介绍TF-IDF的计算思路:
:对文档进行分词,将词语以空格分隔存储在一起,并对每一句话存储为一行;
:统计文档中词语出现的次数,可以以dict存储(如:{key:value}:{'程序员':5}),及文档的词语总数目;
:对指定词语i统计其出现在文档中的数目,可以以dict存储(如:程序员出现在文档1和文档2中,记为{'程序员':2});
:计算,根据的公式进行计算;
:计算,根据公式计算。
优点:TF-IDF的思想对于具有代表性的词语(词语出现在一类文档中,该词语具备代表性)能够很好地表示;
缺点:TF-IDF对于一些在文本中出现频率高但同样具有代表性的词语不能很好表示。例如:
1)鲜花多少钱?2)百合花多少钱?3)水仙花多少钱?4)苹果多少钱?5)橘子多少钱?
如果按照TF-IDF算法,对于5个文档,鲜花、百合花、水仙花、苹果、橘子这些主体词会成为关键词,但从语句的总体来看,它们又都属于询问价格的类型,所以“多少钱”应该成为关键词。
改进:基于TF-IDF的计算法提出的改进方法是,将多个短文本整理为一个文本,这样既可以增加TF值,又可以增加IDF值。
TF-IDF对于多段文本的关键词提取非常有效,但是对于单篇或者文档分割较少的文本则表现的不是很好,下面介绍TextRank用于解决这一情况。
TextRank是一种基于图排序的算法。其基本思想来源于google的PageRank算法,通过把文本切分为若干组成单元(单词或者短语或者句子)并建立图模型(所谓这样的图模型,例如:今天阳光明媚,天清气爽,适合出游。所以今天去公园吧。这句话的图模型可以是:今天--阳光--明媚--天清气爽--适合--出游--所以--(折回前面的“今天”)--去--公园--吧),利用投票机制对文本中的重要程度成分进行排序(就前面的例子来说:“今天”的重要程度会比较高),仅利用单篇文档本身的信息即可实现关键词提取、做文摘。
TextRank利用投票的原理,让每一个单词给它的邻居(也即窗口)投赞成票,票的权重取决于自己的票数。所以如上所述,它是一个图排序模型,我们假设每一个词是一个顶点(Vertex),那么所有的词就构成了一个网络,在这个网络里面每一个顶点会指向其他顶点的边,也会由其他顶点指向自己的边。通过计算每个顶点所连接的指向自己的顶点的权重和,最终得到该顶点的权重值。
初始值确定:因为目标的权重取决于自身的权重(通过计算每个顶点所连接的指向自己的顶点的权重和),所以这里的初始值为非0的值。
这里引入了阻尼系数的概念。在图模型中,该参数表示从某一个指定的顶点,到任意一个其他顶点的概率。所以TextRank具体公式如下:
其中,
:表示阻尼系数,一般设置为0.85(为经验值);
:表示图中的任一节点;
:表示指向顶点的所有顶点集合;
:表示由顶点连接出去的所有顶点集合;
:表示顶点和的连接权重;
:表示顶点的最终排序权重。
文档1:程序员从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统程序员和项目经理四大类。
TextRank是一个图排序模型,因此我们需要构建一个图模型。如下是具体的思路步骤:
:对文本进行切分为字或词形式。
:对切分好的字或词构建图模型,也即构建一个字或词与字或词的连接矩阵;选择用滑动窗口的方式对每个单词取邻居:假设,我们取一个长度为k的滑动窗口,则等都是一个窗口。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边;在这个邻居上面构成图,可以计算出每个单词节点的重要性。
:权重计算;1) 设定最大迭代次数,并依次进行逐步迭代;
2) 按照连出矩阵,对每一个单词节点更新其排序权重;
3) 对于连出到自身或者连出为空的单词节点不进行计算,因为这部分节点在图中属于孤立点,所以只要求保持其初始值即可;
4) 对于连出的其他词的单词节点,则按照TextRank公式,逐步更新其排序权重;
5) 同时根据前后两次迭代之间单词的权重变化值,来判断是否提前结束循环过程。
TextRank算法对于一段文本中多次出现的词,赋予更大的权重,因为它连出的节点会更多,所以当各个节点的初始权重一致的时候,则最终出现次数多的词权重会更大。这样会使类似于“的”、"你、我、他"等常用词,会出现比较大的误差,因为这些词一般没有什么特别的含义,仅仅是一个连接词或指代词。对于这种情况,可以在对文本进行切分时,去掉里面的停用词或其他符合一定规则的词语。
如:1)鲜花多少钱?2)百合花多少钱?3)水仙花多少钱?
在上述的3个语句中,如果希望提取的关键词更符合主题分布,那么应该是“鲜花”or“多少钱”。这里介绍LDA(Latent Dirichlet Allocation)的关键词提取算法。
其中,
1) 为主题k中的词汇概率分布,为第m篇文档的主题概率分布,和服从Dirichlet分布,和作为多项式分布的参数分别用于生成主题和单词;
2) 和分别为和的分布参数,反映了文档集中隐含主题之间的相对强弱,为所有隐含主题自身的概率分布;
3) K为主题数目;
4) M为文档集中文档数目;
5) 为第m篇文档的词的总数;
6) 和分别为第m篇文档中第n个单词和其他隐含主题。
LDA模型中,包含词、主题、文档三层结构。该模型认为一篇文档的生成过程是:先挑选主题,再为每个主题挑选若干词语;最终由这些词语就组成了一篇文章。所以主题对于文章是服从多项分布的,同时单词对于主题也是服从多项分布。基于这样的理论,我们可以知道,如果一个单词w对于主题t非常重要,而主题t对于文章d有非常重要,那么单词w对于文章d就很重要,并在同主题的词里面,单词w的权重也会较大。
根据上述,需要计算两个概率:单词对于主题的概率和主题对于文章的概率。我们这里采用Gibbs采样法来进行概率的计算。具体公式如下:
1)主题下各个词的权重计算公式:
其中
:表示单词集合中任一单词;
:表示主题集合中任一主题;
:表示在主题为k时,单词i出现的概率,简记为;
:表示语料库中单词i被赋予主题k的次数;
:表示词汇表的大小;
:表示超参数;
2)文档下各个词的权重计算公式:
其中,
:表示文档集合中任一文档;
:表示主题集合中任一主题;
:表示在文档为m时,主题k出现的概率,简记为;
:表示语料库中文档m中单词被赋予主题k的次数;
K:表示主题的数量;
:表示超参数;
3)指定文档下某主题出现的概率,以及制定主题下、某单词出现的概率计算:
基于上述公式,我们可以计算出单词i对于文档m的主题重要性。但是由于在LDA主题概率模型中,所有的词汇都会以一定的概率出现在每个主题,所以这样会导致最终计算的单词对于文档的主题重要性值区分度受影响。为避免这种情况,一般会将单词相对于主题概率小于一定阈值的概率置为0(也可根据实际情况设定).
LDA实现大致思路:1)对文本进行分词并去除非重要性词语,采用正向过滤的方法,即选定特定词性的词。
2)在得到候选表后,对语料库进行Gibbs采样,得到单词-主题,文档-主题的分布统计矩阵;
参考资料:《自然语言处理技术入门与实践》