Stabilitas topik dalam model topik

23

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:

  1. Topik-topik yang ditemukan oleh pemodelan topik terkadang sulit ditafsirkan
  2. 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:

  1. 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!
  2. 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 nstartseperti yang disarankan oleh Flounderer di komentar. Sayangnya, seperti yang ditunjukkan di bawah ini, bahkan pengaturan nstartke 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"
Patrick S. Forscher
sumber
2
Terima kasih telah berbagi data Anda! Sangat menarik untuk dilihat. Saya tidak memiliki jawaban yang baik untuk pertanyaan Anda, tetapi saya ingin menyarankan beberapa hal. Untuk Pertanyaan 1, Anda dapat mencoba menyesuaikan parameter kontrol dalam LDAfungsi dalam topicmodelspaket. Secara khusus, Anda bisa mencoba membuatnya nstartlebih 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, meningkatkan nstartke, katakanlah, 1000 akan membuat algoritma melakukan 1000 kali lebih banyak pekerjaan (lanjutan)
Flounderer
1
jadi itu akan jauh lebih lambat. Dan tidak ada jaminan bahwa itu akan cukup stabil . Kedua pertanyaan, menurut saya LDA benar-benar dirancang untuk mengklasifikasikan dokumen yang tidak terlihat ketika ada terlalu banyak data untuk diproses oleh manusia. Untuk ini, tidak apa-apa jika algoritma VEM hanya memberikan jawaban "cukup baik" yang dapat bervariasi dari satu run ke yang lain. Tetapi bagi Anda, ini tidak diinginkan, dan LDA mungkin bukan pilihan terbaik. Ada beberapa alternatif yang sangat baik dalam beberapa kuliah pertama kursus Shalizi di sini: stat.cmu.edu/~cshalizi/350 , misalnya, Anda dapat mengonversi masing-masing (lanjt)
Flounderer
2
esei menjadi vektor bag-of-words dan kemudian lakukan PCA pada hasilnya, kemudian cari kluster. Mengenai apakah tubuh Anda cukup besar, jujur ​​saja saya tidak akan terkejut jika terlalu besar bagi VEM untuk memberikan hasil yang andal. Mungkin saya hanya pahit, tetapi saya menghabiskan banyak waktu untuk mencoba agar metode ini dapat digunakan untuk model lain oleh penulis yang serupa, dan itu sama sekali tidak konsisten dari menjalankan untuk menjalankan, bahkan ketika menggunakan contoh kecil. Tidak banyak makalah yang membahas memilih titik awal untuk algoritma seperti ini, sejauh yang saya tahu.
Flounderer
Flounderer, terima kasih banyak atas masukan Anda! Agak mengecewakan bagi saya untuk mendengar bahwa tidak ada lebih banyak pedoman tentang LDA secara khusus, tapi saya kira itu datang dengan wilayah metode yang tidak diawasi. Saya akan mencoba menyesuaikan nstartdan 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).
Patrick S. Forscher
Aku merasakan kesedihan sosial-sainsmu, Patrick, tapi kurasa pendekatanmu salah sejak awal. Jika Anda ingin menggunakan tes statistik, Anda harus meminta manusia mengkode sebagian dari mereka untuk mendapatkan tingkat kesalahan klasifikasi, sudahkah Anda (secara pribadi) melakukan itu? Jika demikian, maka Anda akan tahu fitur apa yang paling menonjol dan Anda dapat merancang / memilih algoritma yang lebih baik.
Indolering

Jawaban:

6

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.

Siddharth Gopal
sumber
@ Siddharth.Gopal Terima kasih banyak atas tanggapannya! Memang benar bahwa saya mengharapkan beberapa tumpang tindih dalam kelompok mengingat bahwa semua peserta menggambarkan satu organisasi siswa hipotetis (yang kami sebut "BadgerConnect"). Jadi, berbeda dengan, misalnya, aplikasi pemodelan topik untuk makalah dari Sains, di mana beberapa topik sangat berbeda dari kertas ke kertas, topiknya semua sedikit mirip. Namun, memang benar bahwa beberapa esai mendukung BadgerConnect dan beberapa ditulis terhadap BadgerConnect.
Patrick S. Forscher
Juga benar bahwa esai sangat bervariasi dalam jenis argumen yang mereka sajikan dan bagaimana argumen disajikan. Saya ingin menangkap beberapa variabilitas itu, jika memungkinkan. Apakah Anda tahu apakah menangkap beberapa perbedaan ini mungkin terjadi (paling tidak, perbedaan antara esai yang mendukung dan esai terhadap program siswa hipotetis ini)? Juga, apakah hasil clustering Anda stabil ketika Anda menggunakan benih acak yang berbeda?
Patrick S. Forscher
1
1. Jika Anda benar-benar peduli tentang stabilitas algoritma - coba jalankan algoritma berkali-kali dan pilih model dengan kemungkinan tertinggi.
Siddharth Gopal
1
(Meskipun stabilitas tampaknya seperti masalah sekunder di sini). 2. Mengingat uraian Anda tentang apa yang Anda harapkan dari segi argumen dan pendapat, mewakili esai sebagai kata-kata bukan ide yang baik dalam konteks ini. Model topik yang sebenarnya mungkin bukan alat yang bagus untuk ini. Saya menyarankan Anda memilih beberapa kata kunci yang Anda minati (seperti ras, makanan, asrama dll) dan mencoba menganalisis sentimen kalimat di mana kata itu muncul. Untuk misalnya lihat di sini untuk demo.
Siddharth Gopal
1
Python memiliki toolkit NLP yang sangat baik yang disebut nltk. Anda mungkin ingin melihat apa yang ditawarkannya. Mengenai tf-idf, 'secara teknis', input ke LDA hanya boleh dihitung dengan kata-kata karena distribusi multinomial tidak didefinisikan untuk bilangan real yang arbitrer.
Siddharth Gopal
10
  1. 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.

  2. 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).

  3. 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:

  1. 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.

  2. 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.

  3. Cobalah bermain sedikit dengan parameter-hiper, seperti berbagai topik.

Makalah tentang koherensi topik:

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

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

Liangjie Hong
sumber
Terimakasih atas tanggapan Anda. Saya akan menanggapi komentar Anda satu per satu. (1) Saya mengerti bahwa model tahu apa-apa tentang topik, tapi pendapat Anda bahwa struktur diungkap oleh model topik (dan bahwa apakah struktur ini berarti apa-apa bukanlah tujuan dari model ini) adalah langsung bertentangan dengan ini makalah oleh David Blei, pencipta model topik. Tampak bagi saya bahwa tujuan model topik adalah untuk membantu mengeksplorasi / mengkarakterisasi data tekstual, yang persis apa yang ingin saya lakukan dalam proyek ini.
Patrick S. Forscher
(2) Meskipun kemungkinan hasil saya disebabkan oleh bug, saya pikir itu lebih cenderung disebabkan oleh kesalahan pada saya (dan jika ini memang masalahnya, tolong beri tahu saya!). Saya menggunakan topicmodelspaket dalam R, yang pada dasarnya adalah antarmuka R ke algoritma asli yang diterapkan oleh Blei dan rekannya.
Patrick S. Forscher
(3) Saya tahu bahwa LDA memerlukan pengacakan, jadi saya tidak meminta hasil yang tepat dari menjalankan untuk menjalankan, tapi saya pikir masuk akal untuk mengharapkan topik yang sama menggunakan benih acak yang berbeda (memang, saya percaya bahwa ini adalah harapan standar ketika orang menggunakan algoritma berdasarkan pengacakan). Yang ingin saya ketahui adalah bagaimana mencapai stabilitas dalam hasil.
Patrick S. Forscher
@ PatrickS.Forscher Untuk komentar pertama Anda: Tidak. Itu kontradiktif. Nama "topik" adalah apa yang kita, sebagai manusia, beri label pada distribusi kata-kata itu. Struktur pengelompokan ini mungkin atau mungkin tidak terkait dengan dunia nyata, topik yang dapat dibaca manusia. Sudah ada sejumlah makalah untuk memperkenalkan koherensi ke dalam model topik untuk mengurangi masalah yang sebenarnya.
Liangjie Hong
@ PatrickS.Forscher Untuk komentar kedua Anda: Coba beberapa implementasi berbeda untuk melihat apakah Anda mendapatkan yang sama (hasil yang tidak masuk akal) atau tidak. Misalnya, UMASS Mallet.
Liangjie Hong