Stabilità degli argomenti nei modelli di argomenti


23

Sto lavorando a un progetto in cui desidero estrarre alcune informazioni sul contenuto di una serie di saggi aperti. In questo particolare progetto, 148 persone hanno scritto saggi su un'ipotetica organizzazione studentesca nell'ambito di un esperimento più ampio. Anche se nel mio campo (psicologia sociale), il modo tipico di analizzare questi dati sarebbe codificare i saggi a mano, mi piacerebbe farlo quantitativamente, poiché la codifica manuale è sia ad alta intensità di lavoro che un po 'troppo soggettiva per il mio gusto.

Durante le mie indagini sui modi per analizzare quantitativamente i dati di risposta libera, mi sono imbattuto in un approccio chiamato modellazione di argomenti (o Latent Dirichlet Allocation o LDA). La modellazione degli argomenti prende una rappresentazione bag-of-word dei tuoi dati (una matrice di documenti termici) e utilizza le informazioni sulle ricorrenze di parole per estrarre gli argomenti latenti dei dati. Questo approccio sembra perfetto per la mia applicazione.

Sfortunatamente, quando ho applicato la modellazione degli argomenti ai miei dati, ho scoperto due problemi:

  1. Gli argomenti scoperti dalla modellazione degli argomenti sono talvolta difficili da interpretare
  2. Quando rieseguo i miei modelli di argomento con un seme casuale diverso, gli argomenti sembrano cambiare radicalmente

Il numero 2 in particolare mi riguarda. Pertanto, ho due domande correlate:

  1. C'è qualcosa che posso fare nella procedura LDA per ottimizzare la mia procedura di adattamento del modello per interpretabilità e stabilità? Personalmente, non mi interessa molto trovare il modello con la minima perplessità e / o la migliore adattabilità al modello - Voglio principalmente utilizzare questa procedura per aiutarmi a capire e caratterizzare ciò che i partecipanti a questo studio hanno scritto nei loro saggi. Tuttavia, certamente non voglio che i miei risultati siano un artefatto del seme casuale!
  2. In relazione alla domanda di cui sopra, esistono degli standard per la quantità di dati necessari per eseguire una LDA? La maggior parte degli articoli che ho visto che hanno utilizzato questo metodo analizzano grandi corpora (ad esempio, un archivio di tutti gli articoli scientifici degli ultimi 20 anni), ma, poiché sto usando dati sperimentali, il mio corpus di documenti è molto più piccolo.

Ho pubblicato i dati del saggio qui per chiunque voglia sporcarsi le mani e ho incollato il codice R che sto usando di seguito.

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

Modificare:

Ho provato a modificare nstartcome suggerito da Flounderer nei commenti. Sfortunatamente, come mostrato di seguito, anche l'impostazione nstartsu 1000 comporta argomenti che variano in modo abbastanza drammatico da seme casuale a seme casuale. Solo per sottolineare ancora una volta, l'unica cosa che sto cambiando nella stima dei due modelli seguenti è il seme casuale usato per iniziare la stima del modello, eppure gli argomenti non sembrano essere coerenti in queste due serie.

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
Grazie per aver condiviso i tuoi dati! È stato molto interessante da guardare. Non ho una buona risposta alle tue domande, ma voglio suggerire alcune cose. Per la domanda 1, puoi provare a regolare i parametri di controllo nella LDAfunzione nel topicmodelspacchetto. In particolare, potresti provare a nstartingrandirlo. Questo è garantito per rendere i tuoi risultati più stabili, perché la funzione LDA continuerà a funzionare ripetutamente con diversi semi casuali e quindi restituirà il miglior risultato. Sfortunatamente, aumentando nstart, diciamo, 1000 farà lavorare l'algoritmo 1000 volte di più (proseguendo)
Flounderer

1
quindi sarà molto più lento. E non vi è alcuna garanzia che sarà abbastanza stabile . Ri: entrambe le domande, mi sembra che LDA sia davvero progettato per classificare i documenti invisibili quando ci sono troppi dati che un essere umano può elaborare. Per questo, va bene se l'algoritmo VEM fornisce solo una risposta "abbastanza buona" che può variare da una corsa all'altra. Ma per te, questo non è desiderabile, e quindi LDA potrebbe non essere la scelta migliore. Ci sono alcune eccellenti alternative nelle prime lezioni del corso di Shalizi qui: stat.cmu.edu/~cshalizi/350 , ad esempio, potresti convertirle ciascuna (seguito)
Flounderer

2
saggio su un vettore di bag-of-word e quindi fare un PCA sui risultati, quindi cercare i cluster. Per quanto riguarda se il tuo corpus è abbastanza grande, a dire il vero non sarei sorpreso se fosse troppo grande per VEM per dare risultati affidabili. Forse sono solo amaro, ma ho passato molto tempo a cercare di far funzionare questo metodo per un altro modello da autori simili, ed era completamente incoerente da corsa a corsa, anche quando usavo piccoli esempi. Non ci sono molti articoli che discutono sulla scelta dei punti di partenza per algoritmi come questo, per quanto ne so.
Flounderer,

Flounderer, grazie mille per il tuo contributo! È un po 'deludente per me sapere che non ci sono più linee guida su LDA in particolare, ma suppongo che questo provenga dal territorio di un metodo non supervisionato. Proverò ad adeguarmi nstarte guardare il sito web del corso per vedere se uno di questi produce qualcosa di utile. (A proposito, se inserisci i tuoi commenti in una risposta, lo voterò. Vorrei vedere se qualcun altro ha dei consigli prima di accettare qualcosa, ma penso che i tuoi commenti siano più che sufficienti per essere considerati come una risposta).
Patrick S. Forscher,

Sento il tuo dolore da gruntwork di scienze sociali, Patrick, ma penso che il tuo approccio sia sbagliato all'inizio. Se si desidera utilizzare i test statistici, è necessario disporre di codici umani per una parte di essi per ottenere i tassi di errore di classificazione, l'hai fatto (personalmente)? In tal caso, saprai quali funzionalità sono più importanti e puoi progettare / scegliere un algoritmo migliore.
Indulgere il

Risposte:


6

Per mia curiosità, ho applicato un algoritmo di clustering su cui ho lavorato a questo set di dati.

Ho messo temporaneamente i risultati qui (scegli il set di dati dei saggi).

Sembra che il problema non siano i punti di partenza o l'algoritmo, ma i dati. Puoi "ragionevolmente" (soggettivamente, nella mia esperienza limitata) ottenere buoni cluster anche con 147 istanze purché ci siano alcuni argomenti / concetti / temi / cluster nascosti (qualunque cosa tu voglia chiamare).

Se i dati non hanno argomenti ben separati, indipendentemente dall'algoritmo utilizzato, potresti non ottenere risposte valide.


@ Siddharth.Gopal Grazie mille per la risposta! È vero che mi aspetterei qualche sovrapposizione nei cluster dato che tutti i partecipanti descrivono un'ipotetica organizzazione studentesca (che abbiamo chiamato "BadgerConnect"). Quindi, al contrario, ad esempio, di un'applicazione della modellazione di argomenti su articoli della scienza, in cui alcuni degli argomenti sono molto diversi da carta a carta, gli argomenti sono tutti un po 'simili. Tuttavia, è vero che alcuni dei saggi sono a favore di BadgerConnect e alcuni sono scritti contro BadgerConnect.
Patrick S. Forscher,

È anche vero che i saggi variano ampiamente nel tipo di argomenti che presentano e nel modo in cui gli argomenti vengono presentati. Vorrei catturare parte di quella variabilità, se possibile. Hai idea se sia possibile cogliere alcune di queste distinzioni (per lo meno, la differenza tra saggi a favore e saggi contro questo ipotetico programma studentesco)? Inoltre, i risultati del clustering erano stabili quando hai usato diversi semi casuali?
Patrick S. Forscher,

1
1. Se sei puramente preoccupato per la stabilità dell'algoritmo, prova a eseguire l'algoritmo molte volte e scegli il modello con la più alta probabilità.
Siddharth Gopal,

1
(anche se la stabilità sembra un problema secondario qui). 2. Data la tua descrizione di ciò che ti aspetti in termini di argomenti e opinioni, rappresentare i saggi come un bagaglio di parole non è una buona idea in questo contesto. Il modello di argomento potrebbe, di per sé, non essere un buon strumento per questo. Suggerirei di scegliere alcune parole chiave che ti interessano (come razza, cibo, dormitorio ecc.) E provare ad analizzare il sentimento della frase in cui la parola compare. Ad esempio, dai un'occhiata qui per una demo.
Siddharth Gopal,

1
Python ha un eccellente toolkit NLP chiamato nltk. Potresti voler dare un'occhiata a ciò che offre. Per quanto riguarda tf-idf, "tecnicamente", l'input a LDA dovrebbe essere solo conteggi di parole poiché la distribuzione multinomiale non è definita per numeri reali arbitrari.
Siddharth Gopal,

10
  1. La nozione di "argomenti" nei cosiddetti "modelli di argomenti" è fuorviante. Il modello non conosce o non è progettato per conoscere "argomenti" semanticamente coerenti. Gli "argomenti" sono solo distribuzioni su token (parole). In altre parole, il modello cattura semplicemente la coesistenza di termini di ordine superiore. Se queste strutture significano qualcosa o no non è lo scopo del modello.

  2. Il modello "LDA" ha due parti (essenzialmente tutti i modelli grafici): a) definizione del modello eb) un'implementazione di un algoritmo di inferenza per inferire / parametri del modello immobiliare. La cosa che hai citato potrebbe essere o meno il problema del modello "LDA" ma può essere un bug / errore / errore di configurazione dell'implementazione specifica che hai usato (pacchetto R).

  3. Quasi tutte le implementazioni di "LDA" richiedono una certa randomizzazione. E per natura degli algoritmi di inferenza (ad es. MCMC o inferenza variazionale), otterrai soluzioni minime locali o una distribuzione di molte soluzioni. Quindi, in breve, ciò che hai osservato è in qualche modo previsto.

Suggerimenti pratici:

  1. Prova diversi pacchetti R: ad esempio, questo pacchetto è realizzato dall'ex studente laureato di David Blei. Oppure, prova anche un altro ambiente, come questo . Se ottieni risultati simili da tutti questi pacchetti stabili, almeno riduci un po 'il problema.

  2. Prova a giocare un po 'senza rimuovere le parole d'ordine. La logica è che queste parole chiave svolgono un ruolo importante nel collegare significati semantici in un corpus così piccolo (ad esempio, circa 100 articoli). Inoltre, prova a non filtrare le cose.

  3. Prova a giocare un po 'con gli iperparametri, come diversi numeri di argomenti.

Articoli sulle coerenze degli argomenti:

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

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


Grazie per la risposta. Risponderò ai tuoi commenti uno alla volta. (1) Comprendo che il modello non sa nulla degli argomenti, ma la tua tesi secondo cui le strutture scoperte dai modelli di argomenti (e che se queste strutture significano qualcosa non è lo scopo di questi modelli) è direttamente contraddittoria con questo articolo di revisione di David Blei, il creatore di modelli di argomenti. Mi sembra che lo scopo dei modelli di argomenti sia esattamente quello di aiutare a esplorare / caratterizzare i dati testuali, che è esattamente quello che voglio fare in questo progetto.
Patrick S. Forscher,

(2) Sebbene sia possibile che i miei risultati siano dovuti a un bug, penso sia più probabile che siano dovuti a una sorta di errore da parte mia (e se questo sembra essere il caso, per favore dimmelo!). Sto usando il topicmodelspacchetto in R, che è essenzialmente un'interfaccia R all'algoritmo originale implementato da Blei e colleghi.
Patrick S. Forscher,

(3) So che LDA richiede una certa randomizzazione, quindi non sto chiedendo risultati esatti da una corsa all'altra, ma penso che sia ragionevole aspettarsi argomenti simili usando semi casuali diversi (anzi, credo che questa sia un'aspettativa standard quando le persone usano algoritmi basati sulla randomizzazione). Quello che voglio sapere è come ottenere detta stabilità nei risultati.
Patrick S. Forscher,

@ PatrickS.Forscher Al tuo primo commento: No. è contraddittorio. Il nome "argomenti" è ciò che noi, come esseri umani, mettiamo etichette su quelle distribuzioni di parole. Questa struttura di raggruppamento può o meno essere correlata ad argomenti leggibili dall'uomo nel mondo reale. Esistono numerosi articoli per introdurre la coerenza nei modelli di argomenti per mitigare il problema esatto.
Liangjie Hong,

@ PatrickS.Forscher Al tuo secondo commento: prova alcune implementazioni diverse per vedere se ottieni risultati simili (risultati irragionevoli) o meno. Ad esempio, UMASS Mallet.
Liangjie Hong,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.