主题模型中的主题稳定性

机器算法验证 机器学习 模型选择 小样本 主题模型 狄利克雷过程
2022-01-19 20:42:05

我正在做一个项目,我想提取一些关于一系列开放式论文内容的信息。在这个特定的项目中,148 人写了关于一个假设的学生组织的文章,作为一个更大的实验的一部分。虽然在我的领域(社会心理学)中,分析这些数据的典型方法是手工编写文章,但我想定量地做这件事,因为手工编码对我来说既费力又有点过于主观品尝。

在我对定量分析自由响应数据的方法进行调查时,我偶然发现了一种称为主题建模(或潜在狄利克雷分配,或 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. 所谓“主题模型”中的“主题”概念具有误导性。该模型根本不知道或根本不知道语义连贯的“主题”。“主题”只是令牌(单词)的分布。换句话说,该模型只是捕获了术语的高阶共现。这些结构是否有意义并不是模型的目的。

  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

为了我自己的好奇心,我将我一直在研究的聚类算法应用于这个数据集。

暂时把结果放在这里(选择essays dataset)。

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

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