怎样使用BERTopic做话题检测和主题聚类

2026-6-13 11:15| 发布者: Fuller| 查看: 10| 评论: 0

摘要: 1. 什么是话题检测和主题聚类topic detection有人翻译成话题检测,另有人翻译成话题发现。此前我们讲解了LDA的使用方法,那时,在做主题分析之前需要设定目标主题数,LDA就从文本中提取出这么多主题。当要分析的文本 ...

1. 什么是话题检测和主题聚类

topic detection有人翻译成话题检测,另有人翻译成话题发现。此前我们讲解了LDA的使用方法,那时,在做主题分析之前需要设定目标主题数,LDA就从文本中提取出这么多主题。当要分析的文本条数非常多,而且主题是发展变化的,主题数难于预先确定。这种情况往往发生在微博博主主页上。随着时间的发展,博主讨论的主题也在随时间变化。在一个月或者一年的时间跨度内,主题数量比较多而且不能确定。此时,需要算法自动发现有多少个主题,所以叫话题发现。

今天介绍的BERTopic就有话题发现能力,这个能力跟此前介绍的top2vec一样。下面将进行说明。

BERTopic和top2vec的相同点在于:他们都是一种聚类(这是跟LDA有明显区别的),而且他们的计算流程基本上是一样的。

所谓“主题聚类”,强调的是聚类,不像LDA模型是一种概率模型,而更像普通文本聚类那样的聚类过程。但是,我们知道,普通的文本聚类是在由原始特征词构成的多维空间中衡量文档之间的距离,由于特征词非常多,文档向量中在很多特征词维度上是0(非0的维度很稀少),即不含有这个词。而且普通文本聚类是词袋模型,不考虑一个词的前后相关词所表达的语义。相反,主题聚类算法(包括BERTopic、Top2vec等等)解决了这些问题,首先不是在原始的多维空间中表示文档向量,而是在更加稠密的嵌入空间中表示文档向量;其次,采用更加精巧的降为算法和文档向量聚类算法。

但是,BERTopic与top2vec相比又有明显的不同。

2. BERTopic的原理是什么

BERTopic是采用BERT技术的主题聚类算法。主要有下面的步骤:

  1. 用SBERT把文档变成向量
  2. 用UMAP降维
  3. 用 HDBSCAN 聚类
  4. 用 c-TF-IDF 提取关键词

对SBERT和BERT的名词解释参看《什么是SBERT》。

3. 安装SBERT模型

Top2vec的最大区别在于:BERTopic的第一步采用SBERT模型把文档变成向量。SBERT模型是预训练的语言模型,当前发布的GooSeeker分词扩展模块采用这两个模型

  • 英文模型:all-MiniLM-L6-v2
  • 中文模型:bge-base-zh-v1.5

这两个都是参数数量是中小规模的模型,通常的文本分析相关的科研任务是够用。未来发布的版本允许用户自己选择模型。与情感分析模型的安装方法几乎是一样的,所以在此不细说了,可以看情感分析模型安装方法那篇教程:

  • SBERT的安装位置是一样的;
  • 也是从GooSeeker官方QQ群下载;
  • 模型也是分卷压缩的,解压方法一样;
  • 也是同样把解压后的文件连带文件夹(分别是all-MiniLM-L6-v2和bge-base-zh-v1.5)一起拷贝粘贴到models目录中

【注意】即便只分析中文文本,也要同时安装这两个语言模型。

使用Top2vec做话题检测却不需要安装预训练的语言模型,因为Top2vec在每个分析任务中利用导入的文本数据,从0开始训练模型,并不使用预训练的模型。所以,

【注意】如果要分析的文本条数很少,Top2vec可能很难按照话题进行归类,BERTopic却是可以的。

4. 启动主题聚类分析

如上图,主要有下面步骤:

  1. 先创建一个主题聚类任务,创建任务的时候要求导入原始数据表。表的格式必须符合要求,在创建任务对话框中显示了格式要求,即,excel表的表头必须含有“序号”和“正文”两个字段名字。
  2. 选择缩减到的话题数:虽然话题数是自动发现的,但是,可以设定一个目标话题数,因为发现的话题数可能会非常多,几百个,看起来很分散,可以预先告诉算法缩减到一个小的数量。也可以设置成“不缩减”。也可以以后再缩减。以后可以选择另一个数字,点击启动分析
  3. 选择所用的模型:BERTopic或者Top2vec
  4. 点击启动分析按钮

【注意】如果文本条数非常多,将花费很长时间,可能几十分钟,请耐心等待。直等到弹出分析完成提示框,或者在界面上显示一行橙色的字,如果含有“遇到异常”,表示分析失败了。遇到失败的时候请联系管理员,协助诊断失败原因。

5. 可视化结果

5.1. Top20特征词分布图

如上图,是表示每个主题的贡献最大的20个特征词。这些词可以用来解释这个主题是关于什么的。

【注意】在界面上可以选择“话题未缩减”或“话题缩减后”。如果看“话题未缩减”,由于主题数可能很大,下面有翻页,可以逐个查看。

5.2. 文本簇散点图

如上图,采用了t-SNE降维。这种降维算法得到的结果没有保持空间的距离关系,而是让散点显示的更加紧凑好看一点。可以对比下面的UMAP降维后的散点图

5.3. 可视化探索

【注意】只有BERTopic模型才有可视化探索,Top2vec模型没有这个功能。

这是BERTopic程序包自带的可视化功能,可以生成多个图,每个都存成html文件,可以下载下来在浏览器中查看。在这些图上可以缩放、拖拽,以便探索主题聚类后的结果。下面展示其中3个图。

5.3.1. UMAP降维后的散点图

如上图,右上角有各种探索手段,比如,缩放、拖拽。鼠标浮在点上可以看到这个文档的内容。这个图跟前一个图在布局上有些区别,因为UMAP降维算法可以保留散点之间的距离关系。

5.3.2. 话题层次关系图

如上图,可以看到哪些话题可以合并成更高层次的话题。

5.3.3. 话题空间关系图

这个图在LDA分析功能中出现过,只是在这里显示的内容简单一些。

5.3.4. 导出可视化探索图

所有这些图都存成了html文件,可以点击“下载结果”按钮导出来。在任何浏览器中打开就能看。

6. 是否需要切分成句子

我们知道SBERT的意思是sentence BERT的意思,就是把句子(而不是文档)转换成向量进行聚类。其实,这个名字有误导作用。真实情况是:并不强求使用句子进行分析。GooSeeker分词扩展模块提供了三种粒度的分析:

  • 原始数据表:完整的文档,比如,一条评论,一条微博,也可能是一篇文章
  • 句子表
  • 切片表

6.1. 原始数据表

例如,使用GooSeeker网络爬虫软件采集微博上的文本,这些文本很有分析价值。可以采集这些内容:

  • 按照关键词在微博上看到的搜索结果
  • 微博博主主页上发布的所有微博内容
  • 微博消息的评论内容
  • 微博消息的转发内容
  • 微博话题
  • 微博超话

除了微博以外,还可以采集各种论坛、评论等。这些内容相对来说都比较短,可能最多一二百个字。这种情况直接分析原始内容即可,不需要切分成句子。

如果采集到的是文章,就应该考虑切片了。

6.2. 切片表

当导入原始数据表时,GooSeeker分词扩展模块会自动切片,每500个字切成一片。如果导入的文本比较长,或者长长短短不一样,切片以后再分析更加适合。

【注意】切片表不需要导入,导入原始数据表就自动有了切片表

6.3. 句子表

可以作为对比,在句子这个层面进行分析,对比这三种粒度,看看哪种情况最好解读。通常情况下,句子太短了,一个句子中的上下文不够丰富,会分析生成更大量的主题,即,主题更加发散,会增加解读的难度。所以说,虽然叫SBERT算法,其实不强求在句子层面进行分析。

6.3.1. 怎样得到句子表

句子表是需要手工导入的,不像切片表那样自动生成。句子表是由中英文分词功能生成的。在那个功能上,导入原始数据表就能导出切好的句子表。导出以后,拿过来导入主题聚类功能。如下图

在中文分词那里,可以选择jieba分词或者spacy分词,分别在中文分词和英文分词方面各有优势,虽然两种分词都能同时处理中文和英文。

7. 参数调整

点击界面上的“调参”,弹出一个对话框,可以为算法调整参数。

如上图,参数分成两类:

  • 跟降维和聚类有关的参数:上面的红框
  • 跟c-TF-IDF有关的参数:下面的红框

跟降维和聚类有关的参数都填了缺省值0,这表示GooSeeker分词扩展模块会自动根据导入的数据的特点做适配。如果要手工改动这些参数,请先查阅了解这些参数的目的。

跟c-TF-IDF有关的参数只影响Top20特征词分布图,也就是说只影响对聚类结果的解读,而不影响聚类过程。因为这些参数可以设定使用哪些词来表示一个主题,比如,滤除掉连词、介词等等,只保留有意义的词,还可以通过设定词频范围,滤除掉一些泛词。

【注意】BERTopic和top2vec的可调参数是不一样的。BERTopic多了c-TF-IDF所需的参数


鲜花

握手

雷人

路过

鸡蛋

最新评论

GMT+8, 2026-6-13 12:51