探索主题建模:使用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
    # 制作一个映射表,其中所有的标点符号都被映射为None
    all_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库进行实现。通过文本预处理、模型训练和结果分析,可以有效地提取文本数据中的隐藏主题,用于各种应用。

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

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

相关文章

STM32F407的系统定时器

文章目录 系统定时器SysTick滴答定时器寄存器STK_CTRL 控制寄存器STK_LOAD 重载寄存器STK_VAL 当前值寄存器STK_CALRB 校准值寄存器 非系统初始化 Systick 定时器SysTick_InitSysTick_CLKSourceConfig delay_us寄存器delay_us库函数delay_xms短时delay_ms长时SysTick_Config 系…

Firefox修改缓存目录的方法

打开Firefox,在地址栏输入“about:config” 查找是否有 browser.cache.disk.parent_directory,如果没有就新建一个同名的字符串,然后修改值为你要存放Firefox浏览器缓存的目录地址(E:\FirefoxCacheFiles) 然后重新…

在python中加载tensorflow-probability模块和numpy模块

目录 操作步骤: 注意: 问题: 解决办法: 操作步骤: 在虚拟环境的文件夹中,找到Scripts文件夹,点击进去,找到地址栏,在地址栏中输入cmd,进入如下界面。 输…

详解Java经典数据结构——HashMap

Java 的 HashMap 是一个常用的基于哈希表的数据结构,它实现了 Map 接口,可以存储键值对。下面我们进行详细介绍: 基本结构:HashMap 底层是基于哈希表来实现的,每次插入一个键值对时,会先对该键进行 Hash 运…

思维训练3

题目描述1 Problem - A - Codeforces 题目分析 样例1解释: 对于此题,我们采用贪心的想法,从1到n块数越少越好,故刚好符合最少的块数即可,由于第1块与第n块是我们必须要走的路,所以我们可以根据这两块砖的…

C++--二叉搜索树初阶

前言:二叉搜索树是一种常用的数据结构,支持快速的查找、插入、删除操作,C中map和set的特性也是以二叉搜索树作为铺垫来实现的,而二叉搜索树也是一种树形结构,所以,在学习map和set之前,我们先来学…

鸿运主动安全云平台任意文件下载漏洞复习

简介 深圳市强鸿电子有限公司鸿运主动安全监控云平台网页存在任意文件下载漏洞,攻击者可通过此漏洞下载网站配置文件等获得登录账号密码 漏洞复现 FOFA语法:body"./open/webApi.html" 获取网站数据库配置文件 POC:/808gps/Mobile…

Android Studio中配置Git

安装Git 在安装Android Studio之前,需要先安装Git。可以从Git官网下载并安装Git:https://git-scm.com/downloads 在Android Studio中配置Git 在Android Studio中,依次点击“File” -> “Settings”,在弹出的窗口中选择“Ver…

vue学习part01

02_Vue简介_哔哩哔哩_bilibili Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org) 1.简介 2.常用用法 新项目一般vue3,老项目vue2 3.vue两种风格:选项式api(vue2)和组合式api(vue3) 两种方式实现累…

财务数字化转型的切入点是什么?_光点科技

随着科技的不断进步,数字化转型已经成为各个行业追求的目标,财务领域也不例外。那么,财务数字化转型的切入点在哪里呢?如何确保转型的成功进行? 数据整合与管理 财务数据的准确性与及时性是财务管理的基石。数字化转型…

桥和割点,以及图的遍历树

目录 什么是桥 寻找桥的算法 代码实现 什么是割点 ​寻找割点的算法 代码实现 什么是桥 寻找桥的算法 代码实现 import java.util.ArrayList;public class FindBridges {private Graph G;private boolean[] visited;private int ord[];private int low[];private int cnt…

在基于亚马逊云科技的湖仓一体架构上构建数据血缘的探索和实践

背景介绍 随着大数据技术的进步,企业和组织越来越依赖数据驱动的决策。数据的质量、来源及其流动性因此显得非常关键。数据血缘分析为我们提供了一种追踪数据从起点到终点的方法,有助于理解数据如何被转换和消费,同时对数据治理和合规性起到关…

阿里云的OSS云存储的基本使用

阿里云官网:阿里云-计算,为了无法计算的价值 通过阿里云官网,登录进入用户的界面,在搜索框中输入OSS,然后进入阿里云的对象存储OSS的控制台。(未开通的开通即可) 创建 Bucket 点击【Bucket 列…

OpenShift - 利用容器的特权配置实现对OpenShift攻击

《OpenShift / RHEL / DevSecOps 汇总目录》 说明:本文已经在 OpenShift 4.13 的环境中验证 本文是《容器安全 - 利用容器的特权配置实现对Kubernetes攻击》的后续篇,来介绍 在 OpenShift 环境中的容器特权配置和攻击过程和 Kubernetes 环境的差异。 文…

JVM——类的生命周期(加载阶段,连接阶段,初始化阶段)

目录 1.加载阶段2.连接阶段1.验证2.准备3.解析 3.初始化阶段4.总结 类的生命周期 1.加载阶段 ⚫ 1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 程序员可以使用Java代码拓展的不同的渠道。 ⚫ 2、类加载器在加载完类…

14.Eclipse全局查找字符,类,方法快捷键

eclipse开发中,查找会是一个经常用到的功能所以总结一下 1,查找一个类 Shift Ctrl h 或者 Shift Ctrl r 这种方式能快速的定位接口,类还有注解在那个包里面 2.综合查找 Ctrl H 这是一种综合查找 ,可以用来查找 一个方法的…

selenium爬虫——以爬取澎湃新闻某搜索结果为例

文章目录 selenium爬虫——以爬取澎湃新闻某搜索结果为例前言需要导入的包需要避雷的点webdriver的版本要与浏览器一致如果使用爬虫打开了新网页,要记得跳转XPath和selector都可以直接复制爬取多网页时记得try打入word时调整字体的问题 完整程序扩展爬取效果 seleni…

【蓝桥杯】2023省赛H题

考察知识点:双向链表,小根堆 完整代码在文章末尾 题目 【问题描述】 给定一个长度为 N 的整数数列: A1,A2,...,AN。你要重复以下操作 K 次 :…

利用云计算和微服务架构开发可扩展的同城外卖APP

如今,同城外卖APP已经成为了人们点餐的主要方式之一。然而,要构建一款成功的同城外卖APP,不仅需要满足用户的需求,还需要具备可扩展性,以适应快速增长的用户和订单量。 一、了解同城外卖APP的需求 在着手开发同城外卖…