RSelenium을 이용해서 웹상에 텍스트를 긁어모으는 작업들을 앞선 포스팅에서 진행 했었다.
이번에는 수집한 텍스트를 활용해 텍스트마이닝을 진행해보자.
텍스트마이닝이라고는 했지만 가장 기초적인 단계인 워드클라우드 생성, 단어 네트워크 까지 진행할 예정이다.
네이버 쇼핑에서 수집한 오휘화장품에 리뷰(파일명:ohui_review.txt)를 활용한다.
setwd(“D:/Rlearn/scrap”) #작업폴더 설정
library(KoNLP) #형태소분석 패키지
library(RColorBrewer) #색상패키지
library(wordcloud) #워드클라우드 패키지
library(arules) #연관성분석
library(igraph) #소셜네트워크분석
Sys.setenv(JAVA_HOME=’C:/Program Files/Java/jre1.8.0_131') #자바 JRE환경설정 첫 1회 필요
KoNLP패키지를 실행할 때는 자바JRE를 필요로 하기 때문에, java사이트에서 해당 파일을 다운받아 설치 후 환경변수 설정을 해주어야 한다.
#한글 품사
위 사진에서 보듯이 한글은 복잡한 품사 체계를 가지고 있다. KoNLP에는 한글 형태소를 파씽해주는 함수들이 있기 때문에 어렵지 않게 활용할 수 있다.
useSejongDic() #세종사전을 활용함.
mytext=file(“ohui_review.txt”) #가져올 텍스트 파일 열기
myline=readLines(mytext) #한줄한줄 읽어서 myline에 텍스트 저장
close(mytext) #파일 열기 종료
myword=sapply(myline, extractNoun, USE.NAME = T)
#sapply는 다음에 포스팀 하겠지만 각각 라인백터 마다 extractNoun함수를 실행시키고,결과값을 출력하는 함수
#extraNoun은 명사를 추출하는 함수
명사가 추출된 myword를 출력해보자.
#명사 추출
이런 식으로 문장과 분리된 단어로 저장된 것을 확인 할 수 있다.
물론 분리된 단어들이 완변하지 않거나, 적절치 않은 경우도 다수 발생한다. 한글의 형태소 분석에 어려운 부분이 있기 때문으로 이런 점은 어느 점도 감안하는 수밖에 없다.
불필요한 단어들을 필터링 하는 방법이다.
myword=sapply(myword, function(x){Filter(function(y){nchar(y)<=4&&nchar(y)>1&&is.hangul(y)},x)}) #한글, 4자 이하만 필터링
또한 불필요사전을 별도로 만들어 포함된 단어들을 제거시키는 방법도 있으나, 여기서는 서술하지 않는다.(불필요 사전을 만들기 위해서는 개개인이 손수 단어를 입력시켜야함)
워드클라우드를 만들기 위해서 단어만 수집된 텍스트 파일을 만드는 작업을 해준다.
result=unlist(myword) #리스트 해체
write(unlist(result),”myresult.txt”) #텍스트 파일로 저장
myword_cloud=read.table(“myresult.txt”) #다시 불러오기
wordcount=table(myword_cloud) #단어 카운트
다음으로 wordcloud()를 이용해 워드클라우드를 생성 한다.
palete=brewer.pal(9,”Set1") #색상 설정
wordcloud(names(wordcount), freq=wordcount, scale=c(5,1), random.order=F, random.color=F, colors=palete,family=”malgun”) #워드클라우드 생성
#워드클라우드
다음은 문장내에 동시에 출현화는 단어 횟수를 기반으로 한 연관성 분석을 통해서 연관단어를 파악하는 네트워크 분석을 수행한다.
mywordtran=as(myword,”transactions”) #트랙젠션 데이터로 변경
mywordares=apriori(mywordtran,parameter=list(supp=0.04, conf=0.0)) #연관성 분석
inspect(mywordares) #룰 확인
mywordares=labels(mywordares, ruleSep=” “) #연관성 분석 결과 분리
mywordares=sapply(mywordares, strsplit,” “, USE.NAMES = F) #연관성 분석 결과 분리
mywordrulemat=do.call(“rbind”,mywordares)
mywordruleg=graph.edgelist(mywordrulemat,directed = T) #노드 연결 데이터 생성
plot(mywordruleg, layout=layout.kamada.kawai, vertex.label=V(mywordruleg)$name, vertex.shape=”none”,vertex.size=1,edge.arrow.width=0.2) #네트워크 그래프 생성
#네트워크 분석
단어들이 각 노드로 들어갔고, 선이 연결된 부분을 단어간에 서로 관련성을 가지고 있다고 해석 가능하다.