portfolio

[ R ] R과 python을 활용한 데이터 분석 시각화 #5

yul_S2 2023. 1. 1. 13:20
반응형

 [ 텍스트분석 / 시각화 ] 

Zelensky.txt
0.01MB

 

 

제공된 데이터를 대상으로 텍스트 분석을 실행하시오. 
(1) 제공된 데이터를 이용하여 토픽 분석을 실시하여 단어구름으로 시각화 하고 단어 출현 빈도수를 기반하여 어떤 단어들이 주요 단어인지 설명하시오
(2) 제공된 데이터를 이용하여 연관어 분석을 실시하여 연관어를 시각화 하고 시각화 결과에 대해 설명하시오

 

  • 우크라이나라는 단어가 사전에 등록되어 있지 않기 때문에 먼저 세종 사전에 단어를 추가
  • 단어 단위로 추출하여 전처리를 진행하고, 단어 출현 빈도수를 구하였다.
  • 시각화 할 때 가장 크게 그려지는 단어가 빈도수가 가장 높은 단어이다.
  • 연관어 분석 역시 사용자 정의 함수를 만들어 2글자 이상 5글자 이하 한글을 필터링하고 데이터 정리를 마친 뒤 트랜잭션으로 만들기
  • 연관규칙을 apriori() 함수를 활용

 

3.6.3 ver

(1) 제공된 데이터를 이용하여 토픽 분석을 실시하여 단어구름으로 시각화 하고 단어 출현 빈도수를 기반하여 어떤 단어들이 주요 단어인지 설명하시오

#1 필요한 패키지 불러오기

library(KoNLP)
library(tm)
library(multilinguer)
library(wordcloud)
library(wordcloud2)
library(stringr)
library(tidytext)

 

#2 데이터 불러오기

raw_data <- file("Zelensky.txt")
tdata <- readLines(raw_data)
head(tdata)
str(tdata)
  • 한줄씩 읽기

 

#3 세종 사전에 단어 추가

user_dic <- data.frame(term = c("우크라이나","러시아"),tag = "ncn")
buildDictionary(ext_dic="sejong",user_dic=user_dic)

# 371019 words dictionary was built.
  • ‘우크라이나’,'러시아' 의 경우 세종 사전에 포함되어 있지 않아 추가

 

#4 유의어 처리

data <- str_replace_all(tdata, "사람들", "사람")
data <- str_replace_all(tdata, "영웅들", "영웅")
data <- str_replace_all(tdata, "당신들이", "당신")

 

#5 사용자 정의 함수 작성

exNouns <- function(x){paste(extractNoun(as.character(x)),collapse=" ")}
data_nouns <- sapply(tdata,exNouns)

 

 

#6 추출된 단어를 이용하여 말뭉치(Corpus) 생성

word <- Corpus(VectorSource(data_nouns))

 

 

#7 데이터 전처리

word <- tm_map(word,removePunctuation)                                # 문장부호 제거
word <- tm_map(word,removeNumbers)                                    # 수치 제거
word <- tm_map(word,tolower)                                                   # 소문자 변경
myStopwords = c(stopwords('english'),
                "때문", "이것", "그것", "들이", "해서",
                "무엇", "저들", "이번", "우린", "우리")  
                       # 불용어 제거

zelcorpus <- tm_map(word, removeWords, myStopwords)

 

 

#8 단어 선별하기

zelcorpus_word <- TermDocumentMatrix(zelcorpus,
                           control=list(wordLengths=c(4,20)))
  • 단어 선별은 전처리된 단어집에서 2 ~ 10음절 단어를 대상으로 선정

 

 

#9 matrix 자료 구조를 data.frame 자료 구조로 변경

words <- as.data.frame(as.matrix(zelcorpus_word),stringsAsFactors=F)

 

 

#10 단어 출현 빈도수 구하기

result <- sort(rowSums(words),decreasing=T)
result[1:30]

 

 

#11 단어 구름 적용

df <- data.frame(zelcorpus_word=names(result),freq=result)

 

#12 빈도수 10이상 구하기

word.df <- subset(df, subset = freq >= 10)
head(word.df)
str(word.df)

 

 

#10 단어 구름 생성

wordcloud2(df)

 

 [ 결론 ] 

빈도수는 우리 58회로 가장 높았고 이어서 우크라이나 22 ‘без‘ 13회로 뒤를 이었다. 또한 빈도수에 비례하여 글자 크기가 커지는 것을 알 수 있다.

 

 

 

(2) 제공된 데이터를 이용하여 연관어 분석을 실시하여 연관어를 시각화 하고 시각화 결과에 대해 설명하시오

 

#1 필요한 패키지 불러오기

library(arules)          #트랜잭션 생성
library(backports)    #연관규칙 발견하기
detach(package:tm, unload=TRUE)
library(igraph)

 

 

#2 데이터 불러오기

raw_data <- file("C:/Zelensky.txt")
tdata2 <- readLines(raw_data)
head(tdata2)
  • 한줄씩 읽기

.

#3 줄단위 단어 추출

word <- Map(extractNoun, tdata2)
length(word)
[1] 86
word <- unique(word)
length(word)
[1] 55
  • 한줄씩 읽기

.

#4 중복 단어 제거와 추출 단어 확인

word <- sapply(word, unique)
length(word)
word

.

 

#5 사용자 정의 함수

filter1 <- function(x) {
  nchar(x) <= 5 && nchar(x) >= 2 && is.hangul(x)
}
filter2 <- function(x){Filter(filter1,x)}

 

 

#6 줄단위로 처리된 단어 전처리

word <- sapply(word, filter2)
word

 

#7 트랜잭션 생성

data_tran <- as(word,"transactions")
data_tran 

# 55 transactions (rows) and 213 items (columns)

 

 

#8 연관규칙 찾기

trule <- apriori(data_tran,parameter=list(supp=0.04,conf=0.6))

# [10 rule(s)]
  • 연관규칙 발견을 위해 apriori 함수를 사용했을 때 지지도가 낮아질수록 발견되는 규칙이 많아짐
  • 지지도는 특정 아이템이 데이터에서 발생하는 빈도이기 때문에 지지도를 0.035로 낮추면 더 많은 규칙이 나타남
  • >>> 규칙이 많은게 중요한 것이 아님 >> 볼 수 있는 선에서 규칙수 조정해야한다. 

 

 

#9 시각화

rules <- labels(trule,ruleSep=" ")

 

#9-2 행렬 구조로 변경

rules <- sapply(rules,strsplit," ",USE.NAMES=F)

 

#9-3 행단위로 묶어서 matrix변환

rulemat <- do.call("rbind",rules)

 

#9-4 edgelist  _ single 객체만 시각화

ruleg <- graph.edgelist(rulemat,directed=F)
plot.igraph(ruleg,vertex.label=V(ruleg)$name,

            vertex.label.cex=1.2,vertex.label.color='black',
            vertex.size=20,vertext.color='green',
            vertex.frame.co.or='blue')

 

 

 

 

 [ 결론 ] 

특정 단어가 데이터에서 발생하는 빈도인 지지도가 0.0035 이하일 때는 60개 이상의 데이터가 나타나고, 그보다 큰값일 때는 6~7개 정도만 나타났다. 연설문 데이터 자체의 양이 크지 않기 때문에 지지도가 높은 규칙을 찾아내기 어려웠던 것이다.

 

 

반응형