【深度学习】基于BRET的高级主题检测

news2024/10/7 8:24:35

一、说明

        使用BERT,UMAP和HDBSCAN捕获文档主题,紧随最先进的BERTopic架构(transformer编码器)。

        主题检测是一项 NLP 任务,旨在从文本文档语料库中提取全局“主题”。例如,如果正在查看书籍描述的数据集,主题检测将使我们能够将书籍分类,例如:“浪漫”、“科幻”、“旅行”等。

        在本教程中,我们将使用BERT的HuggingFace库实现以及用于聚类的HDBSCAN和用于降维的UMAP来实现。该管道将遵循Maarten Grootendorst提出的BERTopic结构:

伯特皮克管道

二、开始实践

        为了简单起见,我建议在Google Coolab中运行代码,但另一个平台也很好。

        首先安装必要的依赖项:

!pip install pandas numpy umap-learn transformers plotly hdbscan

        然后继续加载输入数据:

import pandas as pd
data = pd.read_csv("ecommerce.csv", on_bad_lines='skip', nrows=500)
data = data[[""]]


        在我们的示例中,数据对应于从 Kaggle 中提取的电子商务商店。我已将数据采样到 500 行以使代码运行得更快,但如果需要,您可以使用完整的数据集。数据如下所示:

输入数据集

如我们所见,“文本”列包含文章描述。我们的主题建模目标是为每个文章描述找到正确的文章类别。例如:“Joyo多功能紧凑型折叠桌”的描述可以标记为“家用”物品。

我们将整个数据集称为语料库,每个文本行一个文档,每个(子)单词一个标记。

三、BERT 查找文档编码

        为了能够正确地将文章聚类到正确的部门中,我们需要将文本描述矢量化并嵌入到潜在空间中,以便属于同一部门的元素在几何上彼此更接近。我们将使用 BERT 作为数据编码器。

        首先加载BERT模型。HuggingFace允许我们从给定的模型实例(又名“检查点”)下载预先训练的模型。这样我们就不必自己训练完整的BERT!

# load BERT model (for embeddings)
from transformers import BertTokenizer, TFBertModel
checkpoint = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(checkpoint)
model = TFBertModel.from_pretrained(checkpoint)

然后我们加载分词器。分词器将做 3 件主要事情:

  • 将每个文档分解为一组单词/子单词(也称为标记),以便模型可以消化它们。

                例如:“Hello World!”→ ['hello', 'world', '!']

  • 将每个单词标记映射到一组给定的索引 ID

                例如: ['hello', 'world', '!'] → [7592, 2088, 999]

        请注意,id 不是嵌入,而只是模型用来将文档中的标记映射到其词汇表中的标记的数字标识符。通过预训练,模型知道自己词汇表中标记之间的关系。

  • 添加特殊标记,以便模型知道句子何时开始/结束、分隔等。例如: [EOS], [SEP], ...

标记化解释如下:

# Tokenize corpus with the BERT tokenizer (WordPiece algorithm)
descr_processed_tokenized = tokenizer(
    list(data["text"]),
    return_tensors="tf",
    truncation=True,
    padding=True,
    max_length=128,
)


        标记化后,我们的文本数据(现在以数字表示为一组令牌 ID)可以被 BERT 模型摄取

# Encode corpus using BERT
output_bert = model(descr_processed_tokenized)


        这将为整个输入数据生成嵌入。当应用于单个句子时,模型输出将如下所示:

        单个文本示例的 BERT 输出

        正如我们所看到的,BERT使用768长度的嵌入向量对输入中的每个标记进行了编码。

        但是,我们对整个文章描述的嵌入感兴趣,而不仅仅是单词嵌入的列表。为了提取整个文档的嵌入,我们只需平均文档中的所有单词嵌入。

# Get sentence embeddings from BERTs word embeddings
import numpy as np
mean_vect = []
for vect in output_bert.last_hidden_state:
    mean_vect.append(np.mean(vect, axis=0))
data = data.assign(descr_vect=mean_vect)


现在,最后,我们为输入表中的每个元素分配了一个向量,这称为文档嵌入

四、使用 BERT 进行文档嵌入

        UMAP 将向量嵌入投影到较低维度
        由于维度的诅咒,在 768 维空间上应用聚类算法是不可行的。因此,有必要应用降维技术。

        一种非常流行的技术被称为UMAP(均匀流形近似和投影)。这种技术以尊重归约后数据的全局和局部结构而闻名。

        数学说明:UMAP基于数据类可以表示为流形(流形假设)的假设,以及这些流形是可微的假设,因此UMAP的模糊逻辑是适用的。

        我们将嵌入向量的维度减少到 3 维,以便我们可以可视化结果,让我们执行以下操作:

# Use UMAP to lower the dimensionality of the embedding to 3D
import umap
descr_vect_3d = umap.UMAP(n_components=3).fit_transform(
  np.stack(data["descr_vect"].values)
)
data["descr_vect_3d"] = list(descr_vect_3d)


        堆栈将嵌套数组(array(array(...)))映射到单个数组中。我们的数据现在如下所示

将嵌入的维度从 768D 减小到 3D 后的数据

数学说明:从理论上讲,将 UMAP 用于下游处理任务(如基于密度的聚类)是不正确的。众所周知,UMAP产生的嵌入可能不保持密度,并且可能在潜流形中产生密度不连续性。然而,这在实践中往往不是问题。在此处了解更多信息。

五、将聚类分析应用于捕获主题

        至此,我们已经成功地将文档映射到 3D 潜在空间上的向量。现在是时候应用聚类分析算法来查找相关主题了。

        我们使用HDBSCAN进行聚类,因为它对数据结构的假设很少,同时即使几乎没有参数调整也能产生一流的结果

# Use BERT's + UMAP vector embeddings for clustering using HDBSCAN
import hdbscan
clustering = hdbscan.HDBSCAN().fit(np.stack(data["descr_vect_3d"].values))
data["cluster_label"] = clustering.labels_


        绘制数据[“descr_vect_3d”].值作为 3D 散点图,我们得到以下内容

在 3D 文档嵌入空间上检测到的主题(颜色)

        这里的主题由颜色表示。该算法将它们简单地标记为 {0, 1, 2}。

        数学说明:HDBSCAN 是 DBSCAN 的扩展,使用图形修剪来揭示数据中底层集群的最佳规模,从而解决集群层次结构中的内在非唯一性。因此,算法会自动找到聚类的数量。

六、查找主题

        在简单检查集群标签及其背后的描述后,我们识别出一些明显的主题类别:
                主题 = 0 → 书籍
                主题 = 1→ 家庭
                主题 = 2→ 服装和配饰

        最后,让我们用相应的文章类别(即文档主题)注释我们的数据。

data["article category"] = data["cluster_label"].map(
    {0: 'Books', 1: 'Household', 2: 'Clothing & Accessories'})

        那么我们的最终数据如下所示:

        使用所需文章类别注释的数据,这是我们想要的结果。 

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

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

相关文章

fatal: unable to access ‘http://xxxx‘: Empty reply from server

当你遇到 “fatal: unable to access ‘http://xxxx’: Empty reply from server” 的错误信息时,通常表示 Git 客户端无法连接到指定的服务器或仓库。 以下是一些可能导致该错误的原因以及一些排除故障的步骤: 错误的 URL:确保你提供的 URL…

linux 服务器之间传输文件的方式

情景:有时迁移项目,一般人就想到需要在服务器下载到win本地电脑上面,再上传到目的服务器,这样若是文件大,下载的速度都足够让你歇一天了。遇到这问题,怎么解决呢? 方法1:scp 【优点…

数据结构---手撕图解双向循环链表

文章目录 写在前面双向循环链表的构造布局带有哨兵位的布局 链表的构建链表的销毁链表的输出链表的尾插链表的尾删链表的头插链表的头删链表的查找链表的插入链表的删除 写在前面 在前面学完单链表后,我们思考这样一个问题,单链表和顺序表比起来&#x…

RK3588平台开发系列讲解(Camera篇)V4L2 视频采集步骤

文章目录 一、V4L2 视频采集步骤1.1、查询设备能力1.2、设置采集参数1.3、请求帧缓冲1.4、映射帧缓冲1.5、启动视频采集1.6、停止视频采集沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解V4L2 视频采集步骤。 一、V4L2 视频采集步骤 V4L2 视频采集的常用…

28. 在O(1)时间删除链表结点

链接: 链接 题目: 给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。 假设链表一定存在,并且该节点一定不是尾节点。 数据范围 链表长度 [1,500][1,500]。 样例 输入:链表 1->4->6->8删掉节点&…

指针和数组笔试题解析(最详细解析,没有之一)

指针和数组笔试题解析(最详细解析,没有之一) 前言1. 一维数组和指针相关笔试题2. 字符数组和指针相关笔试题2.1 题型一:2.2 题型二:2.3 题型三:2.4 题型四: 3. 指针和字符串相关面试题3.1 题型一…

华为云CodeArts Check代码检查插件3大版本使用指南

华为云CodeArts Check是自主研发的代码检查服务。为用户提供代码风格、通用质量与网络安全风险等丰富的检查能力,提供全面质量报告、便捷的问题闭环处理帮助企业有效管控代码质量,助力企业成功。 本插件致力于守护开发人员代码质量,成为开发…

【低代码专题方案】使用iPaaS平台下发数据,快捷集成MDM类型系统

01 场景背景 伴随着企业信息化建设日趋完善化、体系化,使用的应用系统越来越多,业务发展中沉淀了大量数据。主数据作为数据治理中枢,保存大量标准数据库,如何把庞大的数据下发到各个业务系统成了很棘手的问题。 传统的数据下发方…

英国大学生用AI写论文拿到1等成绩!ChatGPT写论文教程+提示词分享

今年期末季与往年的一大不同就是有了“哆啦C梦”——ChatGPT。过于高效智能的它,上线初期就引起了学术界关于“学术不端”的热烈讨论… 目录 01.用AI写论文获1等成绩 02.如何用ChatGPT辅助学习/写作 01.迅速get知识点 02.辅助理解内容 03.辅助起草论文大纲 0…

3Ds max入门教程:创建埃菲尔铁塔

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 创建任何细节并不总是必要的,有时在场景中您需要在后台添加一些元素,这给人的印象是事件正在特定地点发生。这种方法可以节省大量的时间和精力。因此,在本教程中&#xf…

SpringBoot整合ZooKeeper完整教程

目录 ZooKeeper简单介绍 一、安装zookeeper 二、springboot整合zookeeper ZooKeeper简单介绍 zookeeper是为分布式应用程序提供的高性能协调服务。zookeeper将命名、配置管理、同步和组服务等常用服务公开在一个简单的接口中,因此用户无需从头开始编写这些服务。可…

【SpringBoot3】--03.数据访问、基础特性(外部化和内部外配置、整合JUnit)

文章目录 SpringBoot3-数据访问1.整合SSM场景1.1创建SSM整合项目1.2配置数据源1.3配置MyBatis1.4CRUD编写 2.自动配置原理3.扩展:整合其他数据源3.1 Druid 数据源 SpringBoot3-基础特性1. SpringApplication1.1 自定义 banner1.2.自定义 SpringApplication1.3Fluent…

【ELK企业级日志分析系统】部署Filebeat+ELK详解

部署FilebeatELK详解 1. 部署Filebeat节点1.1 部署Apache服务1.2 部署Filebeat服务 2. filter插件2.1 grok正则捕获插件2.1.1 内置正则表达式调用2.1.2 自定义表达式调用2.1.3 设置正则表达式过滤条件 2.2 mutate数据修改插件2.2.1 Mutate过滤器常用的配置选项2.2.2 Mutate过滤…

ROS2学习(一 、ROS2安装)

ROS2官方安装 https://docs.ros.org/en/galactic/Installation/Ubuntu-Install-Debians.html 本来想找一下和ros1一样的安装指导文档,可以根据自己的系统选择。不过没有找到一个直接的说明教程。 不过在ROS2的各个版本安装说明里面有写支持哪些版本的系统。 比如我…

AWS 中文入门开发教学 45- Cloud9 - Node.js的开发与调试

知识点 在 Cloud9 环境中开发调试 Node.js 应用程序实战演习 $ mkdir expressweb $ cd expressweb $ npm init -y $ npm install express --save $ nano app.js ... $ curl http://httpbin.org/ip #查看当前主机的ip地址 $ node app.jscloud9还提供了一个非常好用的debug工具:…

23款迈巴赫S480新提车升级头等舱行政四座,五座改四座案例改装

新款的迈巴赫S480五座改四座成了必改的配置,改装的车主非常的多,不仅提供宽大的空间,而且后排中央扶手马鞍处还增加了一块Pad,用来控制空调,遮阳帘等。更有一众黑科技提供的后排乘客的舒适性。一起来看看五座迈巴赫S48…

Android 学习笔记: 三种基本布局的使用介绍

一、概述 布局是一种可用于放置很多控件的容器,它可以按照一定的规律调整内部控件的位置,从而编写出精美的界面。 布局的内部除了放置控件外,也可以放置布局。 三种常用布局 LinearLayoutRelativeLayoutFrameLayout 二、 LinearLayout …

列举几个常用的淘宝API接口(详情页面数据接口,评论接口,关键词搜索接口,店铺所有商品接口)

目前各大电商平台都有自己的开放平台,通过API接口开放本电商平台的相关数据和功能,以自由开放的姿态来占领更多的市场份额。也让更多的人能来电商市场分得一杯羹。 下面列举几个常用的API接口,量大择优hui, 注册key和secret可测…

基于SpringBoot+Vue的校园博客系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

mysql将某一列的数据根据固定字符拆分后判断存不存在

如果数据库的某个字段在存储时是用的逗号分割,如下图所示: 例如这张表中有一个字段是用的逗号分割,其实这种设计违背了数据库三范式设计原则,如何判断这一列的值包不包含某一个值? 方法一 用mysql自带的字符串函数去判…