R/실습(project)

[R/실습] Zelensky 대통령 연설문 모음 텍스트 분석 - 연관 분석

연정양 2022. 12. 20.

데이터 정의

 

 

[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")

댓글