当前位置: 首页 > news >正文

【自然语言处理】Topic Coherence You Need to Know(主题连贯度详解)

Topic Coherence You Need to Know

皮皮,京哥皮皮,京哥皮皮,京哥CommunicationUniversityofChinaCommunication\ University\ of\ ChinaCommunication University of China

在大多数关于主题建模的文章中,常用主题连贯度(Topic Coherence,主题一致性)或主题连贯度指标(Topic Coherence Metrics)来表示整体主题的可解释性,用于评估主题的质量。

但是,该指标到底指什么?它是如何衡量主题的可解释性的?该值是否越大越好?本文将就这些问题做出解答。

1.主题建模

主题建模将文本数据集分解为主题和单词这两个分布来进行解释。一般基于以下假设:

  • 一个文档由几个主题组成
  • 一个主题由一组单词组成

因此,可以将主题建模算法理解为一种数学上的统计模型,用于推断哪些主题更能代表数据。

简单来说,主题可以被描述为单词的集合,例如 [ball, cat, house] 和 [airplane, clouds]。但实际上,算法要做的是为我们词汇表中的每个单词分配一个给定主题的参与值。具有高参与值的单词可以被视为该主题的代表。

在这里插入图片描述

2.评估主题

主题建模算法基于数学和统计学。但站在人的视角,数学上最优的主题并不一定是最好的主题。

例如,根据主题建模算法得到以下两个主题:

  • Topic 1catdoghometoy(可能是个好的主题)
  • Topic 2supernursebrick(可能是个比较糟的主题)

从人的视角来看,第一个主题要比第二个主题更连贯,但对于算法而言,它们可能拥有相同的指标。

构建的主题应该是易于理解的。因此,盲目地遵循主题模型算法背后的数学原理可能会误导我们,并生成无意义的主题。

正因如此,主题评估工作通常需要人工参与,例如阅读每个主题中最重要的单词,查看与每个文档相关的主题。但是,对于具有数千个主题的大规模数据集,此任务可能非常耗时且不切实际。它还需要有关数据集领域的先验知识,并且可能需要专家意见。

主题连贯度试图以 独特、客观且易于评估的数字 来代表对主题的 高质量人类感知

3.如何计算主题连贯性

通常,连贯性指的是 合作特征。如果一组论点相互印证,我们可以认为它们是连贯的。

此处,主题连贯性指的是文本集(称为参考语料库,reference corpus支持 主题的程度。它从参考语料中提取统计数据和概率,并特别关注单词的上下文,计算主题连贯性分数。这也说明主题连贯性度量不仅取决于主题本身,还取决于参考语料。

在这里插入图片描述
Röder, M. 等人在论文《Exploring the Space of Topic Coherence Measures》中提出了主题连贯性度量的一般结构如下:

在这里插入图片描述
该结构由不同的独立模块组合而成,每个模块都执行特定的任务。

可以把计算主题连贯性度量看做是一个管道(Pipeline),它接收主题和参考语料作为输入,并输出一个代表 整体主题连贯性 的值。该过程模拟了人类对主题进行评估。

3.1 Segmentation

该模块负责创建用来评估主题连贯性的单词子集。

假设 WWW 包含了主题 ttt 的前 nnn 个最重要的单词 {w1,w2,…,wn}\{w_1, w_2, …, w_n\}{w1,w2,,wn},对 WWW 的进行分割,得到子集对 SSS

在这里插入图片描述
W∗W^*W 用于对 W′W^{'}W 进行确认。下一小节将会结合实例对此进行介绍。简单来说,分割可以理解为如何 混合 主题中的单词,以进行后面的评估步骤。

例如,S-one-one 表示对不同的词进行配对。此种模式下,模型对主题中任意两个词之间的关系感兴趣。所以,若 WWW{‘cat’,‘dog’,‘toy’}\{‘cat’, ‘dog’, ‘toy’\}{cat,dog,toy},则有:

在这里插入图片描述
S-one-all 则表示将每个词与其他所有词配对。此种模式下,连贯性分数将基于单个词与主题中其余词之间的关系。应用于 WWW,则有:

在这里插入图片描述

3.2 Probability Calculation

例如,假设我们对两种不同的概率感兴趣:

  • P(w)P(w)P(w):词 www 出现的概率
  • P(w1andw2)P(w1\ and\ w2)P(w1 and w2):词 w1w1w1w2w2w2 出现的概率

针对这些概率有不同的计算方法,例如:

  • PbdPbdPbdbdbdbd 代表 boolean document):P(w)P(w)P(w) 表示包含单词 www 的文档数除以文档总数,P(w1andw2)P(w1\ and\ w2)P(w1 and w2) 表示包含单词 w1w1w1w2w2w2 的文档数除以文档总数。
  • PbsPbsPbsbsbsbs 代表 boolean sentence),该方法与 PbdPbdPbd 方法类似,但它考虑的是单词在句子中的出现次数,而不是文档中的出现次数。
  • PswPswPswswswsw 代表 sliding window),它考虑的是单词在文本滑动窗口中出现的次数。

3.3 Confirmation Measure

该步骤是计算主题连贯性的核心。用从 PPP 中得到的概率在 SSS 上计算确认度量,即用从语料库计算的概率来量化两个子集之间的 关系

此步骤会计算 W∗W^{*}WW′W^{'}W 的支持程度。因此,如果 W′W^{'}W 中的词与 W∗W^{*}W 中的词相关联(例如,经常出现在同一文档中),则确认度会很高。

在这里插入图片描述
上图中,确认度量 mmm 应用于每一个子集对,并输出确认分数。有两种不同类型的确认措施:

  • 直接确认措施:这些度量通过直接使用子集 W′W^{'}WW∗W^{*}W 以及概率来计算确认值。例如:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 间接确认措施:间接确认措施不会直接根据 W′W^{'}WW∗W^{*}W 计算分数。它们计算 W′W^{'}W 中的单词和 WWW 中所有其他单词的直接确认度量 mmm,构建了一个度量向量,如下图所示。再对 W∗W^{*}W 进行相同的处理。最后以这两个向量之间的相似性(例如,余弦相似性)作为最后的确认度量结果。

在这里插入图片描述
在这里插入图片描述
例如,为了计算 (‘cat’,‘dog’)(‘cat’,‘dog’)(catdog) 的确认度量,首先计算每个元素和主题中所有单词的确认度量 mmm ,创建一个确认度量向量。然后,最终的确认措施是这两个向量之间的相似性。

在这里插入图片描述
该过程表明了直接方法的一些缺点。例如,catdog 这两个词可能永远不会在我们的数据集中出现,但它们可能经常与 toypetscute 这些词一起出现。使用直接方法,这两个词的确认分数较低,但使用间接方法,相似性可能会很突出,因为它们出现在相似的上下文中。

3.4 Aggregation

此处会将上一步计算的所有值聚合成一个值,即最终的主题连贯性分数。聚合方法可以是 算术平均数、中位数、几何平均数 等。

在这里插入图片描述

3.5 小结

回顾一下上述步骤。

  • 有一个待评估的主题
  • 选择一个参考语料库
  • 找到主题中最重要的前 nnn 个词,记为 WWW
  • WWW 分割成子集对 SSS
  • 利用参考语料库,使用技术 PPP 计算单词概率
  • 使用确认度量 mmm 来评估每个子集对之间的关系
  • 汇总得到一个最终数字,即主题连贯性得分

在这里插入图片描述
在多个主题的情况下,最终结果是单个主题连贯性的平均值。
在这里插入图片描述

4.Gensim中的模型

Gensim 提供了四种计算主题连贯性的方法:u_massc_vc_ucic_npmi

在这里插入图片描述

在原论文中,作者已经详细说明了这些模型是如何构建的。

在这里插入图片描述
C_NPMI 为例:

  • Segmentation:采用 S-one-one 的方法,即在成对的词上计算确认度。
  • Probability Calculation:使用方法 Psw(10)Psw(10)Psw(10)。滑动窗口的大小为 101010
  • Confirmation Measure:确认措施是归一化逐点互信息(NPMI)。

在这里插入图片描述

  • Aggregation:利用算术平均值进行聚合。

C_V 方法同理:

  • Segmentation:采用 S-one-set 的方法,即确认度量将在一个词和集合 WWW 的对上计算。
  • Probability Calculation:使用方法 Psw(110)Psw(110)Psw(110)。滑动窗口大小为 110110110
  • Confirmation Measure:该步使用间接确认措施。使用度量 mnlrm_{nlr}mnlr,将每对元素的单词与 WWW 的所有其他单词进行比较。最终得分是两个度量向量之间的余弦相似度。
  • Aggregation:利用算术平均值进行聚合。

5.实践

import pandas as pd
import reimport matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_20newsgroupsfrom gensim.models.coherencemodel import CoherenceModel
from gensim.corpora.dictionary import Dictionary
texts, _ = fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'), return_X_y=True )
tokenizer = lambda s: re.findall('\w+', s.lower() )
texts = [tokenizer(t) for t in  texts]

在 Gensim 中计算 Coherence 非常简单,只需要创建一组主题并传递文本即可。

# Creating some random topics
topics = [ ['space', 'planet', 'mars', 'galaxy'],['cold', 'medicine', 'doctor', 'health', 'water'],['cats', 'health', 'keyboard', 'car', 'banana'],['windows', 'mac', 'computer', 'operating', 'system'] ]# Creating a dictionary with the vocabulary
word2id = Dictionary(texts)# Coherence model
cm = CoherenceModel(topics=topics, texts=texts,coherence='c_v',  dictionary=word2id)coherence_per_topic = cm.get_coherence_per_topic()

.get_coherence_per_topic() 方法返回每个主题的连贯性值。

topics_str = ['\n '.join(t) for t in topics]
data_topic_score = pd.DataFrame(data=zip(topics_str, coherence_per_topic), columns=['Topic', 'Coherence'])
data_topic_score = data_topic_score.set_index('Topic')fig, ax = plt.subplots(figsize=(2,6))
ax.set_title("Topics coherence\n $C_v$")
sns.heatmap(data=data_topic_score, annot=True, square=True,cmap='Reds', fmt='.2f',linecolor='black', ax=ax )
plt.yticks(rotation=0)
ax.set_xlabel('')
ax.set_ylabel('')
fig.show()

在这里插入图片描述

6.总结

主题连贯性是衡量一个主题质量的重要标准。本文中,我们深入探讨了主题连贯性的基本结构和数学原理。通过 SegmentationProbability CalculationConfirmation MeasureAggregation 等步骤计算主题连贯性。并通过代码实例了解了如何在 Gensim 中计算主题连贯性。

http://www.lryc.cn/news/20507.html

相关文章:

  • C++入门:模板
  • 【MySQL】索引常见面试题
  • 【Web逆向】万方数据平台正文的逆向分析(上篇--加密发送请求)—— 逆向protobuf
  • Amazon S3 服务15岁生日快乐!
  • 【python】函数详解
  • AoP-@Aspect注解处理源码解析
  • 宝塔搭建实战php悟空CRM前后端分离源码-vue前端篇(二)
  • FastASR+FFmpeg(音视频开发+语音识别)
  • 二分查找的实现代码JAVA
  • cesium: 设置skybox透明并添加背景图 ( 003 )
  • 【python】类的详解
  • 西安银行就业总结
  • JavaScript Window
  • 那些开发过程中需要遵守的开发规范
  • EFCore 基础入门教程
  • HTML5 Drag and Drop
  • 惠普m1136打印机驱动程序安装教程
  • 数据增强,扩充了数据集,增加了模型的泛化能力
  • MySQL/Oracle获取当前时间几天/分钟前的时间
  • 如何在Wordpress中使用wp_nav_menu()在<li>及a标记中添加Class
  • Chat Support Board WordPress聊天插件 v3.5.8
  • 2022年网络安全竞赛——数字取证调查attack.pcapng
  • 2023最新MongoDB规范
  • gcc的使用,调试工具gdb的使用
  • Python变量的定义和使用
  • SSM框架-AOP概述、Spring事务
  • 一文搞定Android Vsync原理简析
  • 第八届蓝桥杯省赛 C++ B组 - K 倍区间
  • UDP与TCP协议
  • rosbag相关使用工具