本文是一篇关于主题建模及其相关技术的综述。文中介绍了四种最流行的技术,用于探讨主题建模,它们分别是:LSA、pLSA、LDA,以及最新的、基于深度学习的 lda2vec。
在自然语言理解任务中,我们可以通过一系列的层次来提取含义——从单词、句子、段落,再到文档。在文档层面,理解文本最有效的方式之一就是分析其主题。在文档集合中学习、识别和提取这些主题的过程被称为主题建模。
在本文中,我们将通过 4 种最流行的技术来探讨主题建模,它们分别是:LSA、pLSA、LDA,以及最新的、基于深度学习的 lda2vec。
概述
所有主题模型都基于相同的基本假设:
-
每个文档包含多个主题;
-
每个主题包含多个单词。
换句话说,主题模型围绕着以下观点构建:实际上,文档的语义由一些我们所忽视的隐变量或「潜」变量管理。因此,主题建模的目标就是揭示这些潜在变量——也就是主题,正是它们塑造了我们文档和语料库的含义。这篇博文将继续深入不同种类的主题模型,试图建立起读者对不同主题模型如何揭示这些潜在主题的认知。
LSA
潜在语义分析(LSA)是主题建模的基础技术之一。其核心思想是把我们所拥有的文档-术语矩阵分解成相互独立的文档-主题矩阵和主题-术语矩阵。
第一步是生成文档-术语矩阵。如果在词汇表中给出 m 个文档和 n 个单词,我们可以构造一个 m×n 的矩阵 A,其中每行代表一个文档,每列代表一个单词。在 LSA 的最简单版本中,每一个条目可以简单地是第 j 个单词在第 i 个文档中出现次数的原始计数。然而,在实际操作中,原始计数的效果不是很好,因为它们无法考虑文档中每个词的权重。例如,比起「test」来说,「nuclear」这个单词也许更能指出给定文章的主题。
因此,LSA 模型通常用 tf-idf 得分代替文档-术语矩阵中的原始计数。tf-idf,即词频-逆文本频率指数,为文档 i 中的术语 j 分配了相应的权重,如下所示:
直观地说,术语出现在文档中的频率越高,则其权重越大;同时,术语在语料库中出现的频率越低,其权重越大。
一旦拥有文档-术语矩阵 A,我们就可以开始思考潜在主题。问题在于:A 极有可能非常稀疏、噪声很大,并且在很多维度上非常冗余。因此,为了找出能够捕捉单词和文档关系的少数潜在主题,我们希望能降低矩阵 A 的维度。
这种降维可以使用截断 SVD 来执行。SVD,即奇异值分解,是线性代数中的一种技术。该技术将任意矩阵 M 分解为三个独立矩阵的乘积:M=U*S*V,其中 S 是矩阵 M 奇异值的对角矩阵。很大程度上,截断 SVD 的降维方式是:选择奇异值中最大的 t 个数,且只保留矩阵 U 和 V 的前 t 列。在这种情况下,t 是一个超参数,我们可以根据想要查找的主题数量进行选择和调整。
直观来说,截断 SVD 可以看作只保留我们变换空间中最重要的 t 维。
在这种情况下,U∈ℝ^(m⨉t)是我们的文档-主题矩阵,而 V∈ℝ^(n⨉t)则成为我们的术语-主题矩阵。在矩阵 U 和 V 中,每一列对应于我们 t 个主题当中的一个。在 U 中,行表示按主题表达的文档向量;在 V 中,行代表按主题表达的术语向量。
通过这些文档向量和术语向量,现在我们可以轻松应用余弦相似度等度量来评估以下指标:
-
不同文档的相似度
-
不同单词的相似度
-
术语(或「queries」)与文档的相似度(当我们想要检索与查询最相关的段落,即进行信息检索时,这一点将非常有用)
代码实现
在 sklearn 中,LSA 的简单实现可能如下所示:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.pipeline import Pipeline
documents = ["doc1.txt", "doc2.txt", "doc3.txt"]
# raw documents to tf-idf matrix:
vectorizer = TfidfVectorizer(stop_words='english',
use_idf=True,
smooth_idf=True)
# SVD to reduce dimensionality:
svd_model = TruncatedSVD(n_components=100, // num dimensions
algorithm='randomized',
n_iter=10)
# pipeline of tf-idf + SVD, fit to and applied to documents:
svd_transformer = Pipeline([('tfidf', vectorizer),
('svd', svd_model)])
svd_matrix = svd_transformer.fit_transform(documents)
# svd_matrix can later be used to compare documents, compare words, or compare queries with documents
LSA 方法快速且高效,但它也有一些主要缺点:
-
缺乏可解释的嵌入(我们并不知道主题是什么,其成分可能积极或消极,这一点是随机的)
-
需要大量的文件和词汇来获得准确的结果
-
表征效率低
PLSA
pLSA,即概率潜在语义分析,采取概率方法替代 SVD 以解决问题。其核心思想是找到一个潜在主题的概率模型,该模型可以生成我们在文档-术语矩阵中观察到的数据。特别是,我们需要一个模型 P(D,W),使得对于任何文档 d 和单词 w,P(d,w) 能对应于文档-术语矩阵中的那个条目。
让我们回想主题模型的基本假设:每个文档由多个主题组成,每个主题由多个单词组成。pLSA 为这些假设增加了概率自旋:
-
给定文档 d,主题 z 以 P(z|d) 的概率出现在该文档中
-
给定主题 z,单词 w 以 P(w|z) 的概率从主题 z 中提取出来
从形式上看,一个给定的文档和单词同时出现的联合概率是:
直观来说,等式右边告诉我们理解某个文档的可能性有多大;然后,根据该文档主题的分布情况,在该文档中找到某个单词的可能性有多大。
在这种情况下,P(D)、P(Z|D)、和 P(W|Z) 是我们模型的参数。P(D) 可以直接由我们的语料库确定。P(Z|D) 和 P(W|Z) 利用了多项式分布建模,并且可以使用期望最大化算法(EM)进行训练。EM 无需进行算法的完整数学处理,而是一种基于未观测潜变量(此处指主题)的模型找到最可能的参数估值的方法。
有趣的是,P(D,W) 可以利用不同的的 3 个参数等效地参数化:
可以通过将模型看作一个生成过程来理解这种等价性。在第一个参数化过程中,我们从概率为 P(d) 的文档开始,然后用 P(z|d) 生成主题,最后用 P(w|z) 生成单词。而在上述这个参数化过程中,我们从 P(z) 开始,再用 P(d|z) 和 P(w|z) 单独生成文档。
这个新参数化方法非常有趣,因为我们可以发现 pLSA 模型和 LSA 模型之间存在一个直接的平行对应关系:
其中,主题 P(Z) 的概率对应于奇异主题概率的对角矩阵,给定主题 P(D|Z) 的文档概率对应于文档-主题矩阵 U,给定主题 P(W|Z) 的单词概率对应于术语-主题矩阵 V。
那么,这说明了什么?尽管 pLSA 看起来与 LSA 差异很大、且处理问题的方法完全不同,但实际上 pLSA 只是在 LSA 的基础上添加了对主题和词汇的概率处理罢了。pLSA 是一个更加灵活的模型,但仍然存在一些问题,尤其表现为:
-
因为我们没有参数来给 P(D) 建模,所以不知道如何为新文档分配概率
-
pLSA 的参数数量随着我们拥有的文档数线性增长,因此容易出现过度拟合问题
我们将不会考虑任何 pLSA 的代码,因为很少会单独使用 pLSA。一般来说,当人们在寻找超出 LSA 基准性能的主题模型时,他们会转而使用 LDA 模型。LDA 是最常见的主题模型,它在 pLSA 的基础上进行了扩展,从而解决这些问题。
LDA
LDA 即潜在狄利克雷分布,是 pLSA 的贝叶斯版本。它使用狄利克雷先验来处理文档-主题和单词-主题分布,从而有助于更好地泛化。
我不打算深入讲解狄利克雷分布,不过,我们可以对其做一个简短的概述:即,将狄利克雷视为「分布的分布」。本质上,它回答了这样一个问题:「给定某种分布,我看到的实际概率分布可能是什么样子?」
考虑比较主题混合概率分布的相关例子。假设我们正在查看的语料库有着来自 3 个完全不同主题领域的文档。如果我们想对其进行建模,我们想要的分布类型将有着这样的特征:它在其中一个主题上有着极高的权重,而在其他的主题上权重不大。如果我们有 3 个主题,那么我们看到的一些具体概率分布可能会是:
-
混合 X:90% 主题 A,5% 主题 B,5% 主题 C
-
混合 Y:5% 主题 A,90% 主题 B,5% 主题 C
-
混合 Z:5% 主题 A,5% 主题 B,90% 主题 C
如果从这个狄利克雷分布中绘制一个随机概率分布,并对单个主题上的较大权重进行参数化,我们可能会得到一个与混合 X、Y 或 Z 非常相似的分布。我们不太可能会抽样得到这样一个分布:33%的主题 A,33%的主题 B 和 33%的主题 C。
本质上,这就是狄利克雷分布所提供的:一种特定类型的抽样概率分布法。我们可以回顾一下 pLSA 的模型:
在 pLSA 中,我们对文档进行抽样,然后根据该文档抽样主题,再根据该主题抽样一个单词。以下是 LDA 的模型:
根据狄利克雷分布 Dir(α),我们绘制一个随机样本来表示特定文档的主题分布或主题混合。这个主题分布记为θ。我们可以基于分布从θ选择一个特定的主题 Z。
接下来,从另一个狄利克雷分布 Dir(𝛽),我们选择一个随机样本来表示主题 Z 的单词分布。这个单词分布记为φ。从φ中,我们选择单词 w。
从形式上看,从文档生成每个单词的过程如下(注意,该算法使用 c 而不是 z 来表示主题):
通常而言,LDA 比 pLSA 效果更好,因为它可以轻而易举地泛化到新文档中去。在 pLSA 中,文档概率是数据集中的一个固定点。如果没有看到那个文件,我们就没有那个数据点。然而,在 LDA 中,数据集作为训练数据用于文档-主题分布的狄利克雷分布。即使没有看到某个文件,我们可以很容易地从狄利克雷分布中抽样得来,并继续接下来的操作。
代码实现
LDA 无疑是最受欢迎(且通常来说是最有效的)主题建模技术。它在 gensim 当中可以方便地使用:
from gensim.corpora.Dictionary import load_from_text, doc2bow
from gensim.corpora import MmCorpus
from gensim.models.ldamodel import LdaModel
document = "This is some document..."
# load id->word mapping (the dictionary)
id2word = load_from_text('wiki_en_wordids.txt')
# load corpus iterator
mm = MmCorpus('wiki_en_tfidf.mm')
# extract 100 LDA topics, updating once every 10,000
lda = LdaModel(corpus=mm, id2word=id2word, num_topics=100, update_every=1, chunksize=10000, passes=1)
# use LDA model: transform new doc to bag-of-words, then apply lda
doc_bow = doc2bow(document.split())
doc_lda = lda[doc_bow]
# doc_lda is vector of length num_topics representing weighted presence of each topic in the doc
通过使用 LDA,我们可以从文档语料库中提取人类可解释的主题,其中每个主题都以与之关联度最高的词语作为特征。例如,主题 2 可以用诸如「石油、天然气、钻井、管道、楔石、能量」等术语来表示。此外,在给定一个新文档的条件下,我们可以获得表示其主题混合的向量,例如,5% 的主题 1,70% 的主题 2,10%的主题 3 等。通常来说,这些向量对下游应用非常有用。
深度学习中的 LDA:lda2vec
那么,这些主题模型会将哪些因素纳入更复杂的自然语言处理问题中呢?
在文章的开头,我们谈到能够从每个级别的文本(单词、段落、文档)中提取其含义是多么重要。在文档层面,我们现在知道如何将文本表示为主题的混合。在单词级别上,我们通常使用诸如 word2vec 之类的东西来获取其向量表征。lda2vec 是 word2vec 和 LDA 的扩展,它共同学习单词、文档和主题向量。
以下是其工作原理。
lda2vec 专门在 word2vec 的 skip-gram 模型基础上建模,以生成单词向量。skip-gram 和 word2vec 本质上就是一个神经网络,通过利用输入单词预测周围上下文词语的方法来学习词嵌入。
通过使用 lda2vec,我们不直接用单词向量来预测上下文单词,而是使用上下文向量来进行预测。该上下文向量被创建为两个其它向量的总和:单词向量和文档向量。
单词向量由前面讨论过的 skip-gram word2vec 模型生成。而文档向量更有趣,它实际上是下列两个组件的加权组合:
-
文档权重向量,表示文档中每个主题的「权重」(稍后将转换为百分比)
-
主题矩阵,表示每个主题及其相应向量嵌入
文档向量和单词向量协同起来,为文档中的每个单词生成「上下文」向量。lda2vec 的强大之处在于,它不仅能学习单词的词嵌入(和上下文向量嵌入),还同时学习主题表征和文档表征。
-
博客地址:https://multithreaded.stitchfix.com/blog/2016/05/27/lda2vec/#topic=38&lambda=1&term=
-
代码地址:https://github.com/cemoody/lda2vec
总结
我们常把主题模型当作「有点用处」的黑箱算法。幸运的是,与许多神经网络算法不同,主题模型实际上是可解释的,它可以更直接地进行诊断、调整和评估。希望这篇博文能够解释基础数学知识、内在驱动力和你所需要的直觉。
----------------------------------------
机器之心分析师网络
分析师:王子嘉
编辑: H4O
基于统计学的主题模型诸如 LDA(Latent Dirichlet Allocation),Biterm 的应用使得针对大量文本进行信息的总结提取成为可能。但是提取的主题到底质量如何,如何进行量化分析和评价,仍然没有确定的标准。
同时,随着神经网络的发展,encoding-decoding, GAN 这种非监督模型开始进入到主题模型的应用中来,如何判断这些模型产生的主题有效性就更显得重要了。同时,这些神经网络本身也可以作为评测的方法之一。
本文就主题模型的评价指标进行讨论,对当下比较热门的评价方法进行总结,并对未来这一领域可能的发展方向进行展望。
1 主题模型
宏观上讲,主题模型就是用来在一系列文档中发现抽象主题的一种统计模型,一般来说,这些主题是由一组词表示了。如果一篇文章有一个中心思想,那么一些特定词语会更频繁的出现。比方说,如果一篇文章是在讲狗的,那「狗」和「骨头」等词出现的频率会高些。如果一篇文章是在讲猫的,那「猫」和「鱼」等词出现的频率会高些。而有些词例如「这个」、「和」大概在两篇文章中出现的频率会大致相等。如果一篇文章 10% 和猫有关,90% 和狗有关,那么和狗相关的关键字出现的次数大概会是和猫相关的关键字出现次数的 9 倍。而一个主题模型则会用数学框架来体现文档的这种特点。
如图 1 所示,最左边的就是各个主题(提前确定好的),然后在文中不同的颜色对应不同的主题,比如黄色可能对应狗,那么文中跟狗相关的词都会标成黄色,这样最后就能获得一个各个主题可能的主题分布。
图 1:主题模型(图源:https://medium.com/@tengyuanchang/%E7%9B%B4%E8%A7%80%E7%90%86%E8%A7%A3-lda-latent-dirichlet-allocation-%E8%88%87%E6%96%87%E4%BB%B6%E4%B8%BB%E9%A1%8C%E6%A8%A1%E5%9E%8B-ab4f26c27184)
本文主要是介绍主题模型的量化评价指标,因此不对主题模型做过多解释。如果对主题模型没有什么基础的,可以看一下机器之心发过的一篇比较适合入门的教程,有需要可以自取。同时,除了教程中提到的这些概率模型,一些深度学习模型(GAN, Encoding-Decoding 等)也开始进入这一领域,比如基于 GAN 的 ATM(Adversarial-neural Topic Model)就有不错的表现。
观察上文提到的那些主题模型,可以发现不管是概率模型 LDA,还是基于深度学习模型 ATM,都面临一个问题,那就是这些模型该怎么去评价,这些模型提取出的主题真的有用吗?换句话说,这些模型提取出的东西真的能表达一个主题吗?举个很简单的例子,当主题模型提取出一个主题(很多词)时,如果这么模型是好的,那么这些词一定是能表达同一个主题的,如果不好的话那这些词就是貌合神离。一般来说,主题越多,我们得到的结果就越有分辨性,但是对应的,当主题变多时,结果毫无意义的情况就更加普遍,有些主题只有几个词,而且根本词不对题。除此之外,经过一些专家的实验,发现貌合神离的情况主要有以下四种:
a. 通过词对联系传递后才联系在一起的主题。比如说,「糖」,「甘蔗」和「糖醋排骨」,糖产生自甘蔗(主题可以是「甜食」),糖醋排骨中加了糖(主题可以是「料理」),糖醋排骨跟甘蔗却很难组成一个主题。但是在关系传递中(通过「糖」联系在一起),这三个词被放到了同一个主题中。
b. 异常词。由于算法错误或其他什么原因导致完全不相干的词出现在这个主题中。
c. 关系不明。词之间没有很明确的联系。
d. 不平衡。词之间的联系都很明确,但是词的意义都很宽泛,比如「学科」和「作业」,很难确定一个很明确的主题。
本文剩下的部分首先对两类评价模型进行介绍,然后分析了这些评价模型的效果,最后对评价模型的发展进行了展望。
2 利用模型中的知识评价主题模型
目前评价的方法大部分都利用了一些参数或者是词之间的联系来确定模型的优劣,很少有直接利用模型中获得的东西来衡量主题模型的。Xing [4] 最近提出了几种基于 Gibbs Sampling 过程中估算出的分布进行评价的方式。
2.1 主题稳定性
在 LDA 的 Gibbs Sampling 的过程中会产生(估算)两个分布——一个是给定文档时主题的分布,另一个是给定主题时词的分布 (Φ),而主题稳定性主要考虑的就是第二个分布。
如公式所示,对于一个给定的主题 k,要计算其所有 Gibbs Sampler 提取出的词分布的平均值与各个 Gibbs Sampler 提取的词分布的相似度 (原论文 [4] 中使用了 cosine similarity, Euclidean distance, KL-divergence 以及 Jaccard similarity 来计算这个相似度),取和后就得到了这个主题的主题稳定度。
通过公式可以很清晰的看出,相较于前面的计算方式,主题稳定性并不需要参数和多余的语料库。然而,有些常用词的词频很高,因此出现在主题中时主题的稳定度会很高,但是它们跟主题却并不相关,这也就导致一些很差的主题有很高的主题稳定度。
2.2 主题离散度
在前一节中提到过,Gibbs Sampling 产生了两个分布,主题稳定性使用了第二个分布,也就是通过词的角度来判断主题的优劣。而本节的离散度使用的则是第一个分布,也就是说我们的目光转向了文档这一层次。通常来说,这个的参数是通过对多个 Gibbs Sampler 的结果取平均而得到的。同时,从这些 Gibbs Sampler 的结果中,我们还可以得到他们的标准方差(standard deviation)。但是标准方差太过敏感,于是为了能够获得一个更稳定的结果,我们还可以用平均值除以偏差,以得到变异系数(coefficient of variance,cv)。按常理说,均值和变异系数都可以用来辨别一个主题的好坏,好主题的均值和 cv 应该相对较小,反之则应该较大。在 NYT 语料库的测试中,这三个评判标准的效果如下图所示。
图 2:通过的得到的三种评测结果(图源:https://arxiv.org/abs/1909.03524)
图 2 中,蓝色代表好主题(3.4 分),橘色代表差主题(1 分),可以看到只有 cv 对于两个主题的区分度最大,而平均值(\mu)和标准方差(\sigma)中,蓝色和橘色的区分度并不大,也就是说很难分辨出好主题和差主题。
因此,cv 是表征主题离散度最好的方式,所以某个主题 k 的主题离散度的计算公式可以表达为:
D 表示第 D 篇文章,k 则表示主题 k。
3 模拟人工评测结果
在第一节中提到了主题模型常出现的各种误差,基于这些误差,很多人提出了不同的方法,这些方法(包括本文后面提到的)都是为了解决上述一个或多个问题。目前传统的方法大都是使用了目测或是先验知识,常见的方法有很多。最直观的方法就是让人来判断提取出的主题好还是不好,但是很明显,这个方法需要大量的人力物力和时间。因此,人们开始探索如何用公式或是算法来模拟、估计人为判断的结果。人为判断的方法主要分为直接方法和间接方法(后文详述),因此那些模拟人为判断的算法也就大致可以被分为这两类。当然这些方法的分类很多,但在本节中介绍的主要是模拟人工测评结果的那一部分,所以分类就按照直接方法和间接方法来分。
有些方法被称为直接方法,这些方法主要基于语言的内部特性进行判断,比如说 Newman et al. (2010) 提出的主题连贯性(Topic Coherence)就利用 PMI(Pairwise Pointwise Mutual Information)对主题词间的连贯性进行计算,后面其他人也对这种连贯性的计算方式进行了改进,但是本质上还是在计算连贯性(会在后文详述);还有一些方法被称为间接方法,这些方法不是直接通过语言内部特性进行判断的,而是采用一些其它的方式,比如在下游任务中的表现,或是在测试集中的表现(混淆度,perplexity)。就包括。本节剩下的部分就会对这些方法进行详述。
3.1 混淆度 (perplexity)
简单来说,混淆度就是利用概率计算某个主题模型在测试集上的表现,混淆度越低,则说明这个主题模型越好。具体来说,就是在给定一个主题分布的情况下,计算某个文档的 log-likelihood。在下面这个式子里,\Phi 代表给定的主题矩阵,α参数确定主题的分布,w 则指代我们要预测的文章(d,与训练得到和α的文章的主题相同)。
得到了 log-likelihood 后,perplexity 就很好计算了,公式如下(这里的分母一般来说就是文章的单词数):
根据定义可以看出,log-likelihood(log-可能性)越高,也就意味着提取出的主题能表达特定主题的能力越好,这个提取出的主题质量也就越高,混淆度也就越小。但是这里的 log-likelihood 是没办法求的,Wallach09a (http://dirichlet.net/pdf/wallach09evaluation.pdf)中提出了一些对 likelihood 进行估计的方法,感兴趣的可以自己看一下,因为其效果并不很好(下面会介绍原因),故而这里对其计算方法就不做详述了。
但是为了测试这个方法的有效性,有人在 Amazon Mechanical Turk 平台上进行了一个大规模实验。他们在每个话题中找到了基于 perplexity 确定的最有可能的 5 组词,然后随机加入了第六组词,让参与者找出这组随机加入的词。
如果每个参与者都能识别出异常词,那么我们可以认为这个提取出的主题是优秀的,可以描述出一个特定的主题。然而,如果许多人把正常的 5 组词中的一组认成异常词,这就意味着他们看不出这些词之间的联系有什么逻辑,我们也就可以认为这个主题不够好——因为它描述的主题并不明确。这个实验证明了混淆度的结果与人为判断的结果不太相关。
3.2 主题连贯性(Coherence)
由于混淆度在很多场景的应用效果不佳,本部分将着重介绍最后一个方法,也就是主题连贯性。主题连贯性主要是用来衡量一个主题内的词是否是连贯的。那么这些词怎么就算是是连贯的呢?如果这些词是相互支撑的,那么这组词就是连贯的。换句话说,如果把好多个主题的词放在一起,用完美的聚类器做聚类,那么同一个主题的词应该在同一个类别中。根据定义可以发现,第一节中提到的四个问题中的前三个,都可以通过主题连贯性解决。
Newman et al. (2010) 提出使用 PMI 计算主题连贯性后,Mimno et al. (2011) 基于主题连贯性的理念,又使用了一种基于条件概率的方式对连贯性进行计算,Musat et al. (2011) 也在同年提出利用 WordNet 的层级概念来获取主题间的联系;然后,Aletras and Stevenson (2013a) 也提出了一种基于分布相似度的方法来求连贯性。目前来说,比较常见的几种方法(Roder et al. (2015) 中整理的,在 Gensim 中有打包好的函数,可以直接调用)如下所示(假设有一个主题,包含 {game, sport, ball, team}):
PMI:为了了解其他几种方式的计算方法,首先要先看一下 PMI 的计算方法(如下图所示)。在后面的两个方法中,这里\epsilon 的越小,将会得到越小的结果。这个公式可能看起来有些费解,不过没关系,可以先放一下,在后面看到例子之后,这个公式就很好理解了。
C_uci:本方法由 University of California Irvine(UCI)的 David Newman 提出,故而称其为 UCI 方法。本方法的基本原理是基于滑动窗口,对给定主题词中的所有单词对(one-set 分割)的点态互信息 (point twise mutual information, PMI) 进行计算。
因此上面提到的示例主题 {game, sport, ball, team} 的 UCI 分数则为:
C_umass:本方法由 University of Massachusetts(UMASS)的 Hanna M. Wallach 等人提出,故而称其为 UMASS 方法。本方法的基本原理是基于文档并发计数,利用 one-preceding(每个词只与位于其前面词组成词对)分割和对数条件概率计算连贯度。
因此刚刚的示例主题的 UMass 分数为:
C_npmi:本方法使用归一化点态互信息 (NPMI) 的,与 C_uci 很类似,只是将 PMI 换成 NPMI,算是 C_uci 的增强版。具体来说,NPMI 的计算方法如下图所示。
C_v (Coefficient of variance):本方法基于滑动窗口,对主题词进行 one-set 分割(一个 set 内的任意两个词组成词对进行对比),并使用归一化点态互信息 (NPMI) 和余弦相似度来间接获得连贯度。
C_p:本方法也是基于滑动窗口,但分词方法为 one-preceding(每个词只与位于其前面和后面的词组成词对),并利用 Fitelson 相关度来表征连贯度。
3.3 模拟人工判别结果
3.3.1 间接方法
如前文所述,人工判别方法也被分为两类,一类是直接方法,一类是间接方法。人工判别的间接方法被称为异常词检测,主要就是在主题模型提取出的各个主题中加入一个异常词,然后让人来找出这个异常词。
为了模拟这种间接人工判别的结果,Jey Han Lau(2014)从那些发给人工做判别的主题词中提取了词之间的联系特征,提取的方法为以下三种:
然后将这些特征进行合并,利用 Ranking SVM Regression 来找到异常词。同时,Jey 还利用了 NPMI 进行词之间的联系特征进行提取。最终的结果如下图所示:
相关度比较结果(图源:https://www.aclweb.org/anthology/E14-1056.pdf)
图中显示的是 Jey 的方法(WI-Auto-PMI, WI-Auto-NPMI)与人工判别(WI-Human)的关联度,可以看到这些方法与人工判别得到的结果还是比较一致的。
3.3.2 直接方法
另外一种人工方法叫直接方法,这种方法就比较简单粗暴,就是让人直接对各个主题进行评分。对于这种直接方法,Jey 使用了以下 4 中方法对主题进行评分:
OC(Observed Coherence)-Auto-PMI:对一个主题内的词计算 PMI,计算方法其实就是 PMI,如下图所示:
同样的,Jey 又使用了 NPMI 对主题进行评分,同时,他又使用了 log conditional probability(LCP)进行计算:
最后,Jey 又使用 Aletras and Stevenson (2013a) 中的 distributional similarity(DS)对主题进行了评分。最终的结果如下图所示:
相关度比较结果(图源:https://www.aclweb.org/anthology/E14-1056.pdf)
由上图可知,这些方法与人工判别的结果在大部分结果上还是很一致的,只有部分结果(PMI 等)没能得到很好的一致性。
4 展望与总结
本文主要介绍了主题模型存在的一些问题和当前比较流行的主题模型评价方法,也对主流的主题模型评价方法进行了简单的分类。
对于未来,我主要有两点想法,一是要适应时代的发展,也就是当前越来越多的数据集和越来越多的小数据集的学习模型,如何更好的利用这些数据集,或者如何找到合适的小数据集的处理方式都是很不错的尝试方向,甚至直接使用监督模型来对主题模型进行评价都可以;第二个就是要时刻记得本质问题,这也是为什么我要在文章的第一节就提出主题模型常见错误的原因,评价方法的本质还是为了找到这些错误,站在这些专家的肩膀上,我们可以把这些常见错误分而治之,利用不同的模型解决不同的错误,或是如何找到这些错误的共同特点,从而完成一个更加通用的建模,这些都是这个领域可以探索的方向。当然这个领域的未来发展方向还有很多,我在这里也只是抛砖引玉。
希望大家喜欢这种探索的过程!
参考文献
[1] Rui Wang, Deyu Zhou, and Yulan He. ATM: adversarial-neural topic model.CoRR, abs/1811.00265, 2018
[2] Evaluate Topic Models: Latent Dirichlet Allocation (LDA):https://towardsdatascience.com/evaluate-topic-model-in-python-latent-dirichlet-allocation-lda-7d57484bb5d0
[3] Perplexity To Evaluate Topic Models:http://qpleple.com/perplexity-to-evaluate-topic-models/
[4] Linzi Xing and Michael Paul. 2018. Diagnosing and improving topic models by analyzing posterior variability. In AAAI Conference on Artificial Intelligence (AAAI-18), pages 6005–6012.
[5] Michael Roder, Andreas Both, and Alexander Hinneburg. 2015. Exploring the space of topic coherence measures. In the Eighth ACM International Conference on Web Search and Data Mining, pages 39– 408.
分析师简介:本文作者为王子嘉,目前在帝国理工学院人工智能硕士在读。主要研究方向为 NLP 的推荐等,喜欢前沿技术,热爱稀奇古怪的想法,是立志做一个不走寻常路的研究者的男人!