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"
quelle
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)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.)Antworten:
Aus Neugier wendete ich einen Clustering-Algorithmus an, an dem ich an diesem Datensatz gearbeitet habe.
Ich habe die Ergebnisse vorübergehend hier veröffentlicht (wählen Sie den Datensatz für die Aufsätze).
Es scheint, dass das Problem nicht die Ausgangspunkte oder der Algorithmus sind, sondern die Daten. Sie können (subjektiv, nach meiner begrenzten Erfahrung) auch mit 147 Instanzen vernünftigerweise gute Cluster erhalten, solange es einige versteckte Themen / Konzepte / Themen / Cluster gibt (wie auch immer Sie es nennen möchten).
Wenn die Daten keine gut getrennten Themen enthalten, erhalten Sie unabhängig vom verwendeten Algorithmus möglicherweise keine guten Antworten.
quelle
Der Begriff "Themen" in sogenannten "Themenmodellen" ist irreführend. Das Modell kennt semantisch kohärente "Themen" überhaupt nicht oder ist nicht darauf ausgelegt, sie zu kennen. Die "Themen" sind nur Verteilungen über Token (Wörter). Mit anderen Worten, das Modell erfasst nur das gleichzeitige Auftreten von Termen höherer Ordnung. Ob diese Strukturen etwas bedeuten oder nicht, ist nicht der Zweck des Modells.
Das "LDA" -Modell besteht aus zwei Teilen (im Wesentlichen allen grafischen Modellen): a) Modelldefinition und b) Implementierung eines Inferenzalgorithmus zum Ableiten / Kombinieren von Modellparametern. Das, was Sie erwähnt haben, kann das Problem des "LDA" -Modells sein oder nicht, kann aber ein Fehler / Fehler / eine Fehlkonfiguration der von Ihnen verwendeten spezifischen Implementierung sein (R-Paket).
Fast alle Implementierungen von "LDA" erfordern eine gewisse Randomisierung. Aufgrund der Art der Inferenzalgorithmen (z. B. MCMC oder Variationsinferenz) erhalten Sie lokale Mindestlösungen oder eine Verteilung vieler Lösungen. Kurz gesagt, was Sie beobachtet haben, wird irgendwie erwartet.
Praktische Vorschläge:
Probieren Sie verschiedene R-Pakete aus: Dieses Paket wird beispielsweise von David Blei's ehemaligem Doktoranden erstellt. Oder versuchen Sie es mit einer anderen Umgebung, wie dieser . Wenn Sie zumindest mit all diesen stabilen Paketen ähnliche Ergebnisse erzielen, verringern Sie das Problem ein wenig.
Versuchen Sie ein bisschen zu spielen, ohne die Stoppwörter zu entfernen. Das Grundprinzip ist, dass diese Stoppwörter eine wichtige Rolle bei der Verknüpfung semantischer Bedeutungen in einem so kleinen Korpus (z. B. etwa 100 Artikel) spielen. Versuchen Sie auch, Dinge nicht zu filtern.
Versuchen Sie, ein wenig mit Hyperparametern zu spielen, beispielsweise mit einer unterschiedlichen Anzahl von Themen.
Artikel über Themenkohärenzen:
http://www.aclweb.org/anthology-new/D/D12/D12-1087.pdf
http://people.cs.umass.edu/~wallach/publications/mimno11optimizing.pdf
quelle
topicmodels
Paket in R, das im Wesentlichen eine R-Schnittstelle zu dem von Blei und Kollegen implementierten ursprünglichen Algorithmus ist.