일련의 개방형 에세이의 내용에 대한 정보를 추출하려는 프로젝트를 진행 중입니다. 이 특정 프로젝트에서 148 명이 더 큰 실험의 일환으로 가상의 학생 조직에 대한 에세이를 썼습니다. 내 분야 (사회 심리학)에서 이러한 데이터를 분석하는 일반적인 방법은 수필로 수필을 코딩하는 것이지만 수작업으로 코딩하는 것은 노동 집약적이며 너무 주관적이기 때문에 정량적으로 수행하고 싶습니다. 미각.
무료 응답 데이터를 정량적으로 분석하는 방법에 대한 조사 중에 주제 모델링 (또는 Latent Dirichlet Allocation 또는 LDA) 이라는 접근 방식을 발견했습니다 . 주제 모델링은 데이터 (용어-문서 매트릭스)를 단어 단위로 표현하고 동시 발생 단어에 대한 정보를 사용하여 데이터의 잠재적 주제를 추출합니다. 이 접근법은 내 응용 프로그램에 완벽하게 보입니다.
불행히도 데이터에 주제 모델링을 적용했을 때 두 가지 문제가 발견되었습니다.
- 주제 모델링에 의해 밝혀진 주제는 때때로 해석하기 어렵다
- 다른 임의의 시드를 사용하여 주제 모델을 다시 실행하면 주제가 크게 바뀌는 것처럼 보입니다.
문제 2는 특히 저와 관련이 있습니다. 따라서 두 가지 관련 질문이 있습니다.
- 해석 및 안정성을 위해 모델 맞춤 절차를 최적화하기 위해 LDA 절차에서 수행 할 수있는 작업이 있습니까? 개인적으로, 나는 가장 당혹 스럽거나 가장 적합한 모델을 찾는 것에 관심이 없습니다. 저는 주로이 절차를 사용하여이 연구에 참여한 사람들이 자신의 에세이에서 쓴 것을 이해하고 특성화하는 데 도움을주고 싶습니다. 그러나 나는 확실히 내 결과가 임의의 씨앗의 인공물이되기를 원하지 않습니다!
- 위의 질문과 관련하여 LDA를 수행하는 데 필요한 데이터 양에 대한 표준이 있습니까? 필자가 본 방법을 사용한 대부분의 논문은 큰 코 도라 (예 : 지난 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
1000으로 설정하더라도 임의의 시드에서 임의의 시드에 이르기까지 주제가 크게 다릅니다. 다시 강조하기 위해, 아래 두 모델의 추정에서 변경하고있는 유일한 것은 모델 추정을 시작하는 데 사용되는 랜덤 시드 (random seed)이지만,이 두 실행에서 주제가 전혀 일치하지 않는 것 같습니다.
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 배 더 많은 작업을 수행하게됩니다 (계속)