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"
sumber
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)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).Jawaban:
Untuk rasa ingin tahu saya sendiri, saya menerapkan algoritma pengelompokan yang telah saya kerjakan ke dataset ini.
Saya sudah memasang sementara hasilnya di sini (pilih dataset esai).
Sepertinya masalahnya bukan titik awal atau algoritma, tetapi data. Anda dapat 'secara wajar' (secara subyektif, dalam pengalaman terbatas saya) mendapatkan kluster yang baik bahkan dengan 147 contoh selama ada beberapa topik / konsep / tema / kluster tersembunyi (apa pun yang ingin Anda panggil).
Jika data tidak memiliki topik yang dipisahkan dengan baik, maka apa pun algoritma yang Anda gunakan, Anda mungkin tidak mendapatkan jawaban yang baik.
sumber
Gagasan "topik" dalam apa yang disebut "model topik" menyesatkan. Model ini tidak tahu atau tidak dirancang untuk mengetahui "topik" yang semantik koheren sama sekali. "Topik" hanyalah distribusi atas token (kata-kata). Dengan kata lain, model tersebut hanya menangkap istilah kemunculan bersama tingkat tinggi. Apakah struktur ini berarti sesuatu atau tidak bukanlah tujuan dari model.
Model "LDA" memiliki dua bagian (pada dasarnya semua model grafis): a) definisi model dan b) implementasi algoritma inferensi untuk parameter model infer / estate. Hal yang Anda sebutkan mungkin atau mungkin bukan masalah model "LDA" tetapi bisa berupa bug / kesalahan / kesalahan konfigurasi dari implementasi spesifik yang Anda gunakan (paket R).
Hampir semua implementasi "LDA" memerlukan pengacakan. Dan berdasarkan sifat algoritma inferensi (mis., MCMC atau inferensi variasional), Anda akan mendapatkan solusi minimum lokal atau distribusi banyak solusi. Jadi, singkatnya, apa yang Anda amati entah bagaimana diharapkan.
Saran Praktis:
Coba paket R yang berbeda: Misalnya, paket ini dilakukan oleh mantan mahasiswa pascasarjana David Blei. Atau, coba lingkungan lain, seperti ini . Jika Anda mendapatkan hasil yang sama dari semua paket stabil ini, setidaknya, Anda sedikit mengurangi masalahnya.
Cobalah bermain sedikit dengan tidak menghapus kata-kata penghenti. Alasannya adalah, kata-kata penghentian ini memainkan peran penting dalam menghubungkan makna semantik dalam korpus sekecil itu (mis. 100 atau lebih artikel). Juga, cobalah untuk tidak memfilter sesuatu.
Cobalah bermain sedikit dengan parameter-hiper, seperti berbagai topik.
Makalah tentang koherensi topik:
http://www.aclweb.org/anthology-new/D/D12/D12-1087.pdf
http://people.cs.umass.edu/~wallach/publications/mimno11optimizing.pdf
sumber
topicmodels
paket dalam R, yang pada dasarnya adalah antarmuka R ke algoritma asli yang diterapkan oleh Blei dan rekannya.