NLP算法-关键词提取之Jieba算法库

关键词提取

  • 什么叫关键词提取?
  • 关键词提取方法分类
    • 有监督
    • 无监督
    • 优缺点
  • Jieba 关键词提取
  • TF/IDF算法
    • TF-IDF的主要思想
    • 如何训练关键词提取算法
    • demo
  • PageRank算法
  • TextRank算法
    • demo
  • 其他概念参考链接

什么叫关键词提取?

为了方便用户快速了解文章的中心主题,会抽取文章的一些中心词来表达文章的中心思想。关键词抽取就是通过一定的方法抽取出能表达文章的中心主题的一系列方法

在信息爆炸的时代,很多信息我们无法全面接收,我们需要从中筛选出一些我们感兴趣的或者说对我们有用的信息进行接收。怎么选择呢,关键词提取就是其中一个很好的方法。如果我们可以准确地将所有文档都用几个简单的关键词描述出来,单看几个关键词就可以了解一篇文章,这样会大大提高我们的信息获取效率。

关键词提取方法分类

类似于其他的机器学习方法,关键词提取算法一般也可以分为有监督和无监督两类:

有监督

主要通过分类的方式进行,通过构建一个丰富和完善的词表,然后通过判断每个文档与词表中每个词的匹配程度,以类似打标签的方式,从而达到关键词提取的效果。能够获得较高精度,但是需要大批量的标注数据,人工成本较高;

无监督

这种方式无需人工生成、维护的词表,同时也不需要人工标注语料辅助进行训练;

无监督关键词提取方法主要有三类:

  • 基于统计特征的关键词提取(TF,TF-IDF);

基于统计特征的关键词提取算法的思想是利用文档中词语的统计信息抽取文档的关键词;

  • 基于词图模型的关键词提取(PageRank,TextRank);

基于词图模型的关键词提取首先要构建文档的语言网络图,然后对语言进行网络图分析,在这个图上寻找具有重要作用的词或者短语,这些短语就是文档的关键词;

  • 基于主题模型的关键词提取(LDA)

基于主题关键词提取算法主要利用的是主题模型中关于主题分布的性质进行关键词提取;

优缺点

无监督方法不需要人工标注训练集合的过程,因此更加快捷,但由于无法有效综合利用多种信息 对候选关键词排序,所以效果无法与有监督方法媲美;
而有监督方法可以通过训练学习调节多种信息对于判断关键词的影响程度,因此效果更优,有监督的文本关键词提取算法需要高昂的人工成本,因此现有的文本关键词提取主要采用适用性较强的无监督关键词提取。

现在有出现一个新的概念叫半监督机器学习,具体的算法和思想这里不详述,相关链接在文章最后。


Jieba 关键词提取

jieba 库是一款优秀的 Python 第三方自然语言处理库。
jieba的主要功能是做中文分词,可以进行简单分词、并行分词、命令行分词,当然它的功能不限于此,目前还支持关键词提取、词性标注、词位置查询等。

更让人愉悦的是jieba虽然立足于python,但同样支持其他语言和平台,诸如:C++、Go、R、Rust、Node.js、PHP、 iOS、Android等。所以jieba能满足各类开发者的需求。

再利用 jieba 进行关键词提取时,有两种方式,一种是基于 TF-IDF 算法,一种是基于 TextRank 算法。接下来我们具体介绍这两种方式。


TF/IDF算法

TF/IDF 算法(Term Frequency-Inverse Document Frequency ,词频-逆文档频次算法)是一种基于统计的计算方法,常用于评估在一个文档集中一个词对某份文档的重要程度 这种作用显然很符合关键词抽取的需求,一个词对文档越重要,那就越可能是文档的关键词,因此,人们常将 TF/IDF 算法应用于关键词提取中。
NLP算法-关键词提取之Jieba算法库_第1张图片

TF-IDF的主要思想

TF-IDF 的主要思想是:如果某个单词在一篇文章中出现的频率(TF)高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

  1. TF 是词频( Term Frequency )

词频( TF )表示词条(关键字)在文本中出现的频率。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。计算公式为: T F w = 在某一类中词条 w 出现的次数 该类中所有词条数目 TF_{w} = \frac{在某一类中词条w出现的次数}{该类中所有词条数目} TFw=该类中所有词条数目在某一类中词条w出现的次数

2. IDF 是逆向文件频率( Inverse Document Frequency )

某一特定词语的 IDF ,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。计算公式为:
i d f i = l o g ∣ D ∣ ∣ j : t i ∈ d j ∣ idf_i=log\frac{|D|}{|j:t_i\in{d_j}|} idfi=logj:tidjD

  1. TF-IDF 实际上是:TF * IDF

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的 T F − I D F TF-IDF TFIDF
因此,TF-IDF 倾向于过滤掉常见的词语,保留重要的词语。计算公式为:
T F − I D F = T F ∗ I D F TF-IDF=TF∗IDF TFIDF=TFIDF

如何训练关键词提取算法

我们训练一个关键词提取算法需要以下几个步骤:

  • 加载已有的文档数据集;
  • 加载停用词表;
  • 对数据集中的文档进行分词;
  • 根据停用词表,过滤干扰词;
  • 根据数据集训练算法。

再根据训练好的关键词提取算法对新文档进行关键词提取要经过对新文档进行分词;
根据停用词表,过滤干扰词;
提取关键词这个几个环节。

demo

#本程序的作用是通过TF/IDF算法完成对文本的关键词提取,输出前十个关键词。
import math
import jieba
import jieba.posseg as psg
from gensim import corpora, models
from jieba import analyse
import functools
from collections import defaultdict

class TfIdf(object):
    # 四个参数分别是:训练好的idf字典,默认idf值,处理后的待提取文本,关键词数量
    def __init__(self, idf_dic, default_idf, word_list, keyword_num):
        self.word_list = word_list
        self.idf_dic, self.default_idf = idf_dic, default_idf
        self.tf_dic = self.get_tf_dic()
        self.keyword_num = keyword_num
        
    def get_tf_dic(self):
        tf_dic = {}
    # 任务:完成word_list的tf值的统计函数,将结果存储到tf_dic变量中
        doc_frequency=defaultdict(int)
        for i in self.word_list:
            doc_frequency[i]+=1
        for i in doc_frequency:
            tf_dic[i]=doc_frequency[i]/sum(doc_frequency.values())
        return tf_dic

    # 按公式计算tf-idf
    def get_tfidf(self):
        tfidf_dic = {}
        for word in self.word_list:
            idf = self.idf_dic.get(word, self.default_idf)
            tf = self.tf_dic.get(word, 0)

            tfidf = tf * idf
            tfidf_dic[word] = tfidf

        tfidf_dic.items()
        # 根据tf-idf排序,去排名前keyword_num的词作为关键词
        for k, v in sorted(tfidf_dic.items(), key=functools.cmp_to_key(cmp), reverse=True)[:self.keyword_num]:
            print(k + "/ ", end='')
        print()
        
        
#排序函数,用于topK关键词的按值排序
def cmp(e1, e2):
    import numpy as np
    res = np.sign(e1[1] - e2[1])
    if res != 0:
        return res
    else:
        a = e1[0] + e2[0]
        b = e2[0] + e1[0]
        if a > b:
            return 1
        elif a == b:
            return 0
        else:
            return -1


PageRank算法

TextRank 算法的基本思想来源于 Google 的 PageRank 算法。
PageRank 算法主要用于对在线搜索结果中的网页进行排序。
让我们通过一个例子快速理解这个算法的基础。

NLP算法-关键词提取之Jieba算法库_第2张图片
假设我们有4个网页—— w 1 , w 2 , w 3 , w 4 w_1 ,w_2 ,w_3 ,w_4 w1w2w3w4
这些页面包含指向彼此的链接。有些页面可能没有链接,这些页面被称为悬空页面。

webpage links
w1 [w4,w2]
w2 [w3,w1]
w3 [ ]
w4 [w1]

如上表所示,各个网页之间的关系有:

  • w1有指向w2 、w4的链接;
  • w2有指向w3和w1的链接;
  • w4仅指向w1;
  • w3没有指向的链接,因此为悬空页面。

为了对这些页面进行排名,我们必须计算一个称为 PageRank 的分数。这个分数是用户访问该页面的概率。

为了获得用户从一个页面跳转到另一个页面的概率,我们将创建一个正方形矩阵 M,如图2所示,它有 n 行和 n 列,其中 n 是网页的数量。
NLP算法-关键词提取之Jieba算法库_第3张图片
矩阵中的每个元素表示从一个页面链接进另一个页面的可能性。如图3所示,高亮的方格包含的是从 w1跳转到w2的概率。
NLP算法-关键词提取之Jieba算法库_第4张图片
如下是概率初始化的步骤:

  1. 从页面 i 连接到页面 j 的概率,也就是 M[i][j] ,初始化为1/页面i的出链接总数wi ;
  2. 如果页面 i 没有到页面 j 的链接,那么 M[i][j] 初始化为 0 ;
  3. 如果一个页面是悬空页面,那么假设它链接到其他页面的概率为等可能的,因此 M[i][j] 初始化为1/页面总数。

因此在本例中,矩阵 M 初始化后如图所示:
NLP算法-关键词提取之Jieba算法库_第5张图片
最后,这个矩阵中的值将以迭代的方式更新,以获得网页排名。

TextRank算法

掌握了 PageRank 算法后,让我们理解 TextRank 算法。两种算法的相似之处列举如下:

  • 用句子代替网页;
  • 任意两个句子的相似性等价于网页转换概率;
  • 相似性得分存储在一个方形矩阵中,类似于 PageRank 的矩阵 M 。

NLP算法-关键词提取之Jieba算法库_第6张图片
TextRank 算法是一种抽取式的无监督的文本摘要方法。其步骤如下:

  1. 把所有文章整合成文本数据;
  2. 把文本分割成单个句子;
  3. 为每个句子找到向量表示(词向量);
  4. 计算句子向量间的相似性并存放在矩阵中;
  5. 将相似矩阵转换为以句子为节点、相似性得分为边的图结构,用于句子 TextRank 计算;
  6. 一定数量的排名最高的句子构成最后的摘要。

demo

from jieba import analyse
import jieba.analyse

text = input() # 原始文本
# 任务:使用jieba模块中有关TextRank算法的模块完成对text中前三个关键字的提取并输出

result = ''
#words = jieba.analyse.extract_tags(sentence, topK=3, withWeight= False, allowPOS=("n"))
#words = jieba.analyse.textrank(sentence, topK=5, withWeight=True, allowPOS=("vn"))
#print(words)

words = jieba.analyse.textrank(text, topK=3, withWeight=False, allowPOS=("ns","n","vn","v"))
for word in words:
   result += word + " "
print(result)

测试输入:
在抗击新型冠状病毒的特殊时期,有这样一群人,面对疫情,他们逆向而行,穿梭在辖区的街头巷尾。一只口罩、一双手套,简单的防护措施,就是他们为自己武装的勇气。作为抗击疫情战场上不可或缺的组成部分,社区工作者们用爱筑起了疫情防控的第一道防线。

输出:
疫情 防护 手套


其他概念参考链接

半监督学习
https://zhuanlan.zhihu.com/p/33196506

你可能感兴趣的:(python,算法,自然语言处理,机器学习)