Saya sedang mengerjakan sebuah proyek di mana saya ingin mengekstraksi beberapa informasi tentang isi dari serangkaian esai terbuka. Dalam proyek khusus ini, 148 orang menulis esai tentang organisasi siswa hipotetis sebagai bagian dari eksperimen yang lebih besar. Meskipun di bidang saya (psikologi sosial), cara khas untuk menganalisis data ini adalah dengan mengkode esai dengan tangan, saya ingin melakukan ini secara kuantitatif, karena pengodean tangan bersifat padat karya dan agak terlalu subjektif bagi saya. rasa.
Selama penyelidikan saya tentang cara-cara untuk menganalisis data respons bebas secara kuantitatif, saya menemukan sebuah pendekatan yang disebut pemodelan topik (atau Latent Dirichlet Allocation, atau LDA). Pemodelan topik mengambil representasi kata-kata dari data Anda (sebuah term-document matrix) dan menggunakan informasi tentang kata co-kejadian untuk mengekstraksi topik laten data. Pendekatan ini tampaknya sempurna untuk aplikasi saya.
Sayangnya, ketika saya telah menerapkan pemodelan topik pada data saya, saya menemukan dua masalah:
- Topik-topik yang ditemukan oleh pemodelan topik terkadang sulit ditafsirkan
- Ketika saya menjalankan kembali model topik saya dengan seed acak berbeda, topik-topik tersebut tampaknya berubah secara dramatis
Masalah 2 khususnya menyangkut saya. Karena itu, saya punya dua pertanyaan terkait:
- Apakah ada yang bisa saya lakukan dalam prosedur LDA untuk mengoptimalkan prosedur model fit saya untuk interpretabilitas dan stabilitas? Secara pribadi, saya tidak terlalu peduli menemukan model dengan kebingungan terendah dan / atau model terbaik - saya terutama ingin menggunakan prosedur ini untuk membantu saya memahami dan mengkarakterisasi apa yang ditulis oleh para peserta dalam penelitian ini dalam esai mereka. Namun, saya tentu tidak ingin hasil saya menjadi artefak dari benih acak!
- Terkait dengan pertanyaan di atas, apakah ada standar untuk berapa banyak data yang perlu Anda lakukan LDA? Sebagian besar makalah yang saya lihat yang menggunakan metode ini menganalisis korpora besar (misalnya, arsip semua makalah Sains dari 20 tahun terakhir), tetapi, karena saya menggunakan data eksperimental, kumpulan dokumen saya jauh lebih kecil.
Saya telah memposting data esai di sini untuk siapa saja yang ingin tangannya kotor, dan saya telah menempelkan kode R yang saya gunakan di bawah ini.
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))
Edit:
Saya mencoba memodifikasi nstart
seperti yang disarankan oleh Flounderer di komentar. Sayangnya, seperti yang ditunjukkan di bawah ini, bahkan pengaturan nstart
ke 1000 hasil dalam topik yang sangat bervariasi dari benih acak ke benih acak. Hanya untuk menekankan kembali, satu-satunya hal yang saya ubah dalam estimasi dari dua model di bawah ini adalah seed acak yang digunakan untuk memulai estimasi model, namun topik-topiknya tampaknya tidak konsisten sama sekali dalam dua run ini.
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"
nstart
dan melihat situs web kursus untuk melihat apakah salah satu dari mereka menghasilkan sesuatu yang bermanfaat. (BTW, jika Anda memasukkan komentar Anda dalam jawaban, saya akan memilihnya. Saya ingin melihat apakah ada orang lain yang memiliki saran sebelum saya menerima apa pun, tetapi saya pikir komentar Anda lebih dari cukup untuk dihitung sebagai jawaban).
LDA
fungsi dalamtopicmodels
paket. Secara khusus, Anda bisa mencoba membuatnyanstart
lebih besar. Ini dijamin untuk membuat hasil Anda lebih stabil, karena fungsi LDA hanya akan berjalan berulang-ulang dengan benih acak yang berbeda dan kemudian mengembalikan hasil terbaik. Sayangnya, meningkatkannstart
ke, katakanlah, 1000 akan membuat algoritma melakukan 1000 kali lebih banyak pekerjaan (lanjutan)