मैं एक ऐसी परियोजना पर काम कर रहा हूं, जहां मैं ओपन-एंडेड निबंधों की एक श्रृंखला की सामग्री के बारे में कुछ जानकारी निकालना चाहता हूं। इस विशेष परियोजना में, 148 लोगों ने एक बड़े प्रयोग के एक काल्पनिक छात्र संगठन के बारे में निबंध लिखा। यद्यपि मेरे क्षेत्र में (सामाजिक मनोविज्ञान), इन आंकड़ों का विश्लेषण करने का विशिष्ट तरीका हाथ से निबंधों को कोड करना होगा, मैं इसे मात्रात्मक रूप से करना चाहूंगा, क्योंकि हाथ-कोडिंग दोनों श्रम-गहन और मेरे लिए थोड़ा बहुत व्यक्तिपरक है। स्वाद।
मात्रात्मक तरीके से मुक्त प्रतिक्रिया डेटा का विश्लेषण करने के तरीकों के बारे में मेरी जांच के दौरान, मैं विषय मॉडलिंग (या अव्यक्त डिरिचलेट आवंटन, या एलडीए) नामक एक दृष्टिकोण पर ठोकर खाई । विषय मॉडलिंग आपके डेटा (एक टर्म-डॉक्यूमेंट मैट्रिक्स) का एक बैग-ऑफ-वर्ड्स प्रतिनिधित्व लेता है और डेटा के अव्यक्त विषयों को निकालने के लिए शब्द सह-घटनाओं के बारे में जानकारी का उपयोग करता है। यह दृष्टिकोण मेरे आवेदन के लिए एकदम सही लगता है।
दुर्भाग्य से, जब मैंने विषय मॉडलिंग को अपने डेटा पर लागू किया है, तो मैंने दो मुद्दों की खोज की है:
- विषय मॉडलिंग द्वारा उजागर किए गए विषय कभी-कभी व्याख्या करना कठिन होते हैं
- जब मैं अपने विषय मॉडल को एक अलग यादृच्छिक बीज के साथ फिर से चलाता हूं, तो विषय नाटकीय रूप से बदलने लगते हैं
अंक 2 में मुझे विशेष चिंता है। इसलिए, मेरे पास दो संबंधित प्रश्न हैं:
- व्याख्या और स्थिरता के लिए मेरे मॉडल फिट प्रक्रिया का अनुकूलन करने के लिए एलडीए प्रक्रिया में कुछ भी हो सकता है? व्यक्तिगत रूप से, मुझे सबसे कम गड़बड़ी और / या सबसे अच्छे मॉडल के साथ मॉडल खोजने के बारे में ज्यादा परवाह नहीं है - मैं मुख्य रूप से इस प्रक्रिया का उपयोग मुझे समझने और चरित्र वर्णन करने में मदद करना चाहता हूं कि इस अध्ययन में प्रतिभागियों ने अपने निबंधों में क्या लिखा है। हालांकि, मैं निश्चित रूप से नहीं चाहता कि मेरे परिणाम यादृच्छिक बीज की एक कलाकृतियों के रूप में हों!
- उपरोक्त प्रश्न से संबंधित, क्या आपको एलडीए करने के लिए कितने डेटा की आवश्यकता है, इसके लिए कोई मानक हैं? मैंने देखा है कि इस पद्धति का उपयोग करने वाले अधिकांश कागजात बड़े कॉर्पोरा (पिछले 20 वर्षों के सभी विज्ञान पत्रों का एक संग्रह) का विश्लेषण करते हैं, लेकिन, चूंकि मैं प्रयोगात्मक डेटा का उपयोग कर रहा हूं, इसलिए दस्तावेजों का मेरा कोष बहुत छोटा है।
मैंने यहां निबंध डेटा पोस्ट किया है जो कोई भी अपने हाथों को गंदा करना चाहता है, और मैंने नीचे उपयोग किए जाने वाले आर कोड को चिपका दिया है।
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))
संपादित करें:
मैंने nstart
टिप्पणियों में फ्लाउंडर द्वारा सुझाए गए तरीके को संशोधित करने की कोशिश की । दुर्भाग्य से, जैसा कि नीचे दिखाया गया है, यहां तक nstart
कि उन विषयों में 1000 परिणामों पर सेट करना जो यादृच्छिक बीज से यादृच्छिक बीज में काफी नाटकीय रूप से भिन्न होते हैं। बस फिर से जोर देने के लिए, केवल एक चीज जिसे मैं नीचे दो मॉडलों के अनुमान में बदल रहा हूं वह है मॉडल अनुमान लगाने के लिए उपयोग किए जाने वाले यादृच्छिक बीज, और फिर भी विषय इन दो रन के अनुरूप नहीं लगते हैं।
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
लिए पाठ्यक्रम वेबसाइट को समायोजित करने और देखने की कोशिश करूंगा कि क्या उनमें से कुछ भी उपयोगी है। (BTW, यदि आप किसी उत्तर में अपनी टिप्पणी डालते हैं, तो मैं उसे वोट करूंगा। मैं यह देखना चाहूंगा कि क्या किसी और की सलाह लेने से पहले मेरे पास कोई सलाह है, लेकिन मुझे लगता है कि आपकी टिप्पणियां उत्तर के रूप में गिनने के लिए पर्याप्त हैं।
LDA
में फ़ंक्शन में नियंत्रण मापदंडों को समायोजित करने का प्रयास कर सकते हैंtopicmodels
। विशेष रूप से, आपnstart
बड़ा बनाने की कोशिश कर सकते हैं । यह आपके परिणामों को और अधिक स्थिर बनाने की गारंटी है, क्योंकि एलडीए फ़ंक्शन बस अलग-अलग यादृच्छिक बीजों के साथ बार-बार चलेगा और फिर सर्वोत्तम परिणाम लौटाएगा। दुर्भाग्यnstart
से, कहने के लिए, 1000 बढ़ रहा है, एल्गोरिथ्म 1000 गुना अधिक काम करेगा (cont'd)