TF-IDF算法实现关键词抽取
TF-IDF(term frequency-inverse document frequency)是一种用于咨询检索与资讯探勘的常用加权技术。
一种统计方法,用以评估一字词对于一个文件集或者一个语料库中的其实一份文件的重要程度。字词的重要性随着他在文件中出现的次数成正比地增加,但同时随着他在语料库中出现的频率呈反比地下降。
TF-IDF 存在自身算法缺陷:
如果某一个文档C中包含词条t的文档数为m,而其他类包含t的文档总数为k,显然所有包含t的文档数位n=m+k,当m大的时候,n也大,按照IDF的值会小,就说明该词条t类别区分能力不强。
改进方法可以通过改变文档结构,比如将一类短文本归为一个文档,这样就可以增加TF值的同时,也增加IDF的值,但同时也会增加模型的计算成本。
(权重比值关系引起的模型失灵)
TextRank算法实现关键词抽取
TF-IDF对多段文本的关键词提取非常有效,但是对于单章或者文档分割较少的文本表现的不是特别好。
TextRank是一种基于图排序的算法,其基本思想来源于谷歌的PageRank算法,通过把文本分割成若干个单元(单词、句子)并建立图模型,利用投票机制对文本中的重要成分进行排序,尽利用单章文档本身的信息即可实现关键词提取、做文摘。
1. 基于TextRank的关键词提取
关键词抽取的任务就是从一段给定的文本中自动抽取出若干有意义的词语或词组。TextRank算法是利用局部词汇之间关系(共现窗口)对后续关键词进行排序,直接从文本本身抽取。其主要步骤如下:
1.把给定的文本T按照完整句子进行分割,
2.对于每个句子进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词,即保留候选关键词。
3.构建候选关键词图G = (V,E),其中V为节点集,由(2)生成的候选关键词组成,然后采用共现关系(co-occurrence)构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词。
4.根据上面公式,迭代传播各节点的权重,直至收敛。
5.对节点权重进行倒序排序,从而得到最重要的T个单词,作为候选关键词。
6.由(5)得到最重要的T个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词。例如,文本中有句子“Matlab code for plotting ambiguity function”,如果“Matlab”和“code”均属于候选关键词,则组合成“Matlab code”加入关键词序列。
cm = defaultdict(int)
#切词
words = tuple(self.tokenizer.cut(sentence))
for i, wp in enumerate(words): #(enumerate枚举的方式进行)
#过滤词性,停用词等
if self.pairfilter(wp):
for j in xrange(i + 1, i + self.span):
if j >= len(words):
break
if not self.pairfilter(words[j]):#过滤
continue
#保存到字典中
if allowPOS and withFlag:
cm[(wp, words[j])] += 1
else:
cm[(wp.word, words[j].word)] += 1
对于单词之间的相似度的计算也是决定最终效果好坏的一个重要因素,对于单词的相似度计算可以采用基于编辑距离、语义词典、余弦相似度等传统方法,也可以采用基于Enbedding的方法,特别是目前基于深度学习的Word2Vec、skip-gram等算法的兴起,此类方法有了更好的效果和更加实用的工具。
基于语义的统计语言模型实现关键词抽取
一种基于LDA(Latent Dirichlet Allocation)的关键词提取算法
LDA模型包含词、主题和文档三层结构
原理
模型认为一篇文章的生成过程是:
先挑选若干主题,在为每个主题挑选若干词语。最终,这些词语就组成了一篇文章。所以主题对于文章是服从多项式分布的,同时单词对于主题也是服从多项式分布的。基于这样的理论,如果一个单词w对于主题t非常重要,而主题t对于文章d又非常重要,那么单词w对于文章d就很重要。
基于LDA主题概率模型的关键词提取方法的准确度,会严重依赖于基础语料库