摘要
在机器学习和自然语言处理领域中,主题模型(Topic Model)是在一系列文档中发现抽象主题的一种统计模型,并被广泛地应用于文本文档集合的分析。近年来,各种主题建模技术,特别是概率图建模技术,取得了显著的进展,其中隐含狄利克雷分布(LDA)等最先进的技术已经成功地应用于可视化文本分析。然而,大多数基于概率模型的方法在多次运行的一致性和经验收敛性方面存在缺陷。此外,由于公式和算法的复杂性,LDA 无法轻易合并各种类型的用户交互和反馈。本课题的主要目的是设计一个主题模型可视化分析系统,使用非负矩阵分解的方法对文本进行主题建模,将训练过程和结果实时地可视化呈现给用户,并以半监督模式为核心,设计一系列用户交互方式,达到基于用户驱动的文本主题模型交互优化。在经过若干次模型交互优化后,如果用户对当前训练的主题模型感到满意了,便可以使用此模型来对语料库之外的新文档进行拟合,从而得到新文档的主题分布预测。本系统采用 Web 技术,后端算法和接口使用 Python 语言和 FastAPI Web 框架编写,前端界面使用 React&Ant Design 框架编写。本系统中收录了现实网络上多种类型的语料库(中/英文文本、社交用户短文本、新闻长文本),并提供了一个 Bilibili 网站的视频评论爬取工具,用户可以选择自己感兴趣的视频并爬取该视频下的评论,然后对其进行主题建模分析。最后,通过对这些实际语料库进行主题建模,执行相应的用户交互优化主题模型,并对其结果进行对比、分析,发现该系统在运行效率、多次运行的结果一致性方面明显要优于 LDA 算法,并且用户交互确实能够表达出用户的意图,并对主题模型的结果有改进优化的效果。
关键词:自然语言处理,文本分析,数据可视化,交互式聚类,主题模型,半监督,非负矩阵分解(NMF)
一、绪论
1.1 本课题的研究背景和意义
近年来,随着网络以及社交媒体的不断发展及活跃,互联网上每天都会产生大量的文本信息。在这些海量的文本数据中,对其进行分析并提取出有价值的内容,并由此指导用户的决策过程一直是研究的热点领域。在解决这些问题的各种方法中,主题建模方法(从文档语料库中发现语义上具有意义的主题)在数据挖掘/机器学习和可视化分析领域得到了广泛的应用。顾名思义,这是一个自动识别文本对象中存在的主题并派生文本语料库显示的隐藏模式的过程。
主题建模不同于使用正则表达式或基于字典的关键字搜索技术的基于规则的文本挖掘方法。这是一种无监督的方法,用于查找和观察大型文本集中的一堆单词(称为“主题”)。主题可以定义为“语料库中共同出现的术语的重复模式”。
主题模型有着广泛的应用场景,特别是对于文档聚类,组织大量文本数据,从非结构化文本中检索信息以及选择功能非常有用。例如,《纽约时报》正在使用主题模型来提升其用户–文章推荐引擎;各种专业人士正在针对招聘行业使用主题模型,他们旨在提取职位描述的潜在特征并将其映射到合适的候选人。
在本节接下来的内容中,我们将回顾主题模型的发展及研究现状,提出目前存在的问题,以及本课题的研究意义。
1.1.1 主题模型的发展及研究现状
早在上世纪 80 年代,研究者们常常使用 TF-IDF 方法来进行文档的检索和信息的提取。在此方法中,先选择一个基于词或者词组的基本词汇,然后对于语料库中的每个文档,分别统计其中每个单词的出现次数。经过合适的正则化后,再将词的频率计数和反向文档频率计数相比较,得到一个词数乘以文档数的向量 X。向量的每个行中都包含着语料库中每个文档的 TF-IDF 值。
但是整个 TF-IDF 算法是建立在一个假设之上的:一个单词出现的文本频数越小,它区别不同类别文本的能力就越大。这个假设很多时候是不正确的,尤其是在引入 IDF 的过程中,单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用,显然这并不是完全正确的。其也不能有效地反映单词的重要程度和特征词的分布情况,因此精度有限。
上世纪 90 年代,Deerwester S 等人提出了潜在语义分析(LSA),它是一种用于知识获取和展示的计算理论和方法,出发点就是文本中的词与词之间存在某种联系,即存在某种潜在的语义结构。Thomas Hofmann 于 1999 年提出了概率潜在语义分析(pLSA),并在文中描述了 pLSA 与 LSA 的区别,即 LSA 主要基于奇异值分解(SVD),而 pLSA 则依赖混合分解。他随后进行了一系列实证研究,并讨论了 pLSA 在自动文档索引中的应用。他的实证结果表明 pLSA 相对于 LSA 的表现有明显进步。
年,潜在语义分析被 Jerome Bellegarda 提出使用在自然语言处理中。2003 年 Andrew Y. Ng 等人在论文中提出用于 pLSA 的 aspect model 具有严重的过度拟合问题,他们提出了隐含狄利克雷分布(LDA),这可以看作是结合了贝叶斯思想的 pLSA。LDA 是目前使用的最常见的主题模型。
年,针对当前主题模型可以为文档构建可解释的向量表示,而词向量在句法规则方面十分有效,Christopher E Moody 提出了 lda2vec,一个学习密集单词向量的模型,将上述两类模型的优点结合。他们的方法很容易融入现有的自动微分框架,并允许科学家使用无监督文档表示,同时学习单词向量和它们之间的线性关系。
1.1.2 目前存在的问题
主题模型是一种无监督学习模型,其结果的好坏取决于所选的模型参数和训练集,并且具有很高的不确定性。用户通常无法在训练过程中对模型的结果进行修正,特别是一些专业领域,用户无法向主题模型提供一些领域知识来提高主题建模的质量。已有一些研究提出,通过对主题模型添加约束的形式来解决这一问题。Hu 等人提出了交互式主题模型,然而主题建模的结果十分不直观,从中寻找不恰当的结果并添加合适的约束非常耗时、费力。同时现在基于概率图模型的主题建模算法结果往往具有不确定性,很难引入用户的交互反馈操作,比如让用户交互调整建模的中间结果和参数,从而得到更优的主题分析结果。
1.1.3 本课题的研究意义
本课题的研究意义是对当前主题建模算法进行优化改进,解决算法结果的不确定性和用户交互反馈引入的困难性这 2 个问题,将可视化分析技术与主题模型相结合,提供有效的交互手段,让人们充分参与到分析主题模型的结果中来,利用人的认知能力,从数据中挖掘有效信息,达到基于用户驱动的文本主题模型交互优化。
1.2 研究内容和主要工作
本课题的研究主要内容是在国内外交互式主题建模的研究基础上,设计一个面向文本分析的交互式主题建模可视化分析系统。系统使用非负矩阵分解(NMF)来作为主题建模的主要算法,并参考了 Jaegul Choo 等人提出的 UTOPIAN 主题建模可视化分析系统,对其中的半监督非负矩阵分解(SS-NMF)算法和多种用户交互方式进行了实现及改进。
本系统采用 Web 技术,后端算法和接口使用 Python 语言和 FastAPI Web 框架编写,前端界面使用 React&Ant Design 框架编写。主要工作可分为以下几个部分:
语料库的爬取、收集和整理,并写入数据库。
后端主题建模相关算法的编写。
后端 Web API 接口的编写。
前端界面的设计。
前端与后端的对接,调用后端数据接口,并将数据可视化。
前端用户交互逻辑的编写。
1.3 本文的组织结构
本文共分为六章,各章内容如下:
第一章,总结了课题研究的背景,国内外相关领域的研究及应用,课题研究的主要任务和本文的主要工作。
第二章,对后端的实现过程进行了详细的阐述,包括算法实现过程、后端 Web API 接口实现过程等。
第三章,对前端的实现过程进行了详细的阐述,包括界面的区域模块介绍、与后端接口的对接、数据可视化展示等。
第四章,对算法进行定量分析及比较,主要是对算法的性能、收敛速度、多次运行的一致性方面进行分析,并与 LDA 算法进行对比。
第五章,对此系统进行实际使用场景的展示,选取了现实中多种类型的语料库来进行主题建模,并演示了各种用户交互方式,以及主题模型随着用户交互优化的变化过程。
第六章,对本文进行总结并提出下一步工作。
二、核心算法
2.1 文本预处理
预处理主要分为分词和特征提取,接收的输入参数如下:
Language: CorpusLanguage(Enum),表示语料库的语言类型,目前支持中文和英文 2 种类型。
Documents: List[str],语料库数据,使用字符串列表来表示,其中每个元素代表一篇文档。
Min_word_num_in_doc: int,文档最小词数过滤,如果文档的词数小于该值,则过滤掉该文档。此参数可以用来过滤掉某些过短且意义不大的文本,比如“哈哈哈哈哈”,从而提高语料库的质量。
接下来是分词部分,因为中文和英文的语言结构特点不一样,所以采取的方法也有所不同。其中英文分词用的是 nltk[footnoteRef:1]中的 tokenize 分词工具,中文分词用的是结巴中文分词[footnoteRef:2],中文和英文的停用词列表使用的是网上他人整理的数据。分词流程图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/7ba4d559ecdce831515ca27d36d10db1.png)
图 中英文分词流程图
接下来是特征提取,我们使用 TF-IDF 算法来计算特征矩阵,算法的实现我们使用了 scikit-learn 科学工具包中的 TfidfTransformer 类,计算的过程如下:
计算词袋,即将上一步中所有文档的分词结果列表合并去重,得到语料库中出现的所有单词的集合。
计算词频矩阵,其中 m 是词袋长度(即单词总数),n 是文档总数,表示单词 i 在文档 j 中的出现词数。
使用 TfidfTransformer 来从词频矩阵计算得到非负矩阵。
2.2 大型语料库的内存优化
当我们将以上 NMF 算法应用到一个稍大的语料库的时候,出现了 MemoryError 内存不足的错误。经过分析,我们发现在算法中,输入矩阵 A 和对角矩阵是比较占用内存空间的。假设现在的语料库包含 50,000 个文档,20,000 个单词,矩阵的数据类型为 float32,那么矩阵 A 的创建就需要 4GB 的内存空间,而需要 10GB 的内存空间,然而这 2 个矩阵中的大部分元素都是 0,占用这么大的内存空间完全是没必要的。因此我们可以使用 scipy.sparse[footnoteRef:4]中的稀疏矩阵来节省内存空间,主要用到了以下 3 种稀疏矩阵:
csr_matrix:按行压缩的稀疏矩阵存储方式,由三个一维数组 indptr, indices, data 组成。indptr 存储每一行数据元素的起始位置,indices 这是存储每行中数据的列号,与 data 中的元素一一对应。它的主要优点是高效地进行矩阵的算术运算,以及快速地行切片,缺点是列切片和稀疏矩阵的转换比较慢。
![](https://i-blog.csdnimg.cn/blog_migrate/81825d9fae04e39dbcaf2faf940ce6cb.gif)
图 csr_matrix 的存储结构图
csc_matrix:和 csr_matrix 正好相反,即按列压缩的稀疏矩阵存储方式,同样由三个一维数组 indptr, indices, data 组成,优缺点和 csr_matrix 基本一致,它们之间唯一的区别就是按行或按列压缩进行存储。而这一区别决定了 csr_matrix 擅长行操作;csc_matrix 擅长列操作,进行运算时需要进行合理存储结构的选择。
![](https://i-blog.csdnimg.cn/blog_migrate/03a5c46576f7fe6fe82f26a1a8bc5783.gif)
图 csc_matrix 的存储结构图
lil_matrix:使用两个嵌套列表存储稀疏矩阵:data 保存每行中的非零元素的值,rows 保存每行非零元素所在的列号(列号是顺序排序的)。这种格式很适合逐个添加元素,并且能快速获取行相关的数据。其初始化方式同 coo_matrix 初始化的前三种方式:通过密集矩阵构建、通过其他矩阵转化以及构建一个一定 shape 的空矩阵。优点是快速地按行切片以及高效地添加、删除、查找元素,缺点是列切片、矩阵加法、乘法效率较低。
![](https://i-blog.csdnimg.cn/blog_migrate/8f9940d0d923b49167cd76377300c678.gif)
图 lil_matrix 的存储结构图
2.3 UMAP 数据降维&可视化
统一流形逼近与投影(Uniform Manifold Approximation and Projection, UMAP)是由 Mclnnes 在 2018 年提出的一种降维技术,类似于 t-SNE,可用于可视化,但也可用于一般的非线性降维。该方法采用 k-最近邻的概念,并利用随机梯度下降优化结果。它首先计算高维空间中点之间的距离(一般是欧几里得距离),将它们投影到低维空间中,然后计算低维空间中点之间的距离。然后,使用随机梯度下降,以尽量减少这些距离之间的差异。
UMAP 的一些主要优点是:
它可以处理大数据集和高维数据而不太困难。
它将可视化除了保留局部结构外,它还保留了数据的全局结构。UMAP 将流形上的邻近点映射到低维表示中的邻近点,并且对于远处点也这样做的能力与减少数据维度的能力结合在一起。
速度比 t-SNE 要快很多,且降维效果更好。
当应用到主题建模中时,我们以 NMF/SS-NMF 的结果矩阵 H 作为 UMAP 的输入。详细地说,假设主题数为 k,那么 H 的列表示文档 i 与这 k 个主题的相关度,也就是说它是一个 k 维的向量。我们通过将每个基于主题相关度表示的文档向量使用 UMAP 算法来降到三维,获取每个文档基于三维空间坐标的表示方式,从而将每个文档作为一个节点来在 3D 散点图中可视化。
在本系统中,我们会在可视化前随机生成一个颜色数组 ColorArray,每个主题集群对应其中一种颜色。假设表示主题 ti 的颜色,那么在 3D 散点图中,文档 di 的颜色为其硬聚类到的主题(与其相关度最大的主题)的颜色,即:
但是,在实际将 UMAP 算法的结果应用到 3D 散点图可视化中,我们发现其中不同的主题集群严重地聚集在一起:
![](https://i-blog.csdnimg.cn/blog_migrate/bc14eb88aca2efa9dbb66780ba0962ac.png)
图 原始 UMAP 的可视化结果
如上图所示,由于重叠,使得难以分析主题与主题以及文档与文档之间的关系。为了克服这个问题,我们对原有的 UMAP 算法进行了一点改进,以便可以更好地显示嘈杂数据集(如文档)中的集群结构。假设表示文档 i 和 j 之间的成对距离,如果这 2 个文档硬聚类到同一个主题集群,则我们将它们之间的成对距离乘以一个缩放因子(可由用户调整)。如果用伪代码的形式来表示即为:
表 UMAP 的改进方法
UMAP 改进:自定义距离计算函数 | UMAP 改进:自定义距离计算函数 |
1 | 输入:缩放因子,文档 i 的列向量,文档 j 的列向量 |
2 | |
3 | :Return |
4 | Else:Return |
在本系统中,我们使用了 Python 中的 umap-learn[footnoteRef:5]包来作为其实现。若要实现上述的改进算法,则只需要将自定义距离计算函数作为一个回调函数传递给 UMAP 类的 metric 参数即可。改进后的 UMAP 算法的可视化结果如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/39c82babbd225f3b153dfc00d3f7434d.png)
图 改进 UMAP 的可视化结果()
通过这种方式,现在 UMAP 的可视化结果可以更紧凑地表示每个集群,从而可以更清晰地看出集群结构。正如我们所看到的,比表现的更清晰,可以很容易看出有 5 个主题集群。
三、系统设计与实现
3.1 系统介绍及流程图
本系统采用了前后端分离的方式来实现,后端采用 Python 语言编写,主要工作是核心算法的实现、语料库爬虫以及 Web API 的编写;前端主要使用 JavaScript 语言编写,主要工作是用户界面与交互的设计、与后端接口的数据对接、数据可视化。整个系统运行的流程图如下:
图 系统运行流程图
3.2 后端实现过程
3.2.1 框架介绍
在本系统中,我们使用了 SQLAlchemy 作为 SQL 工具包和对象关系映射器,它提供了一套完整的企业级持久化模式,专为高效率和高性能的数据库访问而设计,简单易用用,专门为 Python 语言而准备。使用了 FastAPI 作为后端的 Web 框架,它是一个基于 Python3.6+ 构建的现代化、高效率、高性能的 Web 框架,具有以下特点:
快速:非常高的性能,与 NodeJS 和 Go 相当。
高效编码:将开发特性的速度提高大约 200% 到 300%。
简易:旨在易于使用和学习,减少阅读文档的时间。
稳健:获取可用于生产环境的代码,具有自动交互式文档。
基于标准:基于 API 的开放标准(并与之完全兼容):OpenAPI(以前称为 Swagger)和 JSON Schema。
3.2.2 数据库 ORM 映射类
在本系统中,我们使用 SQLite 数据库来存储语料库,其中一种语料库即对应一个表,除了 Bilibili 视频表和 Bilibili 视频评论表之间存在关系外,其他的表都是独立存在的,所以我们只介绍这 2 个表及对应的 ORM 映射类,其他的表是类似的。ER 图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/cece4aef2d65a7f51b1b4576ba1ddad1.png)
图 数据库 ER 图
ORM 映射类主要定义在 models.py 中,所有类都继承自 declarative_base 类,其中 Bilibili 视频和视频评论映射类的定义如下:
![](https://i-blog.csdnimg.cn/blog_migrate/07a85f946a1755cbd388824c8df76a9c.png)
图 ORM 映射类定义
3.2.3 Pydantic 模型类
此类主要是在 API 读取数据库并返回数据时使用的,我们将 API 将返回数据类型设置为 Pydantic 模型类时,当通过 SQLAlchemy 读取数据库并返回 ORM 映射类对象时,FastAPI 将自动将其转为相应的 Pydantic 模型类对象,并返回前端需要的 JSON 数据形式。以 Bilibili 视频评论为例,相应的 Pydantic 模型类定义如下:
![](https://i-blog.csdnimg.cn/blog_migrate/5440d1ff690eed872afa9968ac208ab6.png)
图 Pydantic 模型类
3.2.4 TextPreprocessing 文本预处理类
此类的主要作用是进行文本预处理工作,核心方法如下:
english_split_words():对英文语料库进行逐文档分词。
chinese_split_words():对中文语料库进行逐文档分词。
feature_extraction():语料库特征提取,计算词袋模型、词频矩阵以及 TF-IDF 矩阵。
get_new_doc_tfidf(doc):在当前语料库的背景下,计算新文档的 TF-IDF 矩阵。
Start():开始预处理工作,包括分词和特征提取。
3.2.5 SSNMFTopicModel 非负矩阵分解类
此类的主要工作是进行非负矩阵分解的计算工作,核心方法如下:
random_init_wh():随机初始化矩阵 W 和 H。
fit_original_nmf_cjlin_nnls():计算原始的 NMF。
fit_semi_supervised_nmf_cjlin_nnls():计算带有用户交互信息的半监督 NMF。
fit_new_doc(a):拟合新文档,得到其在当前主题模型背景下的主题分布。
3.2.6 TopicModelTrainingTask 训练任务类
此类的主要工作是接受前端传递的训练参数,创建训练对象并进行后台计算工作,以及构造前端需要的可视化数据,核心方法如下:
preprocessing():创建文本预处理对象,进行文本预处理工作。
start_nmf_and_umap(is_first_training = True):开始 NMF 训练和 UMAP 降维工作。
mmf_training():创建 SSNMFTopicModel 和 UMAP 对象,开始初次 NMF 训练工作。
topic_keyword_optimization():设置主题关键词优化参数,并开始 SSNMF 训练工作。
topic_split ():设置主题拆分参数,并开始 SSNMF 训练工作。
topic_merge():设置主题合并参数,并开始 SSNMF 训练工作。
keyword_induced_topic_create():设置关键词诱导主题创建参数,并开始 SSNMF 训练工作。
document_induced_topic_create():设置文档诱导主题创建参数,并开始 SSNMF 训练工作。
new_doc_topic_distribution_predict(doc):对新文档进行主题分布预测计算工作。
get_topic_cluster_data():获取前端主题聚类所需要的可视化数据。
3.2.7 Web API 接口
在 FastAPI 中,当启动服务器后,访问http://127.0.0.1:8000/docs,就可以看到自动生成的交互式 API 文档界面,本系统中的后端 API 如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/d1f89553971ea4cec0801c279b2d99eb.png)
图 后端 Web API 接口一览
后端接口主要分为三类:
语料库数据接口:读取数据库,返回相应的语料库文本数据。
![](https://i-blog.csdnimg.cn/blog_migrate/ec4fddf3537ac170744a77c24f801717.png)
图 Bilibili 视频评论数据接口
后台计算任务接口:添加一个 BackgroundTask 并在后台执行,比如文本预处理、NMF、t-SNE 等计算任务。
![](https://i-blog.csdnimg.cn/blog_migrate/0651b152753e3911b3b34b9f788ed192.png)
图 文本预处理后台计算任务接口
后台计算任务进度数据接口:获取后台任务的当前计算进度,比如当前迭代次数,中间计算结果等等,返回的进度数据主要用于前端可视化
![](https://i-blog.csdnimg.cn/blog_migrate/edd6bb0cd42b9610933b3d69a16a8700.png)
图 文本预处理任务进度接口
数据可视化接口:获取主题模型训练的相关数据,比如词袋模型、主题详细信息、文档详细信息、降维文档节点坐标等,返回的数据用于前端可视化。
![](https://i-blog.csdnimg.cn/blog_migrate/cd95eebf201eea7d9b5aca6fd4511c61.png)
图 主题详细信息接口
3.3 前端实现过程
3.3.1 框架介绍
在本系统中,我们使用了 React 和 antd(Ant Design of React)库来设计前端:
React 是一个用于构建用户界面的 JavaScript 库,它使创建交互式 UI 变得轻而易举。设计者可以为应用的每一个状态设计简洁的视图,当数据改变时 React 能有效地更新并正确地渲染组件。使用 React 可以创建拥有各自状态的组件,再由这些组件构成更加复杂的 UI。组件逻辑使用 JavaScript 编写而非模版,因此设计者可以轻松地在应用中传递数据,并使得状态与 DOM 分离。
antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。它具有以下特性:
提炼自企业级中后台产品的交互语言和视觉风格。
开箱即用的高质量 React 组件。
使用 TypeScript 开发,提供完整的类型定义文件。
全链路开发和设计工具体系。
数十个国际化语言支持。
深入每个细节的主题定制能力。
3.3.2 介绍界面
此界面是一个简单的主页,作用是来向用户介绍各个语料库的详细信息,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/3aa00b0993c29bf42bf047215a54d9bd.png)
图 介绍界面
3.3.3 Bilibili 视频评论爬虫界面
此界面主要用于抓取 Bilibili 视频评论数据,用户可以在右侧的 Bilibili 内嵌网页中复制自己感兴趣的视频的链接,然后选择想要爬取的评论页数,接着爬虫工具将自动爬取评论并写入数据库,最终该视频下的所有评论就可以被当作一个语料库来分析了。通过这种方式,使得用于文本分析的语料库数据更加丰富且灵活了,用户随时可以抓取并分析自己感兴趣的语料数据,而不是从固定的数据中来选择。
此界面我们是使用 Streamlit[footnoteRef:6]来完成的,它是一个可以让用户使用纯 Python 来构建 Web 应用的科学工具包。爬虫功能模块本身是作为后端的一部分、使用 Python 来编写的,但是因为爬虫的过程本身就需要发送大量的网络请求,且花费的时间比较长,所以如果使用前端展示界面、并与后端交互的方式来实现的话,就比较麻烦且冗余了。虽然 Streamlit 的宗旨是让数据科学家和机器学习工程师能够在短短几个小时内创建高效的应用程序,但是用来创建一个简单的交互式页面也是非常适合的。
![](https://i-blog.csdnimg.cn/blog_migrate/a731b835320552a8f0acb59b62b73932.png)
图 在内嵌网页中复制自己感兴趣的视频的链接
![](https://i-blog.csdnimg.cn/blog_migrate/deb01a2c28525bf02a993c9e34323403.png)
图 选择抓取评论的页数,爬虫工具将自动抓取评论并写入数据库
3.3.4 语料库查看/选择界面
在此界面中,用户可以详细地查看语料库中的文档数据,并勾选自己感兴趣的语料库来作为分析对象。以 Bilibili 视频评论语料库为例,操作界面如下若干图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/6d298c5ccc1d9773e33a48d50e8189dd.png)
图 查看已爬取评论数据的视频,并选择一个作为待分析的语料库对象
![](https://i-blog.csdnimg.cn/blog_migrate/792a8e0c6d5ceb51b1bcade7433eaa16.png)
图 查看详细评论数据
3.3.5 侧边栏主控制界面
在训练模块中,我们将控制功能放在一个可收起/展开的侧边栏中,来控制文本预处理、NMF 训练、UMAP 降维等算法的运行/停止、相应参数的调节。
3.3.6 右侧训练状态 Tab
这个界面展示了实时的训练状态,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/88e6074ebfd3c4184d5c22c39d3ffade.png)
图 训练状态 Tab
3.3.7 词云图 Tab
这个界面会将文本预处理后的词频矩阵来可视化为一个词云图,词频越高,绘制出的词越大。用户可以通过词云图来粗略地分析一下语料库中的热词、主要话题。
![](https://i-blog.csdnimg.cn/blog_migrate/0efc5cb789be832cd09a54d7dda7c6d6.png)
图 词云图 Tab
3.3.8 NMF 迭代误差折线图 Tab
在 NMF 计算的过程中,此界面会绘制一个折线图,来实时地将 NMF 每一次的迭代误差值绘制出来,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/8a1f09fc4737a8dc3fdd92bf6077f375.png)
图 NMF 迭代误差折线图
3.3.9 主题聚类可视化 Tab
当 NMF 训练完成后,系统就会自动进行 UMAP 降维算法。当降维完成后,此界面会将结果中的文档节点坐标绘制在 3D 集群图中,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/9a9874e1b28075db93b6af5a70716912.png)
图 3D 主题模型集群图
在此 3D 散点图中,我们提供了多种交互方式:
旋转、缩放视图。
将鼠标停留在某个文档节点上可查看其内容。
通过单击右侧的主题摘要 label 可以显示/隐藏某个主题集群。
通过双击右侧的主题摘要 labe 可以隐藏除这个主题集群以外的所有其他主题集群,再次双击可以恢复。
![](https://i-blog.csdnimg.cn/blog_migrate/62f014fb8a47c43ce76eb495fec048ce.png)
图 只显示主题集群 4,查看其中的一个文档节点
3.3.10 文档详细信息抽屉
在 3D 散点图中,当用户点击自己感兴趣的文档节点后,就会从右侧弹出一个抽屉,来显示此文档的详细信息,包括文档内容、文档词频统计和文档主题分布,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/d896e3560e516a8d94c2fd1d8798ecd2.png)
图 文档详细信息抽屉
3.3.11 主题详细信息抽屉
在 3D 散点图的左侧有一个主题选择下拉框,当用户选择自己感兴趣的主题后,就会从右侧弹出一个抽屉,来显示此主题的详细信息,包括主题词项分布和主题硬聚类文档相关度,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/20e0d49c0ef0a9b7995e477b308d7449.png)
图 主题详细信息抽屉
3.3.12 用户交互
本系统中提供了 5 种不同的用户交互类型,当用户选择不同的交互类型时,文档和主题详细信息抽屉、用户交互 Tab 会显示不同的界面,每种用户交互类型的详细介绍如下:
主题关键词优化:用户可以在主题详细信息抽屉中点击[对此主题进行关键词优化]按钮,界面就会自动跳转到用户交互 Tab,在此界面中,用户可以详细调整每个关键词的权重及监督强度,然后就可以通过以上交互信息来进行 SS-NMF、优化该主题了,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/d46382252ef5cee62992bd0ff52cdf6c.png)
图 对主题进行关键词优化
![](https://i-blog.csdnimg.cn/blog_migrate/65bfe80a739b48d0ad0eaea8ba4fb627.png)
图 对主题关键词权重作出调整,并选择监督强度
主题拆分:用户可以在主题详细信息抽屉中点击[对此主题进行拆分]按钮,界面就会自动跳转到用户交互 Tab,在此界面中,拆分后的 2 个新主题的关键词权重被初始化为和被拆分主题一样,然后用户就可以在此基础上详细调整每个主题的关键词权重及监督强度,然后就可以通过以上交互信息来进行 SS-NMF、拆分主题了,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/845149fee109718c655536b38a177261.png)
图 对主题进行拆分
![](https://i-blog.csdnimg.cn/blog_migrate/5770c0ae1541ef2a54d59034c56878ab.png)
图 对拆分后新主题的关键词权重作出调整,并选择监督强度
主题合并:用户可以选择 2 个待合并主题,并在主题详细信息抽屉中,对其中一个选中[作为合并主题 1],对另一个选中[作为合并主题 2],接着在用户交互 Tab 中,合并后新主题的关键词权重被初始化为 2 个被合并主题的关键词权重的平均数,然后用户就可以在此基础上详细调整关键词权重及监督强度,然后就可以通过以上交互信息来进行 SS-NMF、合并主题了,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/ac9c95d204ff7bb17e7bdbaff1ed52a4.png)
图 待合并主题 1
![](https://i-blog.csdnimg.cn/blog_migrate/bf05eba5cd6e56aceae8263793872d42.png)
图 待合并主题 2
![](https://i-blog.csdnimg.cn/blog_migrate/63a14fd82663ca67b2a9c85cdfb20d8f.png)
图 对合并新主题的关键词权重作出调整,并选择监督强度
关键词诱导的主题创建:用户可以在主题详细信息抽屉中选择或查找自己感兴趣的关键词,选择完毕后,接着在用户交互 Tab 中,每个关键词的权重被初始化为 1,然后用户就可以在此基础上详细调整每个关键词的权重及监督强度,然后就可以通过以上交互信息来进行 SS-NMF、诱导创建新主题了,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/e4f81e72b92c96e5fff755e64e798605.png)
图 选择或查找感兴趣的关键词
![](https://i-blog.csdnimg.cn/blog_migrate/db37dbc7c065951282ed6b565b622cc6.png)
图 对新主题的关键词权重作出调整,并选择监督强度
文档诱导的主题创建:用户可以选择几个感兴趣的文档,并在文档详细信息抽屉中勾选[作为创建新主题的诱导文档之一],选择完毕后,接着在用户交互 Tab 中,新主题与每个诱导文档的相关度被初始化为 1,然后用户就可以在此基础上详细调整每个主题与每个文档的相关度及监督强度,然后就可以通过以上交互信息来进行 SS-NMF、诱导创建新主题了,如下:
图 勾选感兴趣的文档作为新主题创建的诱导文档之一
![](https://i-blog.csdnimg.cn/blog_migrate/f1dcdd4ee8729007bfedfcdafa465181.png)
图 对新主题的诱导文档相关度作出调整,并选择监督强度
3.3.13 新文档主题分布预测
用户可以通过当前已训练的主题模型来对新文档进行拟合,从而计算出新文档的主题分布,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/445d7f0364cae6601bfbbc36cd225dce.png)
图 预测新文档的主题分布
四、算法定量分析及比较
在本章节中,我们会从性能、收敛速度、多次运行的一致性方面来将 NMF 算法与 LDA 算法进行对比及分析,为了使结果具有可对比性,我们对以上 2 个算法采用了等价的输入参数:
语料库:Bilibili 视频网站的电影评论
输入矩阵 A 规模:
假设主题数 k:10
最大迭代次数 max_iter:1000
NMF 误差停止阈值 tolerance:1e-4
LDA 困惑度停止阈值 perp_tol:1e-1
评估周期 evaluate_every(每隔几次迭代进行一次停止条件判断):1
4.1 性能及收敛速度
对于以上输入,NMF 花费了 17.4 秒进行了 23 次迭代,而 LDA 花费了 74.2 秒进行了 92 次迭代,NMF 的迭代误差折线图及 LDA 的迭代困惑度折线图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8056dc8938685b30772b2845b3d04e65.png)
图 NMF 迭代误差折线图
图 LDA 迭代困惑度折线图
从以上运行结果可以看出,NMF 与 LDA 相比,平均迭代一次所花费的时间相差不大,但是 NMF 比 LDA 收敛得更快,NMF 差不多在第 15 次迭代时误差就平稳下来了,而 LDA 直到第 40 次迭代时困惑度才趋于稳定。
4.2 多次运行的一致性
在本小节中,我们让 NMF 和 LDA 算法在同样的输入参数上分别运行 2 次,并获取每次运行结果的主题摘要(即与主题相关度最大的前几个单词),来测试算法多此运行的一致性,结果如下:
表 NMF 和 LDA 分别运行 2 次的主题摘要
NMF 第 1 次 | NMF 第 2 次 | LDA 第 1 次 | LDA 第 2 次 | |
主题 1 | 喜欢,诚,新海 | 喜欢,诚,新海 | 呜呜,身份证,名字 | 厘米,每秒,速度 |
主题 2 | 东京,泷,三叶 | 东京,泷,三叶 | 三叶,名字,电影 | 电影,三叶,名字 |
主题 3 | 去年,今天,单身 | 去年,今天,单身 | 厘米,每秒,速度 | 买,之子,天气 |
主题 4 | 站,这部,电影 | 站,这部,电影 | 年,今年,单身 | 名字,茂,宫本 |
主题 5 | 日,月,年 | 日,月,年 | 超级,迷茫,烟花 | 点,钉,分 |
主题 6 | 站,刷,弹幕 | 站,刷,弹幕 | 买,之子,天气 | 智商,弹幕,关 |
主题 7 | 一个,哭,现在 | 一个,哭,现在 | 江户,太,好看 | 小女孩,真快,过得 |
主题 8 | 厘米,每秒,速度 | 厘米,每秒,速度 | 名字,茂,宫本 | 名字,号码,身份证 |
主题 9 | 买,之子,天气 | 买,之子,天气 | 大三,钉,女 | 次,好看,太 |
主题 10 | 茂,宫本,名字 | 茂,宫本,名字 | 说,分手,名字 | 名字,云南,三刷 |
从以上结果可以看出,在 NMF 的情况下,主题摘要显示完全相同,但 LDA 似乎有部分主题的位置发生了变化,例如第 1 次运行结果中的主题 3 在第 2 次运行结果中变成主题 1 了,而且有部分主题在 2 次运行结果中的差异非常大,例如主题 4 第 1 次的主题摘要是(“年”,“今年”,“单身”),而第 2 次是(“名字”,“茂”,“宫本”)。
这些实验结果意味着当 LDA 应用于可视化分析领域时需要考虑的重要实际问题,因为用户不能保证他们当前运行得到的 LDA 结果是最适合他们分析的结果。例如,一个 LDA 结果可能无法显示某个感兴趣的特定主题,而其他一些结果则可以。为了解决这个问题,用户可以多次运行 LDA,看看是否会出现任何有趣的差异,但是这个过程可能会变得非常耗时,因为 LDA 的运行时间非常长,而且还需要比较不同 LDA 的结果。
同时,LDA 算法的这种随机性本质上使用户无法控制算法过程。具体而言,假设用户从特定的运行中获得了一个 LDA 结果,但是他/她希望通过稍微修改 LDA 算法的初始规范(例如 LDA 的初始化和参数)来改善结果。但是,由于基于采样的 LDA 算法不仅受到初始规范的影响,而且还受到每次迭代随机生成的样本的影响,因此这种用户干预可能会产生与用户先前完全不同的结果。相反,在大多数确定性算法(例如我们使用的 NMF)中,只要用户确定了初始规范,结果就可以被复制,因此用户可以在运行算法时隔离和控制其干预的效果。
五、使用案例
在本节中,我们将展示几种使用场景,这些场景展示了本文中基于 SS-NMF 的交互式主题模型可视化分析系统的若干功能,以及以用户驱动的方式来改善主题模型的结果。
5.1 Bilibili 视频评论数据
在本小节中,我们以 Bilibili 网站的生活 > 美食分区下的的视频评论作为分析对象。首先,我们将主题数设置为 5,运行初次 NMF 训练,结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2d1bfb0c3cb2f3634ca3584ce3d838df.png)
图 初次训练结果
从结果中的主题摘要可以看出,主题 0 和主题 1 有些许相似,而且在 3D 散点图中相应的主题集群也靠的比较近,所以我们决定对其进行进一步的分析,分别查看主题 0 和 1 的详细信息,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/97a8e851bf721e56f4dee3834fe4b3e2.png)
图 主题 0 详细信息
![](https://i-blog.csdnimg.cn/blog_migrate/a7a4b55cbc6d72c377444e2c249475ea.png)
图 主题 1 详细信息
从以上分析可以看出,主题 0 和主题 1 确实比较相似,且主题下的文档主要是围绕着“盗月社”、“视频”、“温暖”、“喜欢”这几个关键词来展开的。所以,我们决定对主题 0 和 1 进行合并,并对其关键词权重进行调整,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/bd1eedaffd386392057bfe077c387972.png)
图 合并后新主题的关键词权重
调整完成后,我们将监督强度设置为 5,并运行 SS-NMF 训练,新的结果如下:
图 进行主题合并后的训练结果
![](https://i-blog.csdnimg.cn/blog_migrate/ea5151a66a4bda1773b8706c38a97a0e.png)
图 合并后新主题的详细信息
接下来我们将注意力集中到主题 3 上,它是这 4 个主题集群中规模最大的,主要的关键词是“菜市场”、“吃”、“想”、“上海”、“好吃”,我们想要将其拆分为 2 个主题,其中一个主要关于“菜市场”、“回忆”,另一个主要关于“上海”、“好吃”、“地方”,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/520769266a62207eee5f0e46057f6251.png)
图 调整拆分后新主题 3 和 4 的关键词权重
调整完成后,我们将监督强度都设置为 5,并运行 SS-NMF 训练,新的结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/413b6ce6637cb15b74c7db898a105a83.png)
图 主题拆分后的训练结果
图 拆分后新主题 3 的详细信息
![](https://i-blog.csdnimg.cn/blog_migrate/70bbda34790d681d0a959f6325041b40.png)
图 拆分后新主题 4 的详细信息
5.2 外卖用户评价数据
在本小节中,我们以饿了么、美团外卖平台上的用户评价数据作为分析对象。首先,我们将主题数设置为 10,运行初次 NMF 训练,结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/9f1a506bc4a821fe0fa06f4af7f8e54d.png)
图 初次训练结果
我们注意到主题 5 主要是关于外卖难吃的,也就是说这个主题集群很可能包含对产品的负面评价,但是像“吃”这样的关键词在此数据集中并没有多大意义,所以我们对其进行关键词优化,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/91546df5f3c89fd1104cf56887e6d0f7.png)
图 调整主题 5 的关键词权重
调整完成后,我们将监督强度设置为 5,并运行 SS-NMF 训练,新的结果如下:
图 关键词优化后的训练结果
![](https://i-blog.csdnimg.cn/blog_migrate/03a9489a6afd3ab6a2854931c52f4326.png)
图 关键词优化后主题 5 的详细信息
现在,我们想看看是否有任何与外卖包装有关的问题,因此我们使用“包装”、“漏”、“破”等关键词来诱导创建新主题,如下:
图 关键词诱导创建新主题
调整完成后,我们将监督强度设置为 5,并运行 SS-NMF 训练,新的结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/4d546b18cb87ce9edde1e3928d489f00.png)
图 关键词诱导后的训练结果
![](https://i-blog.csdnimg.cn/blog_migrate/3ab7a95d682c56ec998967d6a28d6d92.png)
图 关键词诱导创建的新主题的详细信息
5.3 新冠病毒新闻数据
在本小节中,我们以有关 2020 年新冠病毒 COVID-19 的 CBC 新闻报道作为分析对象,首先,我们将主题数设置为 10,运行初次 NMF 训练,结果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/c76b88d6a0e8b62926935acf20bae770.png)
图 初次训练结果
我们发现主题 5 中出现了“china”一词,于是对该主题下的文档进行分析,发现了其中一篇主要关于湖北、武汉的新闻文档:
![](https://i-blog.csdnimg.cn/blog_migrate/909f3ad88afa296da738fa9019585eb4.png)
图 一篇关于湖北武汉的新闻报道
我们现在想要看一看有关湖北武汉的新闻报道,于是使用这个文档进行了文档诱导的主题创建,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2c6ce3fdcbe4cab8fbb9e517f014038a.png)
图 文档诱导创建新主题
![](https://i-blog.csdnimg.cn/blog_migrate/6ffd1c0ca867a69adca980b7b4f1460c.png)
图 文档诱导后的训练结果
在文档诱导产生的新主题 10 中,我们发现了若干篇与武汉相关的新闻报道,其中几篇的部分片段如下:
![](https://i-blog.csdnimg.cn/blog_migrate/b5332e4a3cb2a92ec14c948aa34d6501.png)
图 文档 746
![](https://i-blog.csdnimg.cn/blog_migrate/3ce44b962739520ce5904830aa4b855d.png)
图 文档 3299
![](https://i-blog.csdnimg.cn/blog_migrate/405d27e9d63de59b8b001882eaa6c7d6.png)
图 文档 818
六、总结及展望
主题模型是机器学习的新兴领域,有着广泛的应用场景,且还有很多新方向亟待探索。在本文中,我们提出了一个基于 NMF 的交互式主题建模可视化分析系统。与广泛使用的主题建模方法 LDA 相比,NMF 从多次运行的一致性和早期的经验收敛性等方面具有很多实际的优势。此外,基于半监督公式的 NMF 能够以直观的方式将用户输入整合进来。通过实现半监督 NMF,我们提供了 5 种有用的交互功能:主题关键词优化、主题合并、主题拆分、文档诱导的主题创建和关键词诱导的主题创建。其次,我们介绍了本系统的几个关键优势,如改进的 UMAP 算法,NMF 和 UMAP 的可视化,以支持各种用户交互。最后,我们通过在几个数据集中灵活地应用所支持的交互,展示了本系统的能力。
当然,本系统还有很多值得改进和研究的方向,比如让用户可以导入自定义语料库,并对其进行筛选、文本清理等功能;在处理大型语料库时,可以考虑将 NMF 的中间输出可视化给用户,这样可以实时地进行用户交互,而不是要等到迭代完成后才进行;丰富主题的摘要功能,而不是简单的关键词摘要,这些功能可以显示语义上有意义的短语或代表性的句子,这将使用户对结果主题有更全面的理解;考虑在并行化的分布式 NMF 算法的基础上,改进本系统处理大规模数据的性能。
完整代码:https://download.csdn.net/download/qq_38735017/87427066