LDA 关键词提取

 目录

介绍

主题数确认

代码实现


 普通关键词提取 TF-IDF,textRank 实现链接:gensim 实现 TF-IDF;textRank 关键词提取_gensim tfidf关键词-CSDN博客

它们是直接从文本中提取关键词,如果想基于一些潜在语义,可以用 LDA,但不是真正会识别语义,介绍如下。

介绍

LDA(Latent Dirichlet Allocation)确实是一个用于从大量文档中提取关键词的算法,但它并不是直接基于语义去提取关键词,而是通过建立文档主题的概率分布模型来间接揭示文档的关键词结构。LDA是一种统计模型,特别是一种主题模型,由David Blei、Andrew Ng和Michael Jordan在2003年提出。

LDA的工作原理是这样的:

  1. 假设: 每篇文档是由多个潜在主题(latent topics)按照一定概率混合而成,每个主题又对应着一组关键词的概率分布。同时,每个关键词在文档中出现的概率也是由这些主题共同决定的。

  2. 过程:

    • LDA首先假定文档集合中的每个文档都由K个潜在主题的混合构成。
    • 每个主题是一个概率分布,表示这个主题下各个单词出现的概率。
    • 文档生成的过程是:先根据文档的主题分布选择一个主题,然后根据这个主题的概率分布生成相应的单词。
    • 迭代优化:通过对文档中的词语计数数据进行统计分析,利用贝叶斯统计推断的方法,通过Gibbs抽样或者变分推断等手段估计出最优的主题分布和主题下的单词分布。
  3. 关键词提取:

    • 当LDA模型训练完成后,每个主题会被赋予一系列相关的关键词,这些关键词就是在给定主题下具有高概率的词汇。
    • 通过查看每个文档的主题分布,可以找出文档最显著的主题,进而确定文档的关键信息,即文档的关键词。

虽然LDA本身不是基于语义相似性的严格概念来直接抽取关键词,但因为它能够发现文本中隐含的结构和主题,因此可以被看作是一种基于统计意义上的语义聚类,有助于识别那些与文档主题密切相关的关键词。然而,LDA并未直接理解单个词的确切语义,而是通过统计规律捕捉到了主题级别的语义相关性。如果要进行更精细的语义分析,则可能需要结合其他基于深度学习的语义理解技术。

主题数确认

使用 LDA,那需要确定主题,也就是需要设计几个主题,原因有以下几点:

  1. 模型参数化: LDA作为一种概率图形模型,其核心参数之一就是主题数量K。在模型初始化阶段,需要设置K值,这意味着模型会尝试找出文档集合中K个不同的主题,并且为每个主题分配一组词语的概率分布。

  2. 模型复杂性与解释性: 主题数量决定了模型的复杂程度。如果主题数量过少,模型可能无法充分捕获数据集中的所有重要模式和结构,导致信息损失,使得主题过于宽泛,缺乏区分度;反之,如果主题数量过多,可能会产生很多高度重叠或者非常相似的主题,造成模型过度拟合,降低了模型的解释性和实用性。

  3. 模型评估与优化: 在实践中,选择合适的主题数量是为了得到最具解释力和预测能力的模型。常用的方法包括观察模型的困惑度(Perplexity)、主题间互信息(Coherence Score)等指标随主题数量变化的趋势,选择这些指标表现最优或者拐点处的主题数量作为最佳模型参数。

  4. 实际应用需求: 根据实际应用场景和分析目的,研究者也需要考虑主题的数量是否符合领域内专家的理解和期望,能否较好地概括和解读数据集的内容结构。

综上所述,确定合适的主题数是LDA主题建模过程中至关重要的一环,它直接影响到模型的有效性和可解释性。在实际操作中,往往需要通过实验对比不同主题数下模型的表现,从而确定最佳的主题数量。

代码实现

在代码中平均余弦相似度来寻找最优的主题数,在通过得到最优主题数后,手动设置主题数参数

当然也可以省略最优的主题数这一步,直接设置后使用 LDA:

用的数据是分词后的词语列表 posdata['word']

import pandas as pd
import numpy as np
import re
import itertools
import matplotlib.pyplot as plt
from gensim import corpora, models
from matplotlib.font_manager import FontProperties
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码问题
plt.rcParams['axes.unicode_minus'] = False # 解决负号无法正常显示的问题
plt.style.use('Solarize_Light2') # 设置绘图样式# posdata['word'] 是分词后的词语
posdata = pd.read_csv("posdata.csv", encoding='utf-8')
pos_dict = corpora.Dictionary([[i] for i in posdata['word']])  # 正面
pos_corpus = [pos_dict.doc2bow(j) for j in [[i] for i in posdata['word']]]  # 正面# 构造主题数寻优函数
def cos(vector1, vector2):  # 余弦相似度函数dot_product = 0.0;normA = 0.0;normB = 0.0;for a, b in zip(vector1, vector2):dot_product += a * bnormA += a ** 2normB += b ** 2if normA == 0.0 or normB == 0.0:return (None)else:return (dot_product / ((normA * normB) ** 0.5))# 主题数寻优def lda_k(x_corpus, x_dict):# 初始化平均余弦相似度mean_similarity = []mean_similarity.append(1)# 循环生成主题并计算主题间相似度for i in np.arange(2, 11):lda = models.LdaModel(x_corpus, num_topics=i, id2word=x_dict)  # LDA模型训练for j in np.arange(i):term = lda.show_topics(num_words=50)# 提取各主题词top_word = []for k in np.arange(i):top_word.append([''.join(re.findall('"(.*)"', i)) \for i in term[k][1].split('+')])  # 列出所有词# 构造词频向量word = sum(top_word, [])  # 列出所有的词unique_word = set(word)  # 去除重复的词# 构造主题词列表,行表示主题号,列表示各主题词mat = []for j in np.arange(i):top_w = top_word[j]mat.append(tuple([top_w.count(k) for k in unique_word]))p = list(itertools.permutations(list(np.arange(i)), 2))l = len(p)top_similarity = [0]for w in np.arange(l):vector1 = mat[p[w][0]]vector2 = mat[p[w][1]]top_similarity.append(cos(vector1, vector2))# 计算平均余弦相似度mean_similarity.append(sum(top_similarity) / l)return (mean_similarity)# 计算主题平均余弦相似度
pos_k = lda_k(pos_corpus, pos_dict)
# 绘制主题平均余弦相似度图形
font = FontProperties(size=14)fig = plt.figure(figsize=(10,8))
ax1 = fig.add_subplot(211)
ax1.plot(pos_k)
ax1.set_xlabel('正面评论LDA主题数寻优', fontproperties=font)
plt.show()# LDA主题分析
# 根据图表主题数为 3
pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
pos_topic = pos_lda.print_topics(num_words = 10)
print(pos_topic)# 去掉权重
pos_theme = []
for p in pos_topic:word = re.findall('\*"(.*?)"',p[1])pos_theme.append(word)
print(pos_theme)

主题数图表,最低点为最优主题数

直接用 LDA 提取关键词,不确定主题数

import jieba
from gensim import corpora, models
import re# 文本预处理,将文档分为句子
text = '6月19日,《2012年度“中国爱心城市”公益活动新闻发布会》在京举行。' + \'中华社会救助基金会理事长许嘉璐到会讲话。基金会高级顾问朱发忠,全国老龄' + \'办副主任朱勇,民政部社会救助司助理巡视员周萍,中华社会救助基金会副理事长耿志远,' + \'重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩,以及10余个省、市、自治区民政局' + \'领导及四十多家媒体参加了发布会。中华社会救助基金会秘书长时正新介绍本年度“中国爱心城' + \'市”公益活动将以“爱心城市宣传、孤老关爱救助项目及第二届中国爱心城市大会”为主要内容,重庆市' + \'、呼和浩特市、长沙市、太原市、蚌埠市、南昌市、汕头市、沧州市、晋江市及遵化市将会积极参加' + \'这一公益活动。中国雅虎副总编张银生和凤凰网城市频道总监赵耀分别以各自媒体优势介绍了活动' + \'的宣传方案。会上,中华社会救助基金会与“第二届中国爱心城市大会”承办方晋江市签约,许嘉璐理' + \'事长接受晋江市参与“百万孤老关爱行动”向国家重点扶贫地区捐赠的价值400万元的款物。晋江市人大' + \'常委会主任陈健倩介绍了大会的筹备情况。'
sentences = [sentence.strip() for sentence in text.split('。') if sentence.strip()]
word_lst = [jieba.lcut(s) for s in sentences]
words = []
for w in word_lst:for _ in w:words.append(_)
pos_dict = corpora.Dictionary([[i] for i in words])  # 正面
pos_corpus = [pos_dict.doc2bow(j) for j in [[i] for i in words]]  # 正面# LDA主题分析
# 根据图表主题数为 3
pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
pos_topic = pos_lda.print_topics(num_words = 10)
print(pos_topic)# 去掉权重
pos_theme = []
for p in pos_topic:word = re.findall('\*"(.*?)"',p[1])pos_theme.append(word)
print(pos_theme)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

表的连接【MySQL】

文章目录 什么是连接测试表内连接外连接左外连接右外连接全外连接 自然连接交叉连接参考资料 什么是连接 数据库的连接是指在数据库系统中,两个或多个数据表之间建立的关联关系,使它们可以进行数据的交互和操作。连接通常基于某种共同的字段或条件&…

力扣每日一题 猜数字游戏 阅读理解

Problem: 299. 猜数字游戏 思路 &#x1f468;‍&#x1f3eb; 灵神 复杂度 Code class Solution {public String getHint(String secret, String guess) {int a 0;int[] cntS new int[10];int[] cntG new int[10];for(int i 0; i < secret.length(); i){if(secre…

Vscode连接外部虚拟环境

如果vscode工程目录里面有一个超级大的虚拟环境文件夹&#xff0c;怎么说都不是一件优雅的事&#xff0c;因此我们希望这个虚拟环境在工程目录外部&#xff0c;我们开始&#xff1a; 1. 复制虚拟环境目录路径&#xff1a;E:\envs\test 2. 在vscode中打开文件夹&#xff0c;CT…

一文详解WebView,不好理解就想想iframe,类比后秒懂了。

Hi&#xff0c;我是贝格前端工场&#xff0c;又到了给大家做技术扫盲的时候&#xff0c;本文讲一讲webview&#xff0c;有些老铁觉得很难懂&#xff0c;其实借助iframe来中转一下&#xff0c;就好理解了。 WebView是一种用于在应用程序中显示Web内容的组件。它可以嵌入到应用程…

【C++】关键字:auto

文章目录 1. 介绍2. 如何使用 1. 介绍 从C11开始&#xff0c;auto变成了类型指示符&#xff08;之前auto并不是这个作用&#xff09;。使用auto定义变量时必须对其进行初始化&#xff0c;在编译阶段编译器自动推导auto变量的实际类型。因此auto并非是一种“类型”的声明&#…

柚见第十期(后端队伍接口详细设计)

创建队伍 用户可以 创建 一个队伍&#xff0c;设置队伍的人数、队伍名称&#xff08;标题&#xff09;、描述、超时时间 P0 队长、剩余的人数 聊天&#xff1f; 公开 或 private 或加密 信息流中不展示已过期的队伍 请求参数是否为空&#xff1f;是否登录&#xff0c;未登录不…

FX110网:在CP Markets申请出金四个多月了,没任何消息!

近期&#xff0c;本站收到一中国汇友投诉&#xff0c;称其CP Markets平台已数月无法出金&#xff0c;平台方也没有任何回应。在货币市场闯荡久了的“老鸟”就会知道&#xff0c;平台无故不给出金必定有妖&#xff0c;更何况还是长达数月&#xff01; 在CP Markets申请出金四个多…

Anaconda下载安装及配置pytorch环境

先解释一下Python、Anaconda、Pytorch是啥 Python是一种广泛使用的编程语言&#xff0c;在许多领域都有应用。它具有简洁的语法&#xff0c;易于学习&#xff0c;并且有大量的第三方库可以使用。 Anaconda是一个Python的包和环境管理软件&#xff0c;提供了许多用于数据科学&a…

51、WEB攻防——通用漏洞验证码识别复用调用找回密码重定向状态值

文章目录 回显状态判断用户名重定向验证码回显显示验证码简单机制验证码复用验证码智能识别验证码接口调用安全修复建议 回显状态判断 request前端判断不安全&#xff08;前端接收验证的返回值来进行判断)&#xff0c;使用burp的Response to this request可以抓取返回包~ 这种…

【JS】APIs:事件流、事件委托、其他事件、页面尺寸、日期对象与节点操作

1 事件流 捕获阶段&#xff1a;从父到子 冒泡阶段&#xff1a;从子到父 1.1 事件捕获 <body> <div class"fa"><div class"son"></div> </div> <script>const fadocument.querySelector(.fa);const sondocument.qu…

机器视觉学习(一)—— 认识OpenCV、安装OpenCV

目录 一、认识OpenCV 二、通过pip工具安装OpenCV 三、PyCharm安装OpenCV 一、认识OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff0c;开源计算机视觉库&#xff09;是一个跨平台的计算机视觉库&#xff0c;最初由威尔斯理工学院的Gary Bradski于199…

强烈安利!FastReport 商业图形库,炫酷可视化报告开发首选~

FastReport Business Graphics .NET&#xff0c;是一款基于fastreport报表开发控件的商业图形库&#xff0c;借助 FastReport 商业图形库&#xff0c;您可以可视化不同的分层数据&#xff0c;构建业务图表以进行进一步分析和决策。利用数据呈现领域专家针对 .NET 7、.NET Core、…

NXP iMX8MM Cortex-M4 核心 GPT Capture 测试

By Toradex秦海 1). 简介 NXP i.MX8 系列处理器均为异构多核架构 SoC&#xff0c;除了可以运行 Linux 等复杂操作系统的 Cortax-A 核心&#xff0c;还包含了可以运行实时操作系统比如 FreeRTOS 的 Cortex-M 核心&#xff0c;本文就演示通过 NXP i.MX8MM 处理器集成的 Cortex-…

Node.Js编码注意事项

Node.js 中不能使用 BOM 和 DOM 的 API&#xff0c;可以使用 console 和定时器 APINode.js 中的顶级对象为 global&#xff0c;也可以用 globalThis 访问顶级对象 浏览器端js的组成 Node.js中的JavaScript组成 相比较之下发现只有console与定时器是两个API所共有的&#xff…

HarmonyOS系统开发基础环境搭建

目录 一 鸿蒙介绍&#xff1a; 1.1 HarmonyOS系统 1.2 HarmonyOS软件编程语言 二 HarmonyOS编程环境搭建 1.1 官网下载地址 1.2搭建开发流程 1.3 创建安装目录 1.4 下载DevEco Studio​编辑 1.5 下载后点击安装 1.6 自动添加桌面快捷和bin路径 ​编辑1.7 安装好运行 …

二,几何相交---4,BO算法---(1)接近性和可分离性

提了三个观点 1&#xff0c;如果一条直线&#xff08;比如竖直&#xff09;可以分开两个线段&#xff0c;则这两个线段不相交 2&#xff0c;只需要观察与隔离线相交的几个线段 3&#xff0c;从左向右扫描线只需要观察每个线段的两个端点和一些可能的相交点。

HarmonyOS (一)ArkTS起源及UI框架

目录 1 引言 2 框架 3 ArkUI 4 特点 5 总结 1 引言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了ArkTS。 ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript&#xff08;简称TS&#xff09;的基础上&#xff0c;扩展了声明式UI、…

后悔没有早点看到这份产品说明书模板

产品说明书是连接产品与消费者的桥梁&#xff0c;它对产品具有多重好处。一份设计精良、内容准确的产品说明书有助于消费者全面了解产品&#xff0c;确保用户正确使用产品&#xff1b;减少消费者因误操作导致的故障&#xff0c;降低企业的售后服务成本&#xff1b;增强消费者对…

一文带你深度了解FreeRTOS的任务切换之PendSV异常

RTOS系统的核心是任务管理&#xff0c;而任务管理的核心是任务切换&#xff0c;任务切换决定了任务的执行顺序&#xff0c;任务切换效率的高低也决定了一款系统的性能&#xff0c;尤其是对于实时操作系统。而对于想深入了解 FreeRTOS系统运行过程的同学其任务切换是必须掌握的知…

项目管理软件:如何确保项目启动顺利?

对所有项目经理来说&#xff0c;了解如何启动项目是最关键的技能之一。项目都是从小事开始&#xff0c;逐渐发展为更大型、更复杂的。好的开始是成功的一半&#xff0c;对项目管理来说更是如此。 启动项目的 10 个简单步骤 即使是最复杂的项目&#xff0c;也可以分解成简单的…