지난 포스팅에서는 어린이 자외선 차단제 댓글들을 이용하여 품사분석, 전처리 그리고 빈도분석까지 실행해 보았습니다. 이번 포스팅에서는 이어서 잠재 디리클레 할당(Latent Dirichlet Allocation, 이하 LDA) 기반의 토픽 모델링 분석 결과와 R 코딩을 공유하겠습니다. 분석 절차와 내용을 간단히 설명하면, 다음과 같습니다. 첫째 토픽 모델링 분석을 위한 R 패키지인 topicmodels을 추가 설치한 후, 명사만 추출하여 Document Term Matrix(이하 DTM)을 생성합니다. 둘째, 임의로 토픽 수를 5개로 설정한 후, 토픽 모델링 분석 결과를 제시합니다. 셋째, ldatuning R 패키지를 추가 설치한 후, 최적의 토픽 수를 결정합니다. 넷째, 최적의 토픽 수 기반의 새로운 토픽 모델 분석 결과를 시각화하여 제시합니다. 마지막으로 이번 포스팅에서 사용한 R 코드는 포스팅 맨 아래 업로드해 두겠으니 필요한 분들은 참고하시기 바랍니다.
1. Topicmodels 패키지 추가 설치 및 전처리
이전 포스팅(댓글 분석 │어린이 자외선 차단제 │R 한글 텍스트 마이닝)에서 사용하였던 댓글 데이터와 R 텍스트 마이닝 코드를 그대로 이어서 사용합니다. 단, LDA 기반의 토픽 모델링 분석을 위한 추가 패키지 설치가 필요하며, 데이터 정제까지의 R 코드는 다음과 같습니다.
# 추가 패키지 설치 및 로딩
install.packages("topicmodels")
library(topicmodels)
# 데이터 전처리 (정제) - id 추가
naverq_reviews <- naverq %>%
mutate(reviews = str_replace_all(reviews, "[^가-힣]", " "),
reviews = str_squish(reviews),
id = row_number())
2. 품사 분석, 명사 추출 및 DTM 생성
SimplePos09 기반의 품사 분석 후, 명사를 추출하고, naverq_reviews의 id를 유지한 상태에서 결합한 후, DTM을 생성하는 R 코드는 다음과 같습니다.
# 품사분석
reviews_pos <- naverq_reviews %>%
unnest_tokens(input = reviews,
output = pos,
token = SimplePos09,
drop = F)
# 명사 추출
reviews_pos_nouns <- reviews_pos %>%
filter(str_detect(pos, "/n")) %>%
mutate(word = str_remove(pos, "/.*$")) %>%
filter(str_length(word) > 1)
# naverq_reviews의 id를 유지한 상태에서 결합
reviews_pos_nouns <- reviews_pos_nouns %>%
select(id, word) %>% # id와 word만 남김
count(id, word, sort = TRUE) %>% # 단어 빈도 계산
filter(n > 1)
# Document-Term Matrix 생성
dtm <- reviews_pos_nouns %>%
cast_dtm(document = id, term = word, value = n)
3. LDA 토픽 모델링 분석 결과
임의로 토픽 수를 5개로 설정한 후, 각 토픽별로 10개의 상위 단어들을 추출하고, 각 토픽에 적정한 이름을 지정한 후, 토픽 모델 분석 결과를 도출하는 R 코드는 다음과 같습니다.
# LDA 모델 생성 (토픽 수 5개로 설정)
lda_model <- LDA(dtm, k = 5, control = list(seed = 1234))
# 각 문서가 속하는 토픽 확인
topics <- tidy(lda_model, matrix = "beta")
# 토픽별 상위 단어 추출
top_terms <- topics %>%
group_by(topic) %>%
slice_max(beta, n = 10) %>%
ungroup() %>%
arrange(topic, -beta)
# 각 토픽에 이름 지정
topic_names <- c("토픽 1: 사용자 경험", "토픽 2: 제품 성능", "토픽 3: 가격 및 가치", "토픽 4: 디자인 및 외관", "토픽 5: 부작용 및 문제점")
# 토픽 이름을 데이터에 추가
top_terms_named <- top_terms %>%
mutate(topic_name = topic_names[topic])
# 결과 확인
print(top_terms_named)
# 시각화 - 토픽별 상위 단어 시각화
top_terms_named %>%
ggplot(aes(x = reorder_within(term, beta, topic_name), y = beta, fill = as.factor(topic_name))) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic_name, scales = "free_y") +
coord_flip() +
scale_x_reordered() +
labs(title = "토픽 모델링 결과", x = NULL, y = "Beta 값") +
theme_minimal()
4. ldatuning 패키지 추가 설치
이번에는 임의로 토픽 수를 결정하지 않고, ldatunning 패키지를 설치한 후, 최적 토픽 수를 탐색 및 결정하는 R 코드를 소개하면 다음과 같습니다.
# 추가 패키지 설치 및 로딩
install.packages("ldatuning")
library(ldatuning)
# Document-Term Matrix(DTM) 생성
# 이전 분석에서 만든 reviews_pos_nouns 데이터를 이용
dtm <- reviews_pos_nouns %>%
cast_dtm(document = id, term = word, value = n)
5. 최적 토픽 수 탐색과 결정
먼저 최적 토픽 수의 탐색 범위를 설정하는데요. 일단 이번 포스팅에서는 2개에서 10까지 탐색 범위를 지정하고, 최적 토픽 수를 결정하는 R 코드는 다음과 같습니다.
# 토픽 수 탐색 범위 설정
k_values <- c(2:10)
# 최적의 토픽 수 결정 (지표: Arun, CaoJuan, Deveaud, Griffiths2004, 등)
result <- FindTopicsNumber(
dtm,
topics = k_values,
metrics = c("Arun2010", "CaoJuan2009", "Griffiths2004", "Deveaud2014"),
method = "Gibbs",
control = list(seed = 1234),
mc.cores = 2L, # CPU 코어 수 (병렬 처리)
verbose = TRUE
)
# 결과 시각화
FindTopicsNumber_plot(result)
6. LDA 토픽 모델링 수정 분석 결과
앞서 ldatuning 패키지를 이용하여 최적의 토픽 수를 결정할 수 있는 R 코드를 소개하였습니다. 분석 결과를 통해 만약 6개의 토픽이 최적의 수라고 결정하였다는 가정하에 LDA 토픽 모델링 분석을 수정한 R 코드, 분석 결과 및 시각화 결과는 다음과 같습니다. 또한 이번 포스팅에서 사용한 전체 R 코드도 함께 올려두겠습니다. 관심 있는 분들은 내려받은 후, 테스트해 보시기 바랍니다.
# LDA 모델 생성 (토픽 수 6개로 설정)
lda_model <- LDA(dtm, k = 6, control = list(seed = 1234))
# 각 문서가 속하는 토픽 확인
topics <- tidy(lda_model, matrix = "beta")
# 토픽별 상위 단어 추출
top_terms <- topics %>%
group_by(topic) %>%
slice_max(beta, n = 10) %>%
ungroup() %>%
arrange(topic, -beta)
# 각 토픽에 이름 지정 (6개의 토픽에 대한 이름)
topic_names <- c("토픽 1: 사용자 경험",
"토픽 2: 제품 성능",
"토픽 3: 가격 및 가치",
"토픽 4: 디자인 및 외관",
"토픽 5: 부작용 및 문제점",
"토픽 6: 사용 편의성")
# 토픽 이름을 데이터에 추가
top_terms_named <- top_terms %>%
mutate(topic_name = topic_names[topic])
# 결과 확인
print(top_terms_named)
# 시각화 - 토픽별 상위 단어 시각화
top_terms_named %>%
ggplot(aes(x = reorder_within(term, beta, topic_name), y = beta, fill = as.factor(topic_name))) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic_name, scales = "free_y") +
coord_flip() +
scale_x_reordered() +
labs(title = "토픽 모델링 결과", x = NULL, y = "Beta 값") +
theme_minimal()
7. 정리
이번 포스팅에서는 R 기반의 한글 텍스트 마이닝 분석 방법 중 LDA 토픽 모델링 분석을 위한 R 코드를 공유하였습니다. 분석하는 사람이 임의로 토픽 수를 결정하여 토픽 모델링을 실행하는 경우와 ldatuning 패키지를 이용하여 최적 토픽 수를 탐색한 후, 최적의 토픽 수를 결정하는 방법, 두 가지를 모두 제시하였으므로 분석 목적에 맞게 적절히 사용하시기 바랍니다. 그 외 분석 이론 자체가 워낙 유명한 분석 방법이라 관련 이론은 별도 설명하지 않았습니다만, 조그만 구글링 해보면 해당 이론에 관한 다양한 정보들을 획득할 수 있으므로 관련 정보들을 참고하시기 바랍니다. 최근 관련 논문도 하나 링크해두겠씁니다. 마지막으로 R을 이용한 한글 텍스트 마이닝 시리즈는 이 정도에서 마무리하겠습니다. 도움이 되셨기를 바랍니다.
'정보' 카테고리의 다른 글
SWOT 과 SWOC │PPT 무료 다운로드 │경영학 강의 자료 (19) | 2024.11.14 |
---|---|
서치GPT 이용 절차와 잘 사용하는 방법 추천 │예시 사례 Best 10 (17) | 2024.11.13 |
숏폼 AI│아마존 숏폼 무료 온라인에서 만들기 │비드노즈 사용법 (7) (11) | 2024.09.25 |
온라인 무료 AI 아바타 만들기 │말하는 AI 인플루언서 만들기 │AIEASE와 VIDNOZ 사용법 (3) | 2024.09.24 |
선물 AI 아이디어│AI 기념품 생일 선물 추천│아마존 (3) | 2024.09.23 |