R , 텍스트 마이닝 & 워드클라우드


비정형텍스트를 기반으로 의미있는 명사를 추출하는 기술을 텍스트마이닝이라고 한다.
단어분류 또는 문법적 구조분석 등의 자연언어 기술에 기반하며, 
워드클라우드는 문서의 단어들을 분류하여 그 빈도를 한눈에 보기 쉽게 한다
영화 박열의 리뷰를 크롤링해 txt파일로 저장한 것을 워드클라우드로 만들어 보겠다.

1) setwd("c:/r_temp") 로 파일경로로 변경하겠다.

2)파일을 읽는 방법은 여러가지가 있다, 
그중에 크롤링한 파일이라 한줄씩 읽는 readLines()를 사용하겠다. 
 data <- readLines("review.txt")


3) 작업을 위해 필요한 패키지를 설치하고 사용하자.
install.packages("wordcloud")
install.packages("RColorBrewer")
install.packages("KoNLP")

library(wordcloud)
library(RColorBrewer)
library(KoNLP)

한글사전을 추가하자(형태소 관련,띄어쓰기,명사추출용)
useSejongDic()

#wordcloud()
scale 가장 빈도가 큰 단어와 가장 빈도가 작은단어 폰트사이의 크기차이 scale=c(10,1)
minfreq 출력될 단어들의 최소빈도
maxwords 출력될 단어들의 최대빈도(inf:제한없음)
random.order(true면 랜덤, false면 빈도수가 큰 단어를 중앙에 배치하고 작은순)
random.color(true면 색 랜덤, false면 빈도순)
rot.per(90도 회전된 각도로 출력되는 단어비율)
colors 가장 작은빈도부터 큰 빈도까지의 단어색
family 글씨체

4)명사추출
extractNoun 명사추출, sapply(data,function) 문법이다. 칼럼 설정은 true or false. 
data <- sapply(data, extractNoun, USE.NAMES = F)

sapply는 리스트형태로 리턴이 된다.  분석을 위해 unlist를 이용해 벡터로변환하자
data_unlist<-unlist(data)

head(data_unlist) 변환후 확인하자.

빈도수를 출력
wordcount <- table(data_unlist)

출력해본다면 공백이 뜨지만 
아직 전처리 전이니 공백등은 신경 쓸필요없다, 텍스트 마이닝을 위한
 클라우드 만들기전에 몇가지 작업들이 남아있다. 

head() 최대빈도 100개 정도 뽑아 다른 변수에 넣어준다.
wordcount_top <-head(sort(wordcount, decreasing = T),100)


sort()는 정렬인데, sort()의 decreasing 옵션은 True면 내림차순, 
False면 오름차순으로 정렬해준다.
또한 head()에 두번째 인자로 숫자를 넣으면 첫 5행만 빼주는게 아니라 인자만큼 빼준다.






아직은 데이터마이닝이라 부르기 힘들다. 공백이 많고 특수문자와 보조사 명사들이 붙어나와서 불완전하다. 하지만 지금 상태로 클라우드를 만들어 본다면 아래 그림처럼 나온다.필자는 미리 공백과 특수문자를 제거했다. 그것은 나중에 설명하겠다.


5)전처리 -fliter() 필터  , 내가 만든 함수를 적용시키는 메서드이다.
2글자 이상인 단어만 추출된다.
data_unlist <- Filter(function(x){nchar(x)>=2}, data_unlist)

6)불필요한 단어 제거 -gsub()
gsub(찾을 단어, 바꿀 단어, 찾을 곳)
동사나 형용사의 활용형을 기본형으로 바꾸거나 , 같은 명사인데 다른 조사나 보조사가 붙은것들을 모두 제거하여 하나의 단어로 통일시킬 수 있다.

하지만 모두 제거 되지 않으므로 정규표현식이라는 것이 필요하다
(정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어이다.
문자열의 검색과 치환을 위해 지원하고 있다..)








7)클라우드 출력 
 색상을 입혀서 출력해보자.


wordcloud(names(wordcount_top), wordcount_top, scale=c(5,1),random.order = FALSE, random.color = TRUE, colors = color, family = "a한글사랑L")








0 comments:

Post a Comment