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

探索主题建模:使用LDA分析文本主题

在数据分析和文本挖掘领域,主题建模是一种强大的工具,用于自动发现文本数据中的隐藏主题。Latent Dirichlet Allocation(LDA)是主题建模的一种常用技术。本文将介绍如何使用Python和Gensim库执行LDA主题建模,并探讨主题建模的各个方面。

什么是主题建模?

主题建模是一种用于从文本数据中提取主题或话题的技术。主题可以被视为文本数据的概括性描述,它们涵盖了文本中的关键概念。主题建模可以应用于各种领域,如文档分类、信息检索、推荐系统等。

LDA的应用场景

LDA(潜在狄利克雷分配)模型在自然语言处理(NLP)领域中有广泛的应用,以下是一些常见的应用场景.

  1. 特征生成:LDA可以生成特征供其他机器学习算法使用。例如,LDA为每一篇文章推断一个主题分布;K个主题即是K个数值特征,这些特征可以被用在像逻辑回归或者决策树这样的算法中用于预测任务。
  2. 新闻质量分类:新闻APP通过各种来源获得到的新闻的质量良莠不齐。我们可以人工设计一些传统特征:新闻来源站点、新闻内容长度、图片数量、新闻热度等等。除了这些人工特征,也可利用主题模型来计算每篇新闻的主题分布,作为附加特征与人工特征一起组成新特征集合。
  3. 短文本-短文本语义匹配:短文本-短文本的语义匹配在工业界的应用场景非常广泛。例如,在网页搜索中,我们需要度量用户查询 (query) 和网页标题 (web page title) 的语义相关性;在query推荐中,我们需要度量query和其他query之间的相似度。
  4. 短文本-长文本语义匹配:短文本-长文本语义匹配的应用场景在工业界非常普遍。例如,在搜索引擎中,我们需要计算一个用户查询(query)和一个网页正文(content)的语义相关度。
  5. 长文本-长文本语义匹配:通过使用主题模型,我们可以得到两个长文本的主题分布,再通过计算两个多项分布的距离来衡量它们之间的相似度。
  6. 新闻个性化推荐:长文本-长文本的语义匹配可用于个性化推荐的任务中。例如,在新闻个性化推荐中,我们可以将用户近期阅读的新闻(或新闻标题)合并成一篇长“文档”,并将该“文档”的主题分布作为表达用户阅读兴趣的用户画像。
  7. 垂类新闻CTR预估:新闻推荐服务涉及多个垂类新闻方向,如体育、汽车、娱乐等。在这些方向上,我们往往需要做更精细的个性化推荐。

使用LDA进行主题建模

Latent Dirichlet Allocation(LDA)是一种用于主题建模的概率图模型。它的基本思想是,每个文档是由一组主题混合而成的,每个主题又由一组词汇构成。LDA试图找到最佳的主题和词汇组合,以解释给定的文本数据。

image.png

对底层逻辑感兴趣的掘友们可以参考这些文章:

https://zhuanlan.zhihu.com/p/309419680

https://zhuanlan.zhihu.com/p/31470216

以下是如何使用Python和Gensim库执行LDA主题建模的步骤:

步骤1:文本预处理

在进行主题建模之前,需要对文本进行预处理。这包括分词、去除停用词和标点符号等。分词可以使用工具如jieba,去除停用词可以使用nltk库。

样例:

# 中文文本分词
def tokenize(text):return list(jieba.cut(text))# 删除中文停用词
def delete_stopwords(text,tokens):# 分词words = tokens  # 假设你已经有分好词的文本,如果没有,你可以使用jieba等工具进行分词# 加载中文停用词stop_words = set(stopwords.words('chinese'))# 去除停用词filtered_words = [word for word in words if word not in stop_words]# 重建文本filtered_text = ' '.join(filtered_words)return filtered_text
def remove_punctuation(input_string):import string# 制作一个映射表,其中所有的标点符号都被映射为Noneall_punctuation = string.punctuation + "!?。。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏.\t "translator = str.maketrans('', '', all_punctuation)# 使用映射表来移除所有的标点符号no_punct = input_string.translate(translator)return no_punct

这些函数可以用于文本预处理,以准备文本数据进行自然语言处理任务。以下是函数的说明:

  1. tokenize(text) : 这个函数使用jieba分词库来将中文文本分成词语。它接受一个文本字符串作为输入,返回一个包含分词结果的列表。
  2. delete_stopwords(text, tokens) : 这个函数用于删除中文文本中的停用词。它接受两个参数,文本字符串和分好词的文本(词语列表)。函数首先加载了中文停用词表,然后将文本中的停用词去除,最后返回一个去除停用词后的文本字符串。
  3. remove_punctuation(input_string) : 这个函数用于去除文本中的标点符号。它使用一个映射表,将所有标点符号映射为None,从而删除它们。最后,它返回一个去除标点符号后的文本字符串。

这样就完成了简单的数据预处理.

步骤2:创建字典和文档-词频矩阵

LDA 采用词袋模型。所谓词袋模型,是将一篇文档,我们仅考虑一个词汇是否出现,而不考虑其出现的顺序。在词袋模型中,“我喜欢你”和“你喜欢我”是等价的。与词袋模型相反的一个模型是n-gram,n-gram考虑了词汇出现的先后顺序。

使用Gensim库,可以创建文档的字典和文档-词频矩阵。字典包含了所有文档中的词汇,而文档-词频矩阵表示每个文档中每个词汇的词频。

# 创建字典和文档-词频矩阵
dictionary = corpora.Dictionary([tokens])
corpus = [dictionary.doc2bow(tokens)]
  1. dictionary = corpora.Dictionary([tokens]) : 这行代码创建了一个文档的词汇表(Dictionary)。词汇表用于将文本中的词语映射到唯一的ID。tokens 是一个包含分好词的文本数据的列表。创建词汇表是为了建立每个词语与一个唯一ID之间的映射,以便后续处理。
  2. corpus = [dictionary.doc2bow(tokens)] : 这行代码创建了文档-词频矩阵(Corpus)。corpus 是一个包含文档的列表,每个文档都表示为一个词袋(Bag of Words),其中包含了文档中每个词语的ID和词频。doc2bow 方法将文档中的词语转化为词袋表示。

为方便理解这两个类型的数据结构,参考下面代码样例演示:

def test():from gensim import corpora# 创建一个样本文本数据sample_texts = ["This is the first document This This ","This document is the second document ","And this is the third one ","Is this the first document "]# 分词并创建词汇表tokenized_texts = [text.split() for text in sample_texts]dictionary = corpora.Dictionary(tokenized_texts)# 获取词汇表中的词语到ID的映射word_to_id = dictionary.token2id# 获取ID到词语的映射id_to_word = {v: k for k, v in word_to_id.items()}# 打印ID到词语的映射print("ID到词语的映射:")for word_id, word in id_to_word.items():print(f"ID: {word_id}, 词语: {word}")# 创建文档-词频矩阵corpus = [dictionary.doc2bow(tokens) for tokens in tokenized_texts]# 打印文档-词频矩阵print("文档-词频矩阵:")for doc in corpus:print(doc)

运行结果为

步骤3:运行LDA模型

使用Gensim的LdaModel类,可以运行LDA模型。需要指定主题数量、字典和文档-词频矩阵作为输入参数。模型将自动学习主题和词汇的分布。

# 运行LDA模型
lda_model = models.LdaModel(corpus, num_topics=15, id2word=dictionary, passes=50)
  • num_topics 表示预期生成的主题数量。在LDA中,这是一个需要预先指定的超参数。我们需要根据你的数据和分析目标来选择合适的主题数量。通常,我们可以根据领域知识或试验来确定主题数量。
  • passes 是模型的迭代次数。LDA模型通过多次迭代来优化主题的分布以及文档-主题和词语-主题的分布。增加 passes 的值通常会提高模型的性能,但也会增加训练时间。通常情况下,10-50 之间的 passes 值是常见的选择,具体取决于数据集的大小和复杂性。

步骤4:提取主题

一旦模型训练完成,可以使用show_topics方法提取主题。每个主题由一组高权重词汇表示。

# 提取主题
topics = lda_model.show_topics(num_words=8)# 输出主题
for topic in topics:print(topic)

如下所示:

前边的序号为主题id,后边的词是主题相关词,相关词前边的是该相关词在主题中的权重.

步骤5:结果分析

最后,对提取的主题进行分析和解释。可以查看高权重词汇,了解主题的内容,以及使用主题模型进行文档分类、信息检索等应用。

如何保存和加载模型

在实际应用中,通常需要保存训练好的LDA模型,以便下次使用。可以使用Gensim的saveload方法来保存和加载模型。

保存模型


from gensim import corpora, models
import os# 假设你已经有一个语料库 `corpus` 和字典 `dictionary`,以及训练好的 LDA 模型 `lda_model`# 保存字典
dictionary.save("my_dictionary.dict")# 保存语料库
corpora.MmCorpus.serialize("my_corpus.mm", corpus)# 保存 LDA 模型
lda_model.save("my_lda_model.model")

加载模型


from gensim import corpora, models# 加载字典
dictionary = corpora.Dictionary.load("my_dictionary.dict")# 加载语料库
corpus = corpora.MmCorpus("my_corpus.mm")# 加载 LDA 模型
lda_model = models.LdaModel.load("my_lda_model.model")

权重值的作用

在LDA模型中,每个词汇都有一个权重值,表示它在主题中的重要性。这些权重值可以用于主题识别、文档分类和信息检索。高权重词汇通常与主题相关,因此可以帮助理解主题内容,或是建立主题词云图.

总结

主题建模是文本挖掘领域的重要技术,可以自动发现文本数据中的主题。LDA是一种常用的主题建模方法,可以通过Python和Gensim库进行实现。通过文本预处理、模型训练和结果分析,可以有效地提取文本数据中的隐藏主题,用于各种应用。

相关文章:

探索主题建模:使用LDA分析文本主题

在数据分析和文本挖掘领域,主题建模是一种强大的工具,用于自动发现文本数据中的隐藏主题。Latent Dirichlet Allocation(LDA)是主题建模的一种常用技术。本文将介绍如何使用Python和Gensim库执行LDA主题建模,并探讨主题…...

服务器黑洞,如何秒解

想必这样的短信大家都应该见过吧,这其实是阿里云服务器被攻击后触发的黑洞机制的短信通知。还有很多朋友不知道,为什么要这么做。原因其实很简单啊,当同一个机房的ip段,如果说有一台服务器遭受低道攻击,那么很可能会造…...

【生物信息学】单细胞RNA测序数据分析:计算亲和力矩阵(基于距离、皮尔逊相关系数)及绘制热图(Heatmap)

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 读取数据集2. 质量控制(可选)3. 基于距离的亲和力矩阵4. 绘制基因表达的Heatmap5. 基于皮尔逊相关系数的亲和力矩阵6. 代码整合 一、实验介绍 计算亲和力…...

学习笔记三十一:k8s安全管理:认证、授权、准入控制概述SA介绍

K8S安全实战篇之RBAC认证授权-v1 k8s安全管理:认证、授权、准入控制概述认证k8s客户端访问apiserver的几种认证方式客户端认证:BearertokenServiceaccountkubeconfig文件 授权Kubernetes的授权是基于插件形成的,其常用的授权插件有以下几种&a…...

【开发新的】apache common BeanUtils忽略null值

前言: BeanUtils默认的populate方法不会忽略空值和null值,在特定场景,我们需要原始的值避免被覆盖,所以这里提供一种自定义实现方式。 package com.hmwl.service.program;import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanu…...

coalesce函数(SQL )

用途: 将控制替换成其他值;返回第一个非空值 表达式 COALESCE是一个函数, (expression_1, expression_2, …,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返…...

一键报警可视对讲管理机10寸触摸屏管理机

一键报警可视对讲管理机10寸触摸屏管理机 一、管理机技术指标: 1、10寸LCD触摸屏,分辨率1024*600; 2、摄像头1200万像素 3、1000M/100M自适应网口; 4、按键设置:报警/呼叫按键,通话/挂机按键&#xff0…...

java左右括号

java左右括号 数据结构-栈栈的特点:先进后出代码实现 最近看到有小伙伴去面试,被人问起一道算法题,题目内容大概是:给定一个字符串,如:“[[]]{}”,判断字符串是否为有效的括号。考查的是数据结构…...

接口自动化测试 —— 工具、请求与响应

一、工具: 1.工具介绍 postman :很主流的API测试工具,也是工作里面使用最广泛的研发工具。 JMeter: ApiPost: 2.安装postman: 安装好直接打开,不用注册。 二、通信模式: 1、…...

【LeetCode:2103. 环和杆 | 模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...

微信小程序-授权登录(手机号码)

1、WXBizDataCrypt.js-下载地址 2、UNIAPP代码 <template> <view class"work-container"> <view class"login"> <view class"content"> <button class"button_wx&q…...

视觉问答(VQA)12篇顶会精选论文合集,附常用数据集下载

今天来聊聊计算机视觉和自然语言处理交叉的一个热门研究方向&#xff1a;视觉问答&#xff08;VQA&#xff09;。 视觉问答的任务是&#xff1a;给出一张图片和一个关于这张图片的自然语言问题&#xff0c;计算机需要根据图片的内容自动回答这个问题。这样的任务考验了计算机在…...

详解--编码(ASCII\Unicode,UTF-8\UTF-16\UTF-32)

本文主要搞清楚编码是怎么回事。 参考链接 字符集编码方式ASCII&#xff08;American Standard Code for Information Interchange&#xff09;ASCIIGB2312GB2312UnicodeUTF-8 / UTF-16 / UTF-32 1.编码基本概念 1.1 字符 字符&#xff08;Character&#xff09; 在计算机和…...

Linux安装配置awscli命令行接口工具及其从aws上传下载数据

官网技术文档有全面介绍&#xff1a;安装或更新 AWS CLI 的最新版本 - AWS Command Line Interface在系统上安装 AWS CLI。https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/getting-started-install.html#getting-started-install-instructionsawscli常用命令参考&…...

中国联通携手华为助力长城精工启动商用5G-A柔性产线

[中国&#xff0c;河北&#xff0c;2023年11月3日] 近日&#xff0c;中国联通携手华为助力精诚工科汽车系统有限公司保定自动化技术分公司&#xff08;简称长城精工自动化&#xff09;启动5G-A超高可靠性超低时延柔性产线的商用阶段。 在河北保定精工自动化工厂&#xff0c;5G…...

【自动化测试】Java+Selenium自动化测试环境搭建

本主要介绍以Java为基础&#xff0c;搭建Selenium自动化测试环境&#xff0c;并且实现代码编写的过程。 1.Selenium介绍 Selenium 1.0 包含 core、IDE、RC、grid 四部分&#xff0c;selenium 2.0 则是在两位大牛偶遇相互沟通决定把面向对象结构化&#xff08;OOPP&#xff09…...

若依笔记(四):代码生成器

已知使用MyBatisPlus代码生成器可以自动生成Entity、Mapper、Service、Controller代码&#xff0c;前提是数据库中有数据表&#xff0c;生成pojo类以及对于该数据表的增删改查命令的代码&#xff0c;若依更进一步能选择表后生成代码、预览、下载&#xff0c;同时可以生产前端代…...

怎样做好金融投资翻译

我们知道&#xff0c; 金融投资翻译所需的译文往往是会议文献、年终报表、信贷审批等重要企业金融资料&#xff0c;其准确性事关整个企业在今后一段时期内的发展战略与经营成效。尤其像年报&#xff0c;对于上市公司来说更是至关重要的。那么&#xff0c;怎样做好金融投资翻译&…...

ubuntu 分区 方案

ubuntu 分区 方案 自动分区啥样子的&#xff1f; 手动分区 需要怎么操作&#xff1f; 注意点是啥&#xff1f; swap分区 要和 内存大小 差不多 安装ubuntu系统时硬盘分区方案 硬盘分区概述 一块硬盘最多可以分4个主分区&#xff0c;主分区之外的成为扩展分区。硬盘可以没有…...

Python自动化测试面试题总结

python有哪些数据类型怎么将两个字典合并python如何将json写到文件里&#xff1f;在except语句中return后还会不会执行finally中的代码&#xff1f;什么是可变、不可变类型&#xff1f;python函数调用时参数的传递是值传递还是引用传递&#xff1f;python深浅拷贝的区别python为…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...