zengbin93 / blog

17 stars 10 forks source link

笔记 - 关键词提取算法 #1

Open zengbin93 opened 6 years ago

zengbin93 commented 6 years ago

关键词是指能反映文本主题或者主要内容的词语。关键词提取是NLP领域的一个重要的子任务。在信息检索中,准确的关键词提取可以大幅提升效率;在对话系统中,机器可以通过关键词来理解用户意图;在文本分类中,关键词的发现也非常有帮助。

关键词提取的方法主要有:TF-IDF、TextRank、Rake、Topic-Model等。

zengbin93 commented 6 years ago

TextRank - A Graph Based Ranking Model

TextRank是一个无监督算法,本质上是一个用于文本处理的图排序模型。对于图排序模型来说,它需要做的就是找到一种方法来计算图中任一顶点(Vertex)的重要性,这个方法需要依赖整个图的全局信息(global information)进行递归计算,而不仅仅是任一顶点的局部信息(local vertex-specific information)。

zengbin93 commented 6 years ago

TF-IDF

TF-IDF的基本思想是:词语的重要性与它在文件中出现的次数成正比,但同时会随着它在语料库中出现的频率成反比下降。

一个文档中多次出现的词总是有一定的特殊意义,但是并不是所有多次出现的词就都是有意义的,如果一个词在所有的文档中都多次出现,那么这个词就没有什么价值了。或者说,如果某个词或者短语在一个文档中出现多次,但是在其他文档中很少出现,就可以认为这个词或短语具有很好的区分性,适合用来对文档进行分类。

image

TF(Term Frequency)表示一个词在文档中出现的次数。

DF(Document Frequency)表示整个语料库中含有某个词的文档个数

IDF(Inverse Document Frequency)为逆文档频率,其计算公式为: IDF= log(语料库中文档总数/(包含该词的文档数+1))

+1 的作用是确保分母不为零。

TF-IDF = TF * IDF

由公式可知:一个词在文档中出现的次数越多,其TF值就越大,整个语料库中包含某个词的文档数越少,则IDF值越大,因此某个词的TF-IDF值越大,则这个词是关键词的概率越大。

TF-IDF关键词提取算法的一大缺点是:为了精确的提取一篇文档中的关键词,需要有一整个语料库来提供支持。 这个问题的解决方法,通常是在一个通用的语料库上提前计算好所有词的IDF值,jieba就是这么做的。这样的解决方案对于普通文档关键词提取有一定的效果,但是对于专业性稍微强一点的文档,表现就会差很多。

jieba中的已经有TF-IDF关键词提取算法的实现。使用jieba中的TF-IDF关键词提取算法的代码如下:

import jieba.analyse

p = "在新时代,实施网络强国战略必须要有新作为。习近平总书记一再强调,"
    "我们要掌握我国互联网发展主动权,保障互联网安全、国家安全,就必须"
    "突破核心技术这个难题,争取在某些领域、某些方面实现“弯道超车”。"
    "总书记以卓越的政治智慧和远见卓识,站在网络安全和信息化事业发展"
    "全局的高度,鲜明指出了我国网信事业发展的关键点和突破口。"

key_words = jieba.analyse.extract_tags(p, topK=6, withWeight=True)

key_words = [(x[0], round(x[1], 4)) for x in key_words]

print(key_words)
zengbin93 commented 6 years ago

Rake - Rapid Automatic Keyword Extraction

Rake算法引入了一个degree(度)的概念,并且对词和短语不做任何区分,因此,它实际上是不仅仅是在提取关键词,也是在提取关键短语。

关于Rake中引入的degree,它其实是图论中的一个概念。在一张图上,任一顶点的degree(度)是指与该顶点相关联的边的条数。 在Rake算法中,一个词的degree其实就是它在整个文档中的非重复共现词的数量。

举个例子来说明degree的计算。比如在 “我要买一个小米手机,因为大家都说小米手机很好用!”中,“小米”这个词出现了两次,共现词分别是 【一个,手机,说,手机】,因此,在这句话中,“小米”这个词的degree就是3。

使用Rake算法进行关键词提取不需要一整个语料库的支持,相比于TF-IDF,这是一个很大的优势。

Rake算法的输入参数有三个:1)停用词表(stop words);2)段落分割符;3)词语分割符。针对同一种语言,这三个参数事实上是一样的。

使用Rake算法进行关键词(短语)提取的过程如下:

step 1. 从输入文本中获取候选关键词(candidate keywords)

step 2. 计算所有候选关键词的得分,公式如下:

 score = sum(deg(w)/freq(w))

step 3. 拼接候选关键词(以同样的顺序相邻出现两次),获取带有停用词的关键词

step 4. 输出得分最高的前T个候选关键词作为关键词,作者的做法是输出前三分之一

Rake算法的实现,请点击:https://github.com/zelandiya/RAKE-tutorial