我正在做一个项目,我想提取一些关于一系列开放式论文内容的信息。在这个特定的项目中,148 人写了关于一个假设的学生组织的文章,作为一个更大的实验的一部分。虽然在我的领域(社会心理学)中,分析这些数据的典型方法是手工编写文章,但我想定量地做这件事,因为手工编码对我来说既费力又有点过于主观品尝。
在我对定量分析自由响应数据的方法进行调查时,我偶然发现了一种称为主题建模(或潜在狄利克雷分配,或 LDA)的方法。主题建模采用数据的词袋表示(术语文档矩阵),并使用有关词共现的信息来提取数据的潜在主题。这种方法似乎非常适合我的应用程序。
不幸的是,当我将主题建模应用于我的数据时,我发现了两个问题:
- 主题建模揭示的主题有时难以解释
- 当我使用不同的随机种子重新运行主题模型时,主题似乎发生了巨大变化
问题 2 尤其令我担忧。因此,我有两个相关的问题:
- 我可以在 LDA 程序中做些什么来优化我的模型拟合程序的可解释性和稳定性吗?就个人而言,我不太关心找到具有最低困惑度和/或最佳模型拟合的模型——我主要想使用这个程序来帮助我理解和描述本研究参与者在他们的论文中写的内容。但是,我当然不希望我的结果成为随机种子的产物!
- 与上述问题相关,是否有关于您需要多少数据进行 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"