데이터 정의
[R/실습] Zelensky 대통령 연설문 모음 텍스트 분석 - 단어 구름 생성
분석 목적 Zelensky 의 연설문에 기반한 빈도 분석에 따른 단어구름 생성을 기술한다. 그에 따라 현재 우크라이나가 러시아에 대해 취하는 태도를 살펴보고, 나아가 어떠한 부분에서 훌륭한 지도
robinlovesyeon.tistory.com
위 게시글 참고. 연관 분석에서는 단어 구름 과정에서 전처리한 데이터가 아닌, 원본 데이터를 다시 사용했다.
텍스트 전처리
1) library 호출 및 데이터 불러오기
library(arules)
library(backports)
library(igraph)
library(KoNLP)
library(tm)
library(multilinguer)
library(stringr)
library(tidytext)
raw_zel2 <- readLines("zelensky.txt", encoding = "UTF-8")
2) 줄 단위 단어 추출, 추출 단어 확인
lword <- Map(extractNoun, raw_zel2)
length(lword)
lword <- unique(lword)
length(lword)
lword <- sapply(lword, unique)
length(lword)
lword
readLines로 줄 단위로 읽어온 데이터를 extractNoun로 줄 단위로 단어를 추출하고, unique 함수로 중복 단어를 제거해주었다. 아래는 그 결과 중 일부를 정리한 표이다.
unique 처리 전 | unique 처리 후 |
[1] "우리", "오크와", "엘프", "사이[9]", "완충지대", "우리", "정상", "국가" | [1] "우리", "오크와", "엘프", "사이[9]", "완충지대", "정상", "국가", "풍족" |
[9] "풍족", "한", "국가", "우리", "사정" "우리", "소유", "명분" | [9] "한", "사정", "소유", "명분", "것" "저", "끝", "위대" |
[17] "것", "저", "우리", "끝", "우리" "위대", "한", "국가" | [17] "이룩", "기회", "우크라이나", "국민" "들", "분열", "반대", "하나" |
중복 단어 “우리”, “국가”, “한”이 unique 처리 후에 한 개씩만 남아 있음을 확인할 수 있다.
3) 필터링 함수를 통한 전처리
filter1 <- function(x){
nchar(x) <= 10 && nchar(x) >=2 && is.hangul(x)
}
filter2 <- function(x){Filter(filter1, x)}
lword <- sapply(lword, filter2)
lword
연관 분석
1) 트랜잭션 생성 및 연관규칙 발견
wordtran <- as(lword, "transactions")
wordtran
tranrules <- apriori(wordtran, parameter = list(supp=0.04, conf = 0.6))
#detach(package:tm, unload =TRUE)
inspect(head(sort(tranrules, by = "lift")))
rules <- labels(tranrules)
rules <- sapply(rules, strsplit, " ", USE.NAMES = F)
rules
rulemat <- do.call("rbind", rules)
class(rulemat)
rulemat
생성된 트랜잭션을 기반으로 연관규칙을 matrix로 변환했다. supp값을 0.04, conf 값을 0.6으로 조정하여 총 118개의 연관규칙을 도출했는데, 본 보고서에서는 원활한 분석을 위해 118개 중 60개의 single 객체만을 활용하여 시각화 및 분석을 진행했다.
2) edgelist 시각화
ruleg <- graph.edgelist(rulemat[c(1:60),-2], directed = F)
plot.igraph(ruleg, vertex.label = V(ruleg)$name,
edge.lty = "solid", edge.width = 1.5,
vertex.label.cex =1.2, vertex.label.color = 'black',
vertex.size = 20, vertex.color = "#a1d76a",
vertex.frame.color = "black")
3) 결과 분석
연관분석 시각화 결과, “우리” 와 “우크라이나” 두 단어를 중심으로 이루어진 단어 간 연관성을 확인할 수 있었다. 중심 단어와 다른 단어들 간의 거리가 모두 유사한 것으로 보아, 어떤 단어를 크게 강조했기 보다는 “우리”를 중심으로 다양한 단어들을 폭넓게 사용했다는 결론을 얻을 수 있다.
소스 코드
raw_zel2 <- readLines("zelensky.txt", encoding = "UTF-8")
#줄 단위 단어 추출
lword <- Map(extractNoun, raw_zel2)
length(lword)
lword <- unique(lword)
length(lword)
#중복 단어 제거와 추출 단어 확인
lword <- sapply(lword, unique)
length(lword)
lword
#연관어 분석을 위한 전처리
#필터링 함수 정의
filter1 <- function(x){
nchar(x) <= 10 && nchar(x) >=2 && is.hangul(x)
}
filter2 <- function(x){Filter(filter1, x)}
#줄 단위로 처리된 단어 전처리
lword <- sapply(lword, filter2)
lword
#트랜잭션 생성
library(arules)
#트랜잭션 생성
wordtran <- as(lword, "transactions")
wordtran
#연관규칙 발견하기
library(backports)
#연관규칙
tranrules <- apriori(wordtran, parameter = list(supp=0.04, conf = 0.6))
#연관규칙 생성 결과보기
#detach(package:tm, unload =TRUE)
inspect(head(sort(tranrules, by = "lift")))
#연관어 시각화
rules <- labels(tranrules)
rules
#행렬구조로 변경
rules <- sapply(rules, strsplit, " ", USE.NAMES = F)
rules
#행 단위로 묶어서 matrix로 변환
rulemat <- do.call("rbind", rules)
class(rulemat)
rulemat
#edgelist #single 객체만 시각화
library(igraph)
ruleg <- graph.edgelist(rulemat[c(1:60),-2], directed = F)
plot.igraph(ruleg, vertex.label = V(ruleg)$name,
edge.lty = "solid", edge.width = 1.5,
vertex.label.cex =1.2, vertex.label.color = 'black',
vertex.size = 20, vertex.color = "#a1d76a",
vertex.frame.color = "black")
'R > 실습(project)' 카테고리의 다른 글
[R/머신러닝/실습] 단순 선형회귀 분석 (0) | 2023.01.05 |
---|---|
[R/실습] ggplot2를 이용한 iris 데이터 시각화 (0) | 2023.01.03 |
[R/실습] Zelensky 대통령 연설문 모음 텍스트 분석 - 단어 구름 생성 (1) | 2022.12.20 |
[R/실습] 선형회귀분석을 이용한 BostonHousing 예측분석 (0) | 2022.12.20 |
[R/실습] 의사결정나무를 이용한 BostonHousing 예측분석 (0) | 2022.12.20 |
댓글