본문 바로가기

좋아하는 것_매직IT/25.R

텍스트 마이닝과 워드클라우드를 활용한 빈번하게 사용된 단어 한눈에 알아보기

반응형

 

텍스트 마이닝(Text mining)에 대해서 간단하게 정리해보자면요.
텍스트 마이닝은 문자로 된 데이터에서 가치있는 정보를 얻어내는 분석기법을 말합니다. 

그럼 텍스트 마이닝을 하려면 어떻게 해야 할까요?
우선, 문장을 구성하는 어절들이 어떤 품사로 되어 있는지 파악을 해야하는데요...
이것을 우리는 보통 "형태소 분석(Morphology Analysis)" 이라고 말을 하곤 하지요...

형태소 분석으로 어절들의 품사를 파악한 후 명사,동사, 형용사 등 의미를 지닌 품사의 단어들을 추출해 각 단어가 얼마나 많이 등장했는지 확인하면 되고요..

텍스트 마이닝을 이용해서 SNS 나 웹사이트에 올라온 글을 분석하면 사람들이 어떤 이야기를 나누고 있는 한눈에 파악할 수 있습니다. 

그럼, 텍스트 마이닝을 하기 위해서 초기 작업을 차근차근 준비해 볼까요?

우선, 한글 자연어 분석 패캐지가 필요한데요...

KoNLP(Korean Natural Language Processing)을 이용하면 한글 데이터로 형태소 분석이 가능합니다. 
참고로, KoNLP는 Java 가 설치되어 있어야 사용할 수 있다는 사실 머릿속에 넣어두시고요..
만약 Java가 설치가 안되어 있으신분께서는 꼭 Java 를 설치하시고 시작하시길 추천드립니다.

Java 설치는 아래 페이지에서 하시면 되고요..

 

 


그리고, KoNLP 를 사용하려면 아래 패키지가 설치되어 있어야 합니다. 
 - rJava 패캐지
 - memoise 패캐지
위의 두 패캐지를 꼭 설치하신후에 KoNLP 를 설치하시고요...
KoNLP 가 설치되셨으면, 워크 클라우드를 사용하기 위해서 wordcloud 도 같이 설치합니다. 
참고로, KoNLPwordcloud  패키지 설치는 아래와 같이 진행하시면 됩니다. 

그리고, 설치를 했으니 패캐지를 사용하려면 로드 해야 겠죠? 
(로드는 아래와 같이 하시면 됩니다. )

간단하죠!! 
로드하는 패캐지에 대해서 간단하게 설명드리자면요..
우선, rJava 패키지는 java의 풍부한 생태계를 R에서 사용하기 위해 꼭 필요한 인터페이싱 패키지입니다. 비슷한 부류로 python의 reticulate, C++의 Rcpp 등이 있죠.
(참고로, 모두 각각의 언어를 설치하고 경로 설정을 해줘야 하는 단계를 가지고 있습니다.)

그리고 dplyr 패캐지는 전처리 작업에 사용하려고 합니다.
한마디로, dplyr 패키지는 Hadley Wickham가 작성한 데이터 처리에 특화된 R 패키지라고 머릿속에 넣어두시면 되고요..

이어서, stringr 이라는 패캐지가 눈에 들어오실텐데요...
stringr 패캐지는 특수문자를 제거하기 위해서 사용하는데요.
만약 문장에 이모티콘이나 특수문자가 포함되어 있으면 오류가 발생할 수 있겠죠??
(그래서 해당 패키지를 통해서 특수문자제거작업을 할 예정입니다. )

마지막으로 RColorBrewer 는 색조를 사용해서 시각적으로 표현할 때 사용하는 패키지라고 머릿속에 넣어두시면 되고요..

이제 사전작업이 마무리 되었으니깐요...본격적으로 프로그래밍을 해보죠...
(참고로, 아래와 같이 진행할건데요..)

1.텍스트 마이닝 
 - 사전설정하기
 - 데이터준비및 불러오기
 - 특수문자제거하기
2.가장 많이 사용된 단어 확인
  - 명사추출하기
  - 단어빈도표만들기
3.워드 클라우드 만들기
 - 단어색상목록만들기
 - 난수 고정하기 
 - 워드 클라우드 만들기

우선, 텍스트 마이닝코드는 아래와 같습니다. 


위의 텍스트 마이닝 관련 위의 코드를 간단하게 설명하자면요..
 - NIA사전을 설정하는 부분이 존재하고요.. (22번줄)
   - 부연설명하자면요.. NIA사전은 무려 121만여개의 단어로 구성되어 있고요
   - 형태소 분석을 하는데 해당 사전을 이용합니다.
 - 데이터를 불러오는 부분..(24번줄)
   - readLines() 함수를 통해서 데이터를 불러오고요..
   - head 함수를 사용하면 아래와 같이 정상적으로 텍스트를 로딩했는지 확인할 수 있고요..

참고로, 위로부터 2줄만 보고 싶다그러면 아래와 같이 명령하시면 됩니다. 

뒤에서 2줄은 tail 이겠죠? 


 - 마지막으로 특수문자제거하는 부분으로 구성되어 있습니다. (26번줄)
  - stringr의 str_replace_all() 함수를 이용해서  문장에 들어있는 특수문자를 빈칸으로 수정합니다.
  - 참고로, "\\W" 는 특수문자를 의미하는 정규표현식(Regular Expression) 이고요..

그럼, 가장 많이 사용된 단어를 확인하러가 볼까요? 코드는 아래와 같습니다. 

간단하게 소스를 정리해보자면요..아래와 같이 정리할 수 있겠군요..
  - 명사추출하기
     - 위의 소스 35줄을 보시면, extractNoun() 함수를 사용하시면 문장에서 명사를 추출하실 수 있고요.. 
  - 단어빈도표만들기
     - 38번줄에서 추출한 빈도표는 테이블구조니깐요..
     - 41번줄에서 데이터 프레임으로 변환한거고요...(참고로 44번줄로 변수명도 수정해주었습니다. 사용하기 편리하게요 ㅎㅎ)
    - 47번줄에서 두글자이상 단어를 추출했고요...
    - 50번줄에서 빈도순으로 정렬후, 50개의 단어를 추출했습니다. 

그럼, 마지막으로 워드 클라우드를 만들어 보겠습니다. 
워드클라우드로 생성하면 한눈에 바로 해당 글이 무엇을 중점으로 나타내고 있는지 확인할 수 있겠죠?
워드 클라우드 소스는 아래와 같고요..

워드 클라우드 소스관련 위의 코드를 간단하게 설명하자면요..
 - 단어색상목록만들기
    - 55번줄에서 RColorBrewer 패캐지의 brewer.pal() 함수를 사용해서 단어의 색깔을 지정할 때 사용할 색상코드 목록을 만들고요.. 
    - 참고로, Dark2 색상 목록에서 8개 색상을 추출하는 코드입니다. 
 - 난수 고정하기 
    - wordcloud() 함수는요 실행할 때마다 난수를 이용해서 매번 다른 모양의 워드 클라우드를 만들어내기때문에 
57번줄을 사용해서 난수를 고정해서, 항상 동일한 워드클라우드가 생성되도록 합니다. 
 - 워드 클라우드 만들기
     - 59번줄은 바로 워드클라우드를 만드는것이고요..wordcloud 의 파라미터들은 워드 클라우드 모양을 결정하게됩니다. 

아래는 이해하기 쉽도록 주석을 한번 달아봤습니다. 

전체 소스는 아래와 같고요..

.libPaths("E:/0.dev/15.dev-r-project/Library")
Sys.setenv(JAVA_HOME='D:\\0.dev.framework\\openjdk-13.0.2_windows-x64_bin\\jdk-13.0.2')

# Install Package
install.packages("rJava")
install.packages("memoise")
remotes::install_github('haven-jeon/KoNLP', upgrade = "never", INSTALL_opts=c("--no-multiarch"), force = TRUE)
install.packages("stringr")
install.packages("wordcloud")

# Load Package
library(rJava)
library(KoNLP)
library(dplyr)
library(stringr)
library(RColorBrewer)
library(wordcloud)

#텍스트 마이닝 소스
#1.사전설정, NIA사전은 121만여개의 단어로 구성
useNIADic()
#2.데이터 불러오기
txt <- readLines("E:\\0.dev\\15.dev-r-project\\example\\3.text_mining\\devocean.txt", encoding = 'UTF-8')
head(txt)
tail(txt, n=2)
txt

#3.특수문자제거하는 부분(빈칸으로!!)
txt <- str_replace_all(txt, "\\W", " ")
txt

#가장많이 사용된 단어 확인 소스
#1.명사를 추출
nonus <- extractNoun(txt)

#2. 추출한 명사 리스트를 문자열 벡터로 변환, 단어별 빈도표 작성
wordcount <- table(unlist(nonus))

#3.데이터 프레임으로 변환작업
df_word <- as.data.frame(wordcount, stringsAsFactors = F)

#4.변수명 수정
df_word <- rename(df_word, word = Var1, freq = Freq)

#5.두글자이상 단어 추출
df_word <- filter(df_word, nchar(word) >= 2)

#6.빈도순으로 정렬 후 상위50개단어를추출
top_50 <- df_word %>% arrange(desc(freq)) %>% head(50)
top_50

#워드클라우드만들어보기
#1.단어색상목록생성
pal <- brewer.pal(8,"Dark2")
#2.난수고정하기
set.seed(1234)
#3.워드 클라우드 생성
wordcloud(words = df_word$word, #단어
          freq = df_word$freq,  #빈도
          min.freq = 1,         #최소 단어 빈도
          max.words = 100,      #표현 최대 단어 수 
          random.order = F,     #고빈도 단어 중앙 배치
          rot.per = .1,         #회전 단어 비율
          scale = c(4,0.3),     #단어 크기 범위
          colors = pal)         #색상목록



그럼 실행해볼까요? 실행하면 아래와 같이 워드클라우드를 만나실 수 있습니다.


아무튼 오늘 블로그는 여기까지고요...

이만 줄이겠습니다. 
항상 믿고 봐주셔서 감사합니다..

오늘도 마지막까지 제 글을 끝까지 읽어주셔서 진심으로 감사드리고, 제 글이 조금이라도 여러분의 각자의 삶을 살아가시는데 도움이 되셨길 기원합니다.

앞으로도 더욱 좋은 블로그를 남기는 제가 되도록 노력하겠습니다.

​그리고, 제 글을 읽으시면 말이 됩니다.
항상 말에는 반드시 삶을 움직이는 힘이 있습니다.
제가 열심히 정성스럽게 정리한 저만의 지식과 1일 1블로그하는 제 블로그에 담긴 글들을 통해서,
여러분들의 삶과 운명을 반드시 조각하고 움직이시길 기원합니다.​

이상입니다. 감사합니다.

300x250