基于LDA的文本主题聚类Python实现

2023-05-16

LDA简介

LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。
在这里插入图片描述

LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。

关键词:文档主题生成模型,无监督学习,概率模型,NLP


生成过程

对于语料库中的每篇文档,LDA定义了如下生成过程(generativeprocess):

1.对每一篇文档,从主题分布中抽取一个主题;

2.从上述被抽到的主题所对应的单词分布中抽取一个单词;

3.重复上述过程直至遍历文档中的每一个单词。

语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 (multinomialdistribution)相对应,将该多项分布记为θ。每个主题又与词汇表(vocabulary)中的V个单词的一个多项分布相对应,将这个多项分布记为φ。

具体推导可以参考:https://zhuanlan.zhihu.com/p/31470216

Python范例

使用到的库:jieba, gensim
为了使生成结果更精确,需要构造新词,停用词和同义词词典。

import jieba
import jieba.posseg as jp
from gensim import corpora, models

# Global Dictionary
new_words = ['奥预赛', '折叠屏']  # 新词
stopwords = {' ', '再', '的', '们', '为', '时', ':'}  # 停用词
synonyms = {'韩国': '南朝鲜', '传言': '流言'}  # 同义词
words_nature = ('n', 'nr', 'ns', 'nt', 'eng', 'v', 'd')  # 可用的词性


def add_new_words():  # 增加新词
    for i in new_words:
        jieba.add_word(i)


def remove_stopwords(ls):  # 去除停用词
    return [word for word in ls if word not in stopwords]


def replace_synonyms(ls):  # 替换同义词
    return [synonyms[i] if i in synonyms else i for i in ls]


documents = [
    '足协申请取消女足奥预赛韩国主场比赛 公平原则保障安全',
    '芬森发声再回应传言:想念辽宁队友 为中国的球迷们祈福',
    '电商围剿涉疫商家进行时:哄抬物价,就这么罚你',
    '今晚视频直播华为新品发布会:全新折叠屏手机亮相']
add_new_words()
words_ls = []
for text in documents:
    words = replace_synonyms(remove_stopwords([w.word for w in jp.cut(text)]))
    words_ls.append(words)

# 生成语料词典
dictionary = corpora.Dictionary(words_ls)
# 生成稀疏向量集
corpus = [dictionary.doc2bow(words) for words in words_ls]
# LDA模型,num_topics设置聚类数,即最终主题的数量
lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=2)
# 展示每个主题的前5的词语
for topic in lda.print_topics(num_words=5):
    print(topic)
# 推断每个语料库中的主题类别
print('推断:')
for e, values in enumerate(lda.inference(corpus)[0]):
    topic_val = 0
    topic_id = 0
    for tid, val in enumerate(values):
        if val > topic_val:
            topic_val = val
            topic_id = tid
    print(topic_id, '->', documents[e])

在这里插入图片描述
可以看到,一共分成了两类,文本库中的标题分别分成了0,1两类,即一个是体育类,一个是科技类。

需要注意的是,LDA模型是个无监督的聚类,每次生成的结果可能不同。

参考

  • https://www.jianshu.com/p/fa97454c9ffd
  • https://zhuanlan.zhihu.com/p/31470216

更多内容访问 omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2020-2025 • OmegaXYZ-版权所有 转载请注明出处

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于LDA的文本主题聚类Python实现 的相关文章

  • Flask 无法播放 html 中的视频

    我有一个 Flask 应用程序 应该在加载页面时播放视频 但它只显示在左上角 并且不会从视频的第一帧开始改变 我已经尝试将其插入 html 代码但它不起作用 extends base html block content
  • pexpect 和 ssh:如何在 su - root -c 之后格式化一串命令

    我正在尝试迭代服务器和密码列表来更改一组服务器上的 sshd 配置 以便我可以使用无密码 SSH 密钥通过 root 登录 运行命令 我可以在 bash 中轻松完成此操作 但我正在尝试学习 Python 并且 显然 希望放弃手动输入密码 这
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • 确定非空列表条目是否“连续”的 Pythonic 方法

    我正在寻找一种方法来轻松确定列表中所有非 None 项目是否出现在单个连续切片中 我将使用整数作为非 None 项目的示例 例如 列表 None None 1 2 3 None None 满足我对连续整数条目的要求 相比之下 1 2 Non
  • 为什么我的自定义 JSONEncoder.default() 忽略布尔值?

    我想将字典转换为带有布尔值的 JSON 字符串True值转换为数字1和布尔值False值转换为数字0 我正在使用一个JSONEncoder子类 但它似乎忽略布尔值 import json class MyEncoder json JSONE
  • 根据列中的条件将 Pandas 数据框拆分为多个数据框

    为了为 ML 任务正确准备数据 我需要能够将原始数据帧拆分为多个较小的数据帧 我想要获取上面的所有行 包括 BOOL 列的值为 1 的行 对于每次出现的 1 即 n 个数据帧 其中 n 是 1 出现的次数 数据样本 df pd DataFr
  • 如何从 python 发布到 hipchat

    我有一些 python 工具 我想将它们的更新发送到 hipchat 房间 我在其他地方使用 shell 脚本执行此操作 因此我知道它在我们的环境中有效 但我似乎无法将令牌推送到 hipchat API 一定是简单的事情 首先 这会正确进行
  • 非常大的数据集的余弦相似度

    我在计算大量 100 维向量之间的余弦相似度时遇到问题 当我使用from sklearn metrics pairwise import cosine similarity I get MemoryError在我的 16 GB 机器上 每个
  • Python 中快速、小型且重复的矩阵乘法

    我正在寻找一种使用 Python Cython Numpy 快速将许多 4x4 矩阵相乘的方法 任何人都可以给出任何建议吗 为了展示我当前的尝试 我有一个需要计算的算法 A 1 A 2 A 3 A N 哪里每个 A i A j Python
  • Snakemake - 无法从输出文件中确定输入文件中的通配符

    我对snakemake很陌生 而且对python也不太熟悉 所以抱歉 这可能是一个非常基本的愚蠢问题 我目前正在构建一个管道来分析一组 bamfilesatlas https bitbucket org phaentu atlas wiki
  • 如何修复错误嵌套/未闭合的 HTML 标签?

    我需要通过使用正确的嵌套顺序关闭任何打开的标签来清理用户提交的 HTML 我一直在寻找一种算法或Python代码来做到这一点 但除了PHP等中的一些半生不熟的实现之外 还没有找到任何东西 例如 类似的东西 p p ul li Foo bec
  • 如何使用 pandas groupby 函数根据 groupby 值应用公式

    我的问题可能有点令人困惑 所以让我解释一下 我有一个信息数据框 我想按唯一订单 ID 对其进行分组 该 ID 将生成以下列 sum qty 每个订单 ID 执行的总金额 csv 这是每个订单 ID 的 csv 列的总和除以订单 ID 的已执
  • 维基百科与 Python

    我有这个非常简单的 python 代码来读取 wikipedia api 的 xml import urllib from xml dom import minidom usock urllib urlopen http en wikipe
  • 导入 python 模块时如何解决 KeyError?

    我试图从不同的目录级别导入模块 所以我使用了 import os import sys sys path insert 0 os path abspath os path join os path dirname file 但现在我收到这个
  • 如何在matplotlib_venn中将维恩图保存为PNG图

    使用以下代码我尝试创建维恩图 然后另存为文件 import matplotlib from matplotlib venn import venn2 set1 set A B C D set2 set B C D E plt venn2 s
  • 为什么在尝试导入随机模块时会收到 TypeError: 'module' object is not callable ?

    我正在使用 Python 2 6 并尝试运行一个简单的随机数生成器程序 random py import random for i in range 5 random float 0 0 lt number lt 1 0 print ran
  • 用 pandas 查找树中叶节点的所有祖先

    我有一个表 有两列 父 和 子 这是从 SAP ERP 下载的 SETNODE 表 需要在 python 中创建一个数据框 其中每个级别作为其自己的列 相对于其父级和之前的所有级别 在Python 3 中 完整关系的级别数量未知 或始终变化
  • 在 Python 中计算时间(datetime.timedelta?)

    我相信这对很多人来说都是理所当然的事情 但我发现自己对整个 datetime timedelta 事情感到非常困惑 本质上我在开始时给一些东西加上时间戳startTime然后我为流程结束添加时间戳endTime我试图找出 HH MM SS
  • 为什么 float() 会截掉尾随零?

    该代码成功地将一个包含许多数字的大文件裁剪为几个包含数字的较小文本文件 但它产生了一个有趣的怪癖 所有数字都应精确到小数点后四位 例如 2 7400 但它们打印为 2 74 这是文件的片段 0 96 0 53 0 70 0 53 0 88

随机推荐

  • 动态规划-最大的正方形面积

    题目表述 Given a 2D binary matrix filled with 0 s and 1 s find the largest square containing only 1 s and return its area Fo
  • 迭代器模式C++实现

    简介 提供一种方法顺序访问一个聚合对象中各个元素 xff0c 而又不暴露该对象的内部表示 动机 一个聚合对象 xff0c 如列表 xff08 List xff09 应提供一种方法来让别人可以访问它的元素 xff0c 而又不需要暴露它的内部结
  • macOS Catalina常见问题汇总

    本文共535个字 xff0c 预计阅读时间需要2分钟 作为一个伪程序员 xff0c 我来说说macOS Catalina的一些软件兼容性和注意点 macOS Catalina 正式版无法使用的APP 有道词典闪退 brew版本过低的加载错误
  • Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.

    Graphviz的可执行文件 http www graphviz org Download windows PHP 参考 xff1a http blog csdn net u014749291 article details 5489108
  • 计算机保研-中科院计算所霸面(笔试面试)

    基本情况 xff1a 学校 xff1a 末流211 排名 xff1a 1 70 绩点 xff1a 4 33 5 0 竞赛 xff1a 无ACM xff0c 有某水赛国奖 xff08 中国人工智能学会主办 xff09 科研 xff1a 一篇水
  • 计算机保研-中科大计算机

    Abstract 2019年中科大计算机夏令营比往年增加了不少难度 xff0c 统一增加了机试环节 xff0c 面试难度提高 xff08 陈恩红实验室和李向阳实验室向来包含机试 xff09 xff0c 最终录取率在60 左右 xff08 往
  • NSGA-II资料合集

    关于NSGA II的一些资料 NSGA II中文翻译 MATLAB代码 NSGA II的解释 简介 关于演化计算 生物系统中 xff0c 进化被认为是一种成功的自适应方法 xff0c 具有很好的健壮性 基本思想 xff1a 达尔文进化论是一
  • 简单区块链Python实现

    什么是区块链 区块链是一种数据结构 xff0c 也是一个分布式数据库 从技术上来看 xff1a 区块是一种记录交易的数据结构 xff0c 反映了一笔交易的资金流向 系统中已经达成的交易的区块连接在一起形成了一条主链 xff0c 所有参与计算
  • 复旦大学计算机保研夏令营

    Abstract 复旦的夏令营 xff1a 自由而无用 xff0c 一期招了200人入营 xff0c 不提供住宿 xff08 导致我租了个旅馆每天要骑单车来学校 xff0c 不过沿途环境不错 xff0c 有很多吃的地方 xff09 xff0
  • 计算机保研夏令营预推免

    夏令营与预推免个人情况 学校 xff1a 末流211 xff08 安徽大学 xff09 排名 xff1a 1 70绩点 xff1a 4 33 5 0竞赛 xff1a 无ACM xff0c 有某水赛国奖 xff08 中国人工智能学会主办 xf
  • 知识图谱嵌入的应用场景

    In KG应用 xff08 在 KG 范围内的应用 xff09 链接预测 xff08 Link prediction xff09 链接预测任务有时也称为实体预测或实体排序 xff0c 用来预测两个实体之间是否有特定的关系 即已知头实体h和关
  • Neo4j数据导入与可视化

    本文共1262个字 xff0c 预计阅读时间需要5分钟 简介 Neo4j是一个高性能的NoSQL图形数据库 xff0c 它将结构化数据存储在网络上而不是表中 它是一个嵌入式的 基于磁盘的 具备完全的事务特性的Java持久化引擎 xff0c
  • 用户身份链接方法——DeepLink

    论文 xff1a DeepLink A Deep Learning Approach for User Identity Linkage UIL xff08 User Identity Linkage xff09 xff1a 用户身份链接
  • 可视化图布局算法简介

    Fruchterman Reingold FR FR算法将所有的结点看做是电子 xff0c 每个结点收到两个力的作用 xff1a 其他结点的库伦力 xff08 斥力 xff09 f a d
  • Windows无法连接到打印机怎么办?快收藏这些正确做法!

    案例 xff1a Windows无法连接到打印机怎么办 xff1f 朋友们朋友们 xff0c 最近为了备考国考 xff0c 我特地买了个打印机回来打印资料 xff0c 但是我的Windows无法连接到打印机 xff0c 这是为什么呢 xff
  • Python爬虫Scrapy入门

    Scrapy组成 Scrapy是Python开发的一个快速 高层次的屏幕抓取和web抓取框架 xff0c 用于抓取web站点并从页面中提取结构化的数据 引擎 xff08 Scrapy xff09 xff1a 用来处理整个系统的数据流 xff
  • Mac下终端pip与pip3配置(软链接)

    缘起 今日Mac上的Python环境绝对是个asshole 系统自带一个Python2 7我官网下载一个3 6homebrew悄悄下了个3 xanaconda自带了一个3 x前天更新了一下Xcode命令行工具 xff0c 竟然给我偷偷下了个
  • 推荐系统摘要

    作为一个推荐系统的门外汉 xff0c 或者说是用户 xff0c 我觉得推荐系统有以下几个特性 推荐系统的真实目的并不是做到让用户满意 xff0c 而是提高销售能力 xff0c 业务水平和收益 一个好的推荐系统并不是推荐用户最喜爱 想要的东西
  • 数据分析岗位面试必备

    业务逻辑 数据分析遵循一定的流程 xff0c 不仅可以保证数据分析每一个阶段的工作内容有章可循 xff0c 而且还可以让分析最终的结果更加准确 xff0c 更加有说服力 一般情况下 xff0c 数据分析分为以下几个步骤 xff1a 业务理解
  • 基于LDA的文本主题聚类Python实现

    LDA简介 LDA xff08 Latent Dirichlet Allocation xff09 是一种文档主题生成模型 xff0c 也称为一个三层贝叶斯概率模型 xff0c 包含词 主题和文档三层结构 所谓生成模型 xff0c 就是说