Ich arbeite an einem Projekt, in dem ich Informationen über den Inhalt einer Reihe von Aufsätzen mit offenem Ende extrahieren möchte. In diesem speziellen Projekt schrieben 148 Personen Aufsätze über eine hypothetische Studentenorganisation als Teil eines größeren Experiments. Obwohl in meinem Fachgebiet (Sozialpsychologie) die typische Methode zur Analyse dieser Daten darin besteht, die Aufsätze von Hand zu codieren, möchte ich dies quantitativ tun, da das Codieren von Hand sowohl arbeitsintensiv als auch für mich etwas zu subjektiv ist Geschmack.
Bei meinen Untersuchungen zur quantitativen Analyse freier Antwortdaten bin ich auf einen Ansatz gestoßen, der als Themenmodellierung (Latent Dirichlet Allocation, LDA) bezeichnet wird. Bei der Themenmodellierung werden Ihre Daten wortreich dargestellt (eine Begriffsdokumentmatrix). Mithilfe von Informationen zu den Wortkoinzidenzen werden die latenten Themen der Daten extrahiert. Dieser Ansatz scheint perfekt für meine Anwendung zu sein.
Leider habe ich bei der Anwendung der Themenmodellierung auf meine Daten zwei Probleme festgestellt:
- Die durch die Themenmodellierung aufgedeckten Themen sind manchmal schwer zu interpretieren
- Wenn ich meine Themenmodelle mit einem anderen zufälligen Startwert erneut ausführe, scheinen sich die Themen dramatisch zu ändern
Thema 2 betrifft mich besonders. Daher habe ich zwei verwandte Fragen:
- Kann ich im LDA-Verfahren etwas tun, um mein Modellanpassungsverfahren im Hinblick auf Interpretierbarkeit und Stabilität zu optimieren? Persönlich interessiert es mich nicht so sehr, das Modell mit der geringsten Ratlosigkeit und / oder der besten Modellanpassung zu finden. Ich möchte dieses Verfahren hauptsächlich verwenden, um zu verstehen und zu charakterisieren, was die Teilnehmer dieser Studie in ihren Aufsätzen geschrieben haben. Ich möchte jedoch sicher nicht, dass meine Ergebnisse ein Artefakt des Zufallssamens sind!
- Gibt es im Zusammenhang mit der obigen Frage Standards für die Menge der Daten, die Sie für eine LDA benötigen? Die meisten Arbeiten, die ich mit dieser Methode gesehen habe, analysieren große Korpora (z. B. ein Archiv aller wissenschaftlichen Arbeiten der letzten 20 Jahre), aber da ich experimentelle Daten verwende, ist mein Korpus an Dokumenten viel kleiner.
Ich habe die Essay - Daten geschrieben hier für jeden, der seine oder ihre Hände schmutzig machen will, und ich habe die R - Code eingefügt ich unten bin mit.
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))
Bearbeiten:
Ich habe versucht, Änderungen vorzunehmen, nstart
wie von Flounderer in den Kommentaren vorgeschlagen. Leider führt das Setzen nstart
von 1000 , wie unten gezeigt, zu Themen, die von Zufallsstartwert zu Zufallsstartwert sehr stark variieren. Um es noch einmal zu betonen, das Einzige, was ich an der Schätzung der beiden folgenden Modelle ändere, ist der Zufallskeim, der zum Starten der Modellschätzung verwendet wird, und dennoch scheinen die Themen in diesen beiden Läufen überhaupt nicht konsistent zu sein.
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
den Kurs anzupassen und auf der Kurswebsite nachzuschlagen, ob einer von beiden etwas Nützliches ergibt. (Übrigens, wenn Sie Ihre Kommentare in eine Antwort einfügen, werde ich dafür stimmen. Ich würde gerne sehen, ob jemand anders einen Rat hat, bevor ich etwas akzeptiere, aber ich denke, Ihre Kommentare sind mehr als ausreichend, um als Antwort zu gelten.)
LDA
Funktion imtopicmodels
Paket anzupassen . Insbesondere könnten Sie versuchen,nstart
größer zu machen. Dies ist garantiert , um Ihre Ergebnisse stabiler zu machen, da die LDA-Funktion immer wieder mit verschiedenen zufälligen Seeds ausgeführt wird und dann das beste Ergebnis zurückgibt. Unglücklicherweise führt eine Erhöhungnstart
auf beispielsweise 1000 dazu, dass der Algorithmus 1000-mal mehr Arbeit leistet (Fortsetzung)