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 * b
        normA += a ** 2
        normB += b ** 2
    if 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始利用MATLAB进行FPGA设计(二)用于HDL代码生成的Simulink模型并用于流水线设计

文章灵感来源于MATLAB官方免费教程:HDL Coder Self-Guided Tutorial 考虑到MATLAB官网的英文看着慢,再加上视频讲解老印浓浓的咖喱味,我决定记录利用MATLAB&Simulink&SystemGenerator进行FPGA数字信号处理的学习过程。 往期回顾&am…

C语言柔性数组详解:让你的程序更灵活

柔性数组 一、前言二、柔性数组的用法三、柔性数组的内存分布四、柔性数组的优势五、总结 一、前言 仔细观察下面的代码,有没有看出哪里不对劲? struct S {int i;double d;char c;int arr[]; };还有另外一种写法: struct S {int i;double …

全球首个 AI 软件工程师 Devin它来了!

如果您想每日获取AI最新新闻,欢迎关注文章底部的公众号 Cognition AI 发布 AI 软件工程师 Devin 初创公司 Cognition 近日发布公告,宣布推出全球首个 AI 软件工程师 Devin,并号称会彻底改变人类构建软件的方式。Devin 擅长长期推理能力,可以自主规划和完成软件项目,并在此…

国产开源数据库厂商

这是ren_dong的第36篇原创 前言 开源数据库即免费的社区数据库,其源代码可供公众使用,并且可以在其原始设计中进行修改或使用。开源数据库的流行示例包括 MySQL,PostgreSQL和MongoDB。 image 开源数据库用户托管数据库部署的方式有 内部部署、…

mysql查看以及建立索引

现在mysql中有一张表journal_update_logs,数据量比较大,有3000多万条数据,现在查询比较慢,需要建立索引。 第一步,查看该表的索引: SHOW INDEX FROM journal_update_logs; 每张表都会有原始的主键索引PRIM…

傅立叶之美:深入研究傅里叶分析背后的原理和数学

一、说明 T傅里叶级数及其伴随的推导是数学在现实世界中最迷人的应用之一。我一直主张通过理解数学来理解我们周围的世界。从使用线性代数设计神经网络,从混沌理论理解太阳系,到弦理论理解宇宙的基本组成部分,数学无处不在。 当然&#xff0c…

叶顺舟:手机SoC音频趋势洞察与端侧AI技术探讨 | 演讲嘉宾公布

后续将陆续揭秘更多演讲嘉宾! 请持续关注! 2024中国国际音频产业大会(GAS)将于2024年3.27 - 28日在上海张江科学会堂举办。大会将以“音无界,未来(Audio, Future)”为主题。大会由中国电子音响行业协会、上…

报告合集 |2023年,5份必读的“数字孪生”行业报告合集(文末下载)

数字孪生正在快速改变多个行业的面貌。它通过创建物理世界对象的虚拟复制,使得数据分析和系统优化能够在数字空间中实现,正在制造业、城市规划、医疗保健等国家支柱行业展现出巨大的变革力量,为行业的智能决策和预测提供了强大的支撑。 作为…

mysql重构

力扣题目链接 列转行 SELECT product_id, store1 store, store1 price FROM products WHERE store1 IS NOT NULL UNION SELECT product_id, store2 store, store2 price FROM products WHERE store2 IS NOT NULL UNION SELECT product_id, store3 store, store3 price FROM p…

基于大数据与时间序列预测的的书籍数据分析(内含spark+hive+mysql+kettle+echart+tensorflow)

目录 一,绪论 1、项目背景: 2、目标: 3、用户群体: 二.相关开发技术介绍 (一)后端相关技术 1.sparkSQL简介 2.kettle简介 3.tensorflow简介 (二)前端相关技术 1.HTML简介…

【Python】新手入门学习:详细介绍依赖倒置原则(DIP)及其作用、代码示例

【Python】新手入门学习:详细介绍依赖倒置原则(DIP)及其作用、代码示例 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、Py…

MySQL索引原理及慢查询优化

背景 MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上…

【话题】2024年AI辅助研发趋势,有那些应用领域

大家好,我是全栈小5,欢迎阅读文章! 此篇是【话题达人】系列文章,这一次的话题是《2024年AI辅助研发趋势》 目录 背景概念实践医药领域汽车设计领域展望未来文章推荐 背景 随着人工智能技术的持续发展与突破,2024年AI辅…

使用CryptoJs对开发中的参数进行加密

场景描述 在开发程序中,我们无时无刻不在接受第三方的一些token,比如我们申请了地图软件的一些定位、导航功能,第三方会给予我们appid还有app secret作为访问他们服务的凭证,大部分时候我们会将求这些登陆凭证放在env文件中&…

uniapp发行H5获取当前页面query

阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数,例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数,在小程序端的时候测试并无问题,但是发行到H5时首页加载会造成参数获取…

怎样基于“用户”思维让内容营销更有效

当下互联网流量见顶,内容已经成为互联网竞争新的制高点,可以说在数字化驱动的新时代下,“内容为王”仍然是真理。然后信息泛滥的时代下,如何让内容营销脱颖而出呢?媒介盒子认为“用户思维”是关键,今天就和…

C/C++中strcpy,strcat,strstr以及strncpy,strncat,strncmp的使用

1、首先我们来介绍strcpy的使用从这个函数的名字来看它应该是属于字符串的拷贝,string copy。 那么这个函数是怎么用的呢?下面我么来介绍她的基本结构。 char * strcpy ( char * destination, const char * source );由上述可知它需要两部分 一个是目标字…

操作系统——进程

1.什么是进程 概念: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度的一个独立单位。 进程是程序的依次执行 进程是一个程序及其数据在处理机上顺序执行时所发生的活动 进程是程序在一个数据集合上运行的过…

[剪藏] - 由哇哈哈和农夫山泉所想到的

哇哈哈和农夫山泉的缠斗最近冒出来一个有趣的点:营销大于内容的胜利。 具体来说是这样的:农夫山泉很多年前做广告,说纯净水没有矿物质,长期喝是不利于人体健康的。农夫还做了个营销的对比实验,大概是用矿泉水养水仙花&…

CMDB在IT管理中的重要性

Configuration Management Database(CMDB)即配置管理数据库,在当前企业的IT运维管理中扮演着重要的角色。CMDB是一个包含了企业所有设备、软件和服务配置信息的中心数据库,通过有效地管理这些配置数据,能够为企业提供全…