主题模型中的主题稳定性


23

我正在一个项目中,我要提取有关一系列开放式论文内容的信息。在这个特定的项目中,作为大型实验的一部分,有148人撰写了有关假设的学生组织的文章。尽管在我的领域(社会心理学),分析这些数据的典型方法是手工编写论文,但我想定量地进行此操作,因为手工编码既费工又过于主观味道。

在对定量分析免费响应数据的方法进行调查期间,我偶然发现了一种称为主题建模(或潜在Dirichlet分配或LDA)的方法。主题建模采用数据的单词袋表示(术语文档矩阵),并使用有关单词共现的信息来提取数据的潜在主题。这种方法对我的应用程序似乎很完美。

不幸的是,当我将主题建模应用于数据时,我发现了两个问题:

  1. 主题建模发现的主题有时很难解释
  2. 当我使用其他随机种子重新运行主题模型时,主题似乎发生了巨大变化

我特别关心第2期。因此,我有两个相关的问题:

  1. 在LDA程序中,我可以做些什么来优化我的模型拟合程序的可解释性和稳定性?就我个人而言,我不太关心寻找具有最低困惑度和/或最佳模型拟合度的模型-我主要是想使用此过程来帮助我理解和表征本研究参与者在论文中写的内容。但是,我当然不希望我的结果成为随机种子的假象!
  2. 与上述问题相关,LDA是否需要多少数据的标准?我见过的大多数使用这种方法的论文都分析了大型语料库(例如,过去20年中所有科学论文的档案),但是,由于我使用的是实验数据,因此我的文档语料库要小得多。

我在这里张贴了论文数据以供任何想弄脏他或她的手的人使用,并且我在下面粘贴了我正在使用的R代码。

require(tm)
require(topicmodels)

# Create a corpus from the essay 
c <- Corpus(DataframeSource(essays))
inspect(c)

# Remove punctuation and put the words in lower case
c <- tm_map(c, removePunctuation)
c <- tm_map(c, tolower)

# Create a DocumentTermMatrix.  The stopwords are the LIWC function word categories
# I have a copy of the LIWC dictionary, but if you want to do a similar analysis,
# use the default stop words in tm
dtm <- DocumentTermMatrix(c, control = list(stopwords = 
  c(dict$funct, dict$pronoun, dict$ppron, dict$i, dict$we, dict$you, dict$shehe, 
    dict$they, dict$inpers, dict$article, dict$aux)))

# Term frequency inverse-document frequency to select the desired words
term_tfidf <- tapply(dtm$v/rowSums(as.matrix(dtm))[dtm$i], dtm$j, mean) * log2(nDocs(dtm)/colSums(as.matrix(dtm)))
summary(term_tfidf)

dtm <- dtm[, term_tfidf >= 0.04]

lda <- LDA(dtm, k = 5, seed = 532)
perplexity(lda)
(terms <- terms(lda, 10))
(topics <- topics(lda))

编辑:

我尝试nstart按照Flounderer在评论中的建议进行修改。不幸的是,如下所示,即使设置nstart为1000,主题也会因随机种子而异。再次强调一下,我在以下两个模型的估计中唯一要更改的是用于开始模型估计的随机种子,但是,这两个主题似乎根本不一致。

lda <- LDA(dtm, k = 5, seed = 535, control = list(nstart = 1000))
(terms <- terms(lda, 10))

      Topic 1         Topic 2      Topic 3      Topic 4       Topic 5      
 [1,] "international" "ethnicity"  "free"       "credit"      "kind"       
 [2,] "communicate"   "true"       "team"       "mandatory"   "bridge"     
 [3,] "gain"          "asians"     "cooperate"  "music"       "close"      
 [4,] "use"           "hand"       "order"      "seen"        "deal"       
 [5,] "big"           "hold"       "play"       "barrier"     "designed"   
 [6,] "communication" "effective"  "big"        "stereotypes" "effort"     
 [7,] "america"       "emphasis"   "beginning"  "asians"      "implemented"
 [8,] "chinese"       "halls"      "china"      "fantastic"   "websites"   
 [9,] "ethnicity"     "minorities" "difference" "focusing"    "planned"    
[10,] "networks"      "population" "easier"     "force"       "body"

lda <- LDA(dtm, k = 5, seed = 536, control = list(nstart = 1000))
(terms <- terms(lda, 10))

      Topic 1       Topic 2         Topic 3        Topic 4       Topic 5    
 [1,] "kind"        "international" "issue"        "willing"     "play"     
 [2,] "easier"      "ethnicity"     "close"        "use"         "trying"   
 [3,] "gain"        "communication" "currently"    "hand"        "unity"    
 [4,] "websites"    "communicate"   "implemented"  "networks"    "decision" 
 [5,] "credit"      "bridge"        "particularly" "stereotypes" "gap"      
 [6,] "effort"      "america"       "credit"       "communicate" "normally" 
 [7,] "barriers"    "connection"    "fulfill"      "came"        "asians"   
 [8,] "effects"     "kind"          "grew"         "asians"      "created"  
 [9,] "established" "order"         "perspectives" "big"         "effective"
[10,] "strangers"   "skills"        "big"          "budget"      "prejudice"

2
感谢您分享您的数据!看着很有趣。对于您的问题,我没有很好的答案,但是我想提出一些建议。对于问题1,您可以尝试LDAtopicmodels包中的函数中调整控制参数。特别是,您可以尝试nstart做大一些。这保证了您的结果更稳定,因为LDA函数将使用不同的随机种子反复运行,然后返回最佳结果。不幸的是,增加到nstart1000,会使算法的工作量增加1000倍(续)
Flounderer 2013年

1
所以会慢很多。并且不能保证它会足够稳定。回复:两个问题,在我看来,LDA的确是设计用来对看不见的文档进行分类的,因为有太多数据需要处理。为此,如果VEM算法仅给出一个“足够好”的答案(可能因一次运行而不同),则可以。但是对于您而言,这不是理想的选择,因此LDA可能不是最佳选择。Shalizi的课程的前几节课中有一些很好的替代方法:例如stat.cmu.edu/~cshalizi/350,您可以转换每个(续)
Flounderer

2
文章到一个词袋向量中,然后对结果进行PCA,然后寻找聚类。至于您的语料库是否足够大,说实话,如果VEM太大而无法给出可靠的结果,我也不会感到惊讶。也许我只是有点苦,但是我花了很多时间试图使这种方法适用于类似作者的另一种模型,而且即使在使用很小的示例时,它之间也是完全不一致的。据我所知,没有多少文章讨论如何为这种算法选择起点。
Flounderer

比目鱼,非常感谢您的投入!听到关于LDA的更多指导令我有些失望,但是我想这是无监督方法的领域。我将尝试调整nstart并查看该课程的网站,以查看其中任一内容是否有用。(顺便说一句,如果您在评论中插入您的评论,我会投票赞成。我想在接受任何内容之前先征询其他人的意见,但我认为您的评论足以算作一个答案)。
Patrick S. Forscher

帕特里克(Patrick),我感到您的社会科学苦恼很痛苦,但我认为您的做法一开始是错误的。如果要使用统计测试,您将需要人工编写其中的一部分代码以获得分类错误率,您(个人)这样做了吗?如果是这样,那么您将知道哪些功能最突出,并且可以设计/选择更好的算法。
Indolering

Answers:


6

出于自身的好奇心,我将一直在研究的聚类算法应用于该数据集。

暂时将结果放在这里(选择论文集)。

看来问题不在于起点或算法,而在于数据。只要有一些隐藏的主题/概念/主题/集群(无论您要调用什么),您就可以“合理地”(主观地,以我有限的经验)即使在147个实例下也可以获得良好的集群。

如果数据没有很好地分开的主题,那么无论您使用哪种算法,都可能不会得到很好的答案。


@ Siddharth.Gopal非常感谢您的回复!的确,鉴于所有参与者都在描述一个假设的学生组织(我们称为“ BadgerConnect”),我希望集群中会有一些重叠。因此,例如,与将主题建模应用于《科学》杂志的论文相比,在某些论文与论文之间存在很大差异的情况下,主题都有些相似。但是,确实有一些文章支持BadgerConnect,而有些则是针对BadgerConnect撰写的。
Patrick S. Forscher

的确,论文的论点种类和论据表达方式差异很大。如果可能的话,我想捕捉一些可变性。您是否知道能否抓住其中的一些区别(至少,赞成论文和反对该假设学生程序的论文之间的区别)?另外,当您使用其他随机种子时,聚类结果是否稳定?
Patrick S. Forscher

1
1.如果您仅担心算法的稳定性,请尝试多次运行算法并选择可能性最高的模型。
Siddharth Gopal

1
(尽管稳定性在这里似乎是次要的问题)。2.考虑到您对论据和观点的期望的描述,在这种情况下将论文表达为一词包不是一个好主意。实际上,主题模型本身可能不是一个好的工具。我建议您选择一些您感兴趣的关键词(例如种族,食物,宿舍等),并尝试分析出现该词的句子的情感。例如,在这里查看演示。
Siddharth Gopal 2013年

1
Python有一个出色的NLP工具箱,称为nltk。您可能想看看它提供了什么。关于tf-idf,从技术上讲,LDA的输入应仅是字数统计,因为没有为任意实数定义多项式分布。
Siddharth Gopal 2013年

10
  1. 所谓的“主题模型”中的“主题”概念具有误导性。该模型根本不知道或没有设计成在语义上一致的“主题”。“主题”只是令牌(单词)上的分布。换句话说,该模型仅捕获术语的高阶共现。这些结构是否有意义并非模型的目的。

  2. “ LDA”模型有两个部分(基本上是所有图形模型):a)模型定义和b)推理算法的实现,以推断/确定模型参数。您提到的问题可能是“ LDA”模型的问题,也可能不是,但可能是您所使用的特定实现(R程序包)的某些错误/错误/配置错误。

  3. 几乎所有“ LDA”的实现都需要一些随机化。而且,根据推理算法(例如MCMC或变分推理)的性质,您将获得局部最小解或许多解的分布。简而言之,您所观察到的结果是可以预期的。

实用建议:

  1. 尝试不同的R程序包:例如,此程序包由David Blei的前研究生完成。或者,甚至尝试其他环境,例如这个。如果从所有这些稳定的程序包中获得相似的结果,至少,您可以稍微减轻一下问题。

  2. 尝试播放一些不删除停用词的内容。理由是,这些停用词在连接如此小的语料库(例如100篇左右的文章)中的语义含义方面起着重要作用。另外,请尝试不过滤内容。

  3. 尝试使用一些超参数,例如不同数量的主题。

有关主题一致性的论文:

  1. http://www.aclweb.org/anthology-new/D/D12/D12-1087.pdf

  2. http://people.cs.umass.edu/~wallach/publications/mimno11optimizing.pdf


感谢您的答复。我将一次答复您的评论。(1)我了解该模型对主题一无所知,但是您对主题模型所揭示的结构(以及这些结构是否意味着任何东西不是这些模型的目的)的争论与David Blei的这篇评论论文直接矛盾,主题模型的创建者。在我看来,主题模型的目的完全是为了帮助探索/表征文本数据,而这正是我在本项目中想要做的。
Patrick S. Forscher

(2)尽管我的结果可能是由于错误所致,但我认为它们更有可能是由于我的某种错误所致(如果确实如此,请告诉我!)。我正在topicmodelsR中使用该程序包,它实际上是Blei及其同事实现的原始算法的R接口。
Patrick S. Forscher

(3)我知道LDA需要一些随机化,因此我并不需要每次运行都获得确切的结果,但是我认为使用不同的随机种子期望相似的主题是合理的(事实上,我相信这是标准的期望,人们使用基于随机化的算法)。我想知道的是如何实现结果的稳定性。
Patrick S. Forscher

@ PatrickS.Forscher第一个评论:不,这是矛盾的。作为人类,我们将“主题”这个名称贴在单词的这些分布上。这些群集结构可能与现实世界中的人类可读主题无关,也可能与之无关。有很多论文将一致性引入主题模型以缓解确切的问题。
Liangjie Hong

@ PatrickS.Forscher对于您的第二条评论:请尝试一些不同的实现,以查看是否得到相似的结果(不合理的结果)。例如,UMASS Mallet。
Liangjie Hong
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.