ฉันกำลังทำงานในโครงการที่ฉันต้องการดึงข้อมูลบางอย่างเกี่ยวกับเนื้อหาของเรียงความแบบปลายเปิด ในโครงการนี้โดยเฉพาะ 148 คนเขียนบทความเกี่ยวกับองค์กรนักศึกษาสมมุติซึ่งเป็นส่วนหนึ่งของการทดลองที่ใหญ่กว่า แม้ว่าในสาขาของฉัน (จิตวิทยาสังคม) วิธีทั่วไปในการวิเคราะห์ข้อมูลเหล่านี้คือการเขียนเรียงความด้วยมือ แต่ฉันต้องการทำปริมาณเชิงปริมาณเนื่องจากการเขียนโค้ดด้วยมือนั้นใช้ทั้งแรงงานและบิตส่วนตัวเกินไปสำหรับฉัน ลิ้มรส
ในระหว่างการสืบสวนเกี่ยวกับวิธีการวิเคราะห์ข้อมูลการตอบสนองเชิงปริมาณฉันพบวิธีการสร้างหัวข้อ (หรือการปันส่วน Dirichlet หรือ LDA) การสร้างแบบจำลองหัวข้อใช้ตัวแทนข้อมูลของคุณ (เมทริกซ์เอกสารระยะ) และใช้ข้อมูลเกี่ยวกับคำว่าเหตุการณ์ร่วมเพื่อแยกหัวข้อแฝงของข้อมูล วิธีนี้เหมาะสำหรับการสมัครของฉัน
น่าเสียดายที่เมื่อฉันใช้การสร้างแบบจำลองหัวข้อกับข้อมูลของฉันฉันได้ค้นพบสองประเด็น:
- หัวข้อที่เปิดโดยการสร้างแบบจำลองหัวข้อบางครั้งยากที่จะตีความ
- เมื่อฉันเรียกใช้แบบจำลองหัวข้อของฉันอีกครั้งด้วยเมล็ดพันธุ์แบบสุ่มที่แตกต่างกันหัวข้อดูเหมือนจะเปลี่ยนไปอย่างมาก
ปัญหาที่ 2 โดยเฉพาะเกี่ยวกับฉัน ดังนั้นฉันมีคำถามที่เกี่ยวข้องสองคำถาม:
- มีสิ่งใดบ้างที่ฉันสามารถทำได้ในโพรซีเดอร์ LDA เพื่อปรับโมเดลโพรซีเดอร์ของฉันให้เหมาะสมสำหรับการตีความและความเสถียร โดยส่วนตัวฉันไม่สนใจมากนักเกี่ยวกับการหาแบบจำลองที่มีความสับสนและ / หรือแบบจำลองที่ดีที่สุด - ส่วนใหญ่ฉันต้องการใช้ขั้นตอนนี้เพื่อช่วยให้ฉันเข้าใจและอธิบายลักษณะที่ผู้เข้าร่วมในการศึกษานี้เขียนไว้ในบทความของพวกเขา อย่างไรก็ตามฉันไม่ต้องการให้ผลลัพธ์ของฉันเป็นสิ่งประดิษฐ์ของเมล็ดสุ่ม!
- เกี่ยวข้องกับคำถามข้างต้นมีมาตรฐานใดสำหรับข้อมูลที่คุณต้องใช้ในการทำ LDA เอกสารส่วนใหญ่ที่ฉันเคยเห็นที่ใช้วิธีนี้วิเคราะห์ corpora ขนาดใหญ่ (เช่นเอกสารวิทยาศาสตร์ทั้งหมดที่เก็บไว้ในช่วง 20 ปีที่ผ่านมา) แต่เนื่องจากฉันใช้ข้อมูลการทดลองคลังเอกสารของฉันจึงเล็กกว่ามาก
ฉันโพสต์ข้อมูลเรียงความที่นี่สำหรับทุกคนที่ต้องการทำให้มือของเขาหรือเธอสกปรกและฉันได้วางรหัส R ที่ฉันใช้ด้านล่าง
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
ตามคำแนะนำของ Flounderer ในความคิดเห็น น่าเสียดายที่แสดงไว้ด้านล่างแม้ตั้งค่าnstart
เป็น 1,000 ผลลัพธ์ในหัวข้อที่แตกต่างกันอย่างมากจากเมล็ดสุ่มไปยังเมล็ดสุ่ม เพียงเพื่อเน้นอีกครั้งสิ่งเดียวที่ฉันเปลี่ยนแปลงในการประมาณค่าของแบบจำลองทั้งสองด้านล่างนี้คือเมล็ดแบบสุ่มที่ใช้ในการเริ่มต้นการประมาณแบบจำลอง แต่หัวข้อดูเหมือนจะไม่สอดคล้องกันในการวิ่งทั้งสองนี้
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
เพิ่มขนาดให้ใหญ่ขึ้นได้ สิ่งนี้รับประกันได้ว่าจะทำให้ผลลัพธ์ของคุณมีเสถียรภาพมากขึ้นเพราะฟังก์ชั่น LDA จะทำงานซ้ำแล้วซ้ำอีกด้วยการสุ่มเมล็ดที่แตกต่างกันแล้วส่งคืนผลลัพธ์ที่ดีที่สุด แต่น่าเสียดายที่เพิ่มขึ้นnstart
เพื่อพูด, 1000 จะทำให้ขั้นตอนวิธีการทำ 1000 ครั้งมากขึ้นการทำงาน (ต่อ)