当前位置: 首页 > news >正文

自然语言处理系列之: 关键词提取算法

大纲

  • 关键词提取技术介绍
  • 常用的关键词提取算法详解
  • 文本关键词提取实战

5.1 关键词提取技术概述

  • 有监督

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

  • 无监督

    不需人工生成、维护的词表,也不需要人工标注语料辅助进行训练,主要有TF-IDF算法、TextRank算法和主题模型算法(LSA、LSI、LDA等);


5.2 关键词提取算法TF-IDF

  • TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频次算法):基于统计的计算方法,常用于评估一个文档集中一个词对某份文档的重要程度。TF算法统计一个词在一篇文档中出现的频次,基本思想为:一个词在文档中出现的词数越多,则对文档的表达能力也越强。IDF算法统计一个词在文档集中的多少个文档中出现,基本思想为:若一个词在越少的文档中出现,则对文档的区分能力越强;

t f i j = n i j ∑ k n k j tf_{ij}=\frac{n_{ij}}{\sum _k n_{kj}} tfij=knkjnij

i d f i = l o g ( ∣ D ∣ 1 + ∣ D i ∣ ) idf_i=log(\frac{|D|}{1+|D_i|}) idfi=log(1+DiD)

t f − i d f ( i , j ) = t f i j × i d f i = n i j ∑ k n k j × l o g ( ∣ D ∣ 1 + ∣ D i ∣ ) tf-idf(i,j) = tf_{ij} \times idf_i = \frac{n_{ij}}{\sum _k n_{kj}} \times log(\frac{|D|}{1+|D_i|}) tfidf(i,j)=tfij×idfi=knkjnij×log(1+DiD)

∣ D ∣ |D| D为文档集中总文档树, ∣ D i ∣ |D_i| Di是文档集中出现词 i i i的文档数量,而分母 + 1 +1 +1则是采用拉普拉斯平滑,避免有部分新词在语料库中未出现而导致分母为零的情况;


5.3 TextRank算法

  • TextRank算法可以脱离语料库,仅对单篇文档进行分析从而提取该文档的关键词,最早用于文档自动摘要,基于句子维度的分析,利用TextRank对每个句子进行打分,挑出分数最高的 n n n个句子作为文档的关键句,从而达到自动摘要的效果,基本思想源于PageRank算法;

  • PageRank

PageRank算法计算示意图

S ( V i ) = ( 1 − d ) + d × ∑ j ∈ l n ( V j ) ( 1 ∣ O u t ( V j ) ∣ × S ( V j ) ) S(V_i)=(1-d)+d\times \sum_{j \in ln(V_j)}(\frac {1}{|Out(V_j)|}\times S(V_j)) S(Vi)=(1d)+d×jln(Vj)(Out(Vj)1×S(Vj))

  1. 基本思想

    • 链接数量
    • 链接质量
  • TextRank

W S ( V i ) = ( 1 − d ) + d × ∑ V j ∈ l n ( V i ) ( w j i ∑ V k ∈ O u t ( V j ) w j k × W S ( V j ) ) WS(V_i)=(1-d)+d \times \sum_{V_j \in ln(V_i)}(\frac {w_{ji}}{\sum_{V_{k \in Out(V_j)_{w_{jk}}}}}\times WS(V_j)) WS(Vi)=(1d)+d×Vjln(Vi)(VkOut(Vj)wjkwji×WS(Vj))

PageRank是有向无权图,而TextRank进行自动摘要则是有权图。当TextRank应用到关键词提取时,与自动摘要中主要有两点不同:

	1. 词与词之间的关联无权重
	2. 每个词不是与文档中所有词都有链接

由于第1点,故TextRank中的分数计算公式就变为PageRank一直,通过将得分平均贡献给每个链接的词:

W S ( V i ) = ( 1 − d ) + d × ∑ j ∈ l n ( V i ) ( 1 ∣ O u t ( V j ) ∣ × W S ( V j ) ) WS(V_i)=(1-d)+d \times \sum_{j \in ln(V_i)}(\frac {1}{|Out(V_j)|}\times WS(V_j)) WS(Vi)=(1d)+d×jln(Vi)(Out(Vj)1×WS(Vj))


5.4 LSA/LSI/LDA算法

  • LSA/LSI算法

    • LSA(Latent Semantic Analysis,潜在语义分析)主要利用SVD(奇异值分解)的方法进行暴力破解,和LSI(Latent Semantic Index,潜在语义索引)通常被认为是同一种算法,只有应用场景略有不同;

    • LSA的主要步骤:

      1. 使用BOW模型将每个文档表示为向量;
      2. 将所有的文档词向量拼接构成词-文档矩阵( m × n m\times n m×n);
      3. 对词-文档矩阵进行SVD操作( [ m × r ] ⋅ [ r × r ] ⋅ [ r × n ] [m \times r]\cdot[r\times r]\cdot[r\times n] [m×r][r×r][r×n]);
      4. 根据SVD的结果,将词-文档矩阵进行奇异值分解到更低维度 k k k [ m × k ] ⋅ [ k × k ] ⋅ [ k × n ] , 0 < k < r [m \times k]\cdot[k\times k]\cdot[k\times n],0<k<r [m×k][k×k][k×n],0<k<r)的近似SVD结果中,每个词和文档均可表示为 k k k个主题构成的空间中的一个点,通过计算每个词和文档的相似度(余弦相似度或KL相似度),然后得到每个文档中对每个词的相似度结果,取相似度最高的一个词即为文档关键词;
    • 优点:可映射到低维空间,在有限利用文本语义信息的同时,大幅度降低计算代价,提高分析质量;

    • 缺点:SVD计算复杂度非常高,特征空间维度较大,因此计算效率十分低下。同时,LSA对词的频率分布不敏感,物理解释性薄弱;

  • LDA(Latent Dirichlet Allocation,隐含狄利克雷分布)算法

    • 定义:基于贝叶斯理论,根据对词的共现信息的分析,你和出词-文档-主题的分布,进而将词、文本都映射到一个语义空间中;

    • 结合吉布斯采样的LDA模型函数训练过程:

      • 随机初始化,对每篇文档中的每个词 w w w,随机赋予一个topic编号 z z z;
      • 重新扫描语料库,对每个词 w w w按吉布斯采样公式重新采样其topic,然后在语料中进行更新;
      • 重复上述语料库的重采样过程指导吉布斯采样收敛;
      • 统计语料库中topic-word贡献频率矩阵,即为LDA模型;

5.5 实战提取文本关键词

  • 训练关键词提取算法的几个步骤

    • 加载已有文档数据集;
    • 加载停用词表;
    • 对数据集中的文档进行分词;
    • 根据停用词表,过滤干扰词;
    • 根据数据集训练算法;
  • 利用训练好额算法对新文档进行关键词提取的环节:

    • 对新文档进行分词;
    • 根据停用词表,过滤干扰词;
    • 根据训练好的算法提取关键词;
  • 实现代码


相关文章:

  • 自然语言处理系列之: 句法分析
  • 自然语言处理系列之:文本向量化
  • 自然语言处理系列之: 实战电影评论情感分析
  • 自然语言处理系列之: NLP中用到的机器学习算法
  • Java网络编程:UDP套接字程序设计,UDP实现Socket通信(附完整代码实现)
  • Java网络编程:邮件发送程序设计,SMPT传输协议实现(完整代码实现)
  • java网络编程:基于HTTP的下载程序设计及web浏览器制作(完整代码实现)
  • Java网络编程:Socket实现的扫描程序设计 (完整代码实现)
  • 为什么要学习设计模式?看完这篇你就懂了!
  • 使用Wps切分单页PDF文件为多页pdf
  • 深入解析JVM(四):对象的创建
  • IntellIJ IDEA导入项目后无法运行方法的解决方法!
  • Java使用Redis删除指定前缀Key
  • Linux中删除重复行的三种方法
  • Java面试突击系列(一):消息队列的面试连环炮
  • __proto__ 和 prototype的关系
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • CentOS从零开始部署Nodejs项目
  • Docker下部署自己的LNMP工作环境
  • ES6--对象的扩展
  • php面试题 汇集2
  • Vue2.0 实现互斥
  • 闭包--闭包作用之保存(一)
  • 从0到1:PostCSS 插件开发最佳实践
  • 复杂数据处理
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 区块链分支循环
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 译有关态射的一切
  • 用jQuery怎么做到前后端分离
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • ###C语言程序设计-----C语言学习(6)#
  • #define用法
  • (03)光刻——半导体电路的绘制
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (9)目标检测_SSD的原理
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (转)四层和七层负载均衡的区别
  • ***原理与防范
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET 分布式技术比较
  • .net对接阿里云CSB服务
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • ::before和::after 常见的用法
  • @selector(..)警告提示
  • @取消转义
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ C++ ] 继承
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [android] 切换界面的通用处理