반응형

시작하기 전에 R, RStudio, KoNLP(한글 형태소 분석 패키지)가 설치되어 있어야한다.

특히 KoNLP는 다운받는 과정이 조금 복잡하므로 아래 링크를 참고하시길!

1. [R 프로그래밍] R, R Studio 다운로드

https://blog.naver.com/song_sec/221799018628

2. [R 프로그래밍] install.packages("KoNLP") - Konlpy 설치불가 이슈 해결

https://blog.naver.com/song_sec/221800340719

이번 포스팅에서는 R을 이용하여 카카오톡 채팅방을 아래 카테고리에 따라 분석할 것이다.

1) 카카오톡 채팅방에서 각 인원의 대화 지분

2) 시간대별 메세지 수 (몇시가 가장 활발하고, 몇시가 채팅이 없는지)

3) 가장 많이 등장하는 메세지(단어, 형태소) - 워드클라우드

4) 상관성 분석

나는 11명이 있는 친구들 단톡방을 대상으로 해당 분석들을 진행하였다.

1) 카카오톡 채팅방 각 인원의 대화 지분

(1) 결과물

 

 

 

(2) 코드 설명

나는 카카오톡 대화내용을 받아온 후, 메모장에서 전체바꾸기로 각 사람들의 이름을 '[이름]'으로 변경했다. 이는 나중에 있을 텍스트분석에서 친구들이 말한 내이름, 내가 발언하여 생긴 내 이름과 분리 하기 위함이다.

하지만 이것은 R에서 str_replace_all을 통해 바꿀 수도 있으므로 참고만 하시길!

 

 

library(KoNLP) #한글형태소 분석 라이브러리

library(stringr) #Regexp를 하기 위해. 한글을 문자, 단어별로 잘라내고 바꾸는 일 담당

library(wordcloud) #워드클라우드

library(RColorBrewer) #워드클라우드 색상

library(rvest) #html, xml 자료를 쉽게 가져와서 처리

library(NIADic) #KoNLP의 한글 사전 최신판

library(tm) #연관성 검사용

library(qgraph) #연관성 검사 결과값 시각화용

library(extrafont) #폰트 설정

suppressPackageStartupMessages(library(googleVis)) #차트그리기용

textdata<-file("KakaoTalkChats_GRP.txt", encoding='UTF-8') #파일

import data<-readLines(textdata, encoding='UTF-8')

 

head(data) # 불러온 파일 확인 data<-data[-1:-4] #파일의 1~4번째 줄은 필요 없어서 삭제

head(data) #삭제된 것을 확인

 

# 각 문단 별로 [이름]으로 시작되는 (rows)을 찾아 갯수를 pn에 입력

p1<-length(data[grep("\\[JONGSUN", data)])

p2<-length(data[grep("\\[BAEK", data)])

p3<-length(data[grep("\\[YEONGGYU", data)])

p4<-length(data[grep("\\[SUJIN", data)])

p5<-length(data[grep("\\[SEOKMIN", data)])

p6<-length(data[grep("\\[JINGU", data)])

p7<-length(data[grep("\\[SANGHYEOK", data)])

p8<-length(data[grep("\\[INVEST", data)])

p9<-length(data[grep("\\[MM", data)])

p10<-length(data[grep("\\[JONG", data)])

p11<-length(data[grep("\\[HEEDO", data)])

 

#talk_volumes에 모든 대화 갯수를 넣는다. ex. p1 p2 p3...p11 = 5245 5652 ... 1208 talk_volumes<-c(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) #name에 각 구성원의 이름을 넣는다.

name<-c('JONGSUN','BAEK','YEONGGYU','SUJIN', 'SEOKMIN', 'JINGU','SANGHYEOK','INVEST','MM','JONG','HEEDO')

 

#그러면 mapping이 된다. name1-p1, name2-p2 ...

talk_stake<-data.frame(name, talk_volumes) #대화 지분 # pie chart를 그린다.

pie1<-gvisPieChart(talk_stake,options=list(width=400,height=300))

pie_bar<-gvisBarChart(talk_stake,options=list(width=600,height=300))

 

# 한글은 깨지는 경우가 있으므로 아래 코드를 추가한다.

header <-pie1$html$header header <- gsub("charset=utf-8", "charset=euc-kr", header)

pie1$html$header <- header #pieplot를 소환한다. plot(pie1) plot(pie_bar)

 

2) 시간대별 메세지 수 (몇시가 가장 활발, 몇시가 채팅이 없나)

(1) 결과물

gvisColumnChart. 오후 1시 메세지가 가장 많았다.

 

 

(2) 코드 설명

#시간대별 카톡량 분석

bfnoon<-data[grep("\\오전",data)] #오전으로 시작하는 줄의 data들을 bfnoon에 삽입

afnoon<-data[grep("\\오후",data)] #오후로 시작하는 줄의 data를 afnoon에 삽입

 

# 오전/오후 data를 삽입하면 각 시간대별로 분류해주는 함수

timefunc<-function(x){

time1<-x[grep("1:",x)]

time2<-x[grep("2:",x)]

time3<-x[grep("3:",x)]

time4<-x[grep("4:",x)]

time5<-x[grep("5:",x)]

time6<-x[grep("6:",x)]

time7<-x[grep("7:",x)]

time8<-x[grep("8:",x)]

time9<-x[grep("9:",x)]

time10<-x[grep("10:",x)]

time11<-x[grep("11:",x)]

time12<-x[grep("12:",x)]

return(c(length(time1), length(time2), length(time3), length(time4), length(time5), length(time6), length(time7), length(time8), length(time9),length(time10), length(time11), length(time12))) }

 

Beforenoon<-timefunc(bfnoon) #오전data를 시간대별로 분류하여 Beforenoon에 삽입

Afternoon<-timefunc(afnoon) #오후data를 시간대별로 분류하여 Afternoon에 삽입

time<-c('1H', '2H', '3H', '4H','5H', '6H','7H', '8H', '9H', '10H', '11H', '12H') #각 시간 삽입

 

total_time<-data.frame(time,Beforenoon,Afternoon) #시간, 오전, 오후를 하나의 frame으로 만들기

chart_by_time<-gvisColumnChart(total_time,options=list(height=500,weight=1000)) #만든 것을 chart로 만들기 plot(chart_by_time) #차트 그리기

 

 

3) 가장 많이 등장하는 메세지(단어, 형태소) 워드클라우드

(1) 결과물

wordcloud. 놀랍게도 메세지 삭제를 애들이 많이해서 "삭제"가 제일 많다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

piechart

20대 11명 대화방에서 가장 많이 나오는 단어들 ㅋㅋㅋ

 

 

(2) 코드 설명

가. 데이터 전처리: 텍스트분석을 위해서는 필요없는 정보(시간, 특수문자 등)를 지우는 과정이 꼭 필요하다.

#텍스트분석을 위한 데이터 전처리 #전처리된 것들만 모을 data_mod 생성

data_mod<-str_replace_all(data,"이모티콘","") %>% #텍스트분석을 진행할 것으로, 순수 "대화"가 아닌 텍스트 모두 제거

str_replace_all("\\오후 ","")%>%

str_replace_all("\\오전 ", "")%>%

str_replace_all("[ㄱ-ㅎ]+","")%>%

str_replace_all("[가-힣] :","")%>%

str_replace_all("[[A-Z]]","")%>%

str_replace_all("[[a-z]]","")%>%

str_replace_all("사진","") %>%

str_replace_all("[0-9]+.","")%>%

str_replace_all("년.월.일","")%>%

str_replace_all(".요일","")%>%

str_replace_all("[[:punct:]]","")%>% #맞춤법 안지킨 것들 보정

str_replace_all("겟","겠")%>%

str_replace_all("햇","했")%>%

str_replace_all("됬","됐")%>%

str_replace_all("됫","됐")%>%

str_replace_all("갓","갔")%>%

str_replace_all("댓","댔")%>%

str_replace_all("뎃","댔")%>%

str_replace_all("왓","왔")%>%

str_replace_all("랏","랐")%>%

str_replace_all("잇","있")%>%

str_replace_all("되겠","")%>%

 

#character()로 변경

as.character() #문자형(character)으로 변경

head(data_mod) #테스트 출력

useNIADic() #분석을 위한 사전

 

#전처리한 데이터에서 etractNoun함수로 명사만 추출

noun<-sapply(data_mod, extractNoun, USE.NAMES = F) %>%

unlist() #2단어 이상의 명사만 추출

noun2 <-Filter(function(x){nchar(x)>=2}, noun)

 

#가장 많이 등장한 단어 순으로 50개 정렬

head(noun2) wordFreq <-table(noun2)

noundta<-sort(wordFreq, decreasing=TRUE,50) #noundta<-noundta[-1]

print(noundta)

 

 

나. 워드클라우드 및 piechart

#워드클라우드 생성

set <- brewer.pal(7, "Set2") #워드클라우드를 위한 폰트색상 계열 설정

loadfonts(device="win") #폰트 불러오기

windowsFonts(headline=windowsFont("HY헤드라인M")) wordcloud(names(noundta), freq=noundta, min.freq = 100, random.order=T, rot.per = .1, colors=set, family="headline")

 

#상위20개 piechart 생성

top_20=(sort(noundta, decreasing=T), 20) pie(top_20)

4) 상관성분석

(1) 결과물

(2) 코드설명

#상관성분석

#SimplePos22: 명사/형용사/부사/독립언 분리

tt<-paste(unlist(SimplePos22(data_mod)))

head(tt,200)

 

#명사만 가져오기

alldta<-str_match_all(tt,"[가-힣]+/[N][C]|[가-힣]+/[N][Q]+")%>%

unlist() #형용사만 가져오기

alldta2<-str_match_all(tt,"[가-힣]+/[P][V]|[가-힣]+/[P][X]+[가-힣]+/[P][A]+[가-힣]+/[M][A]+")%>%

unlist() #명사로 추출된 단어들의 분류표인 /NC, /NQ 등을 제거

N<-str_replace_all(alldta, "/[N][C]","")%>%

str_replace_all("/[N][Q]","") %>%unlist()

 

#감정어로 분류한 단어들의 분류표들을 제거

PNM<-str_replace_all(alldta2, "/[P][V]","") %>%

str_replace_all("/[P][A]","") %>%

str_replace_all("/[M][A]","") %>%

str_replace_all("/[P][X]","") %>% unlist()

 

#명사들 상관성분석 #tm 패키지에서 제공하는 Corpus를 통해 분류된 단어들의 행렬을 만든다.

DtaCorpusNC<-Corpus(VectorSource(N))

myTdmNC<-TermDocumentMatrix(DtaCorpusNC, control=list(wordLengths=c(4,10), removePunctuation=T, removeNumbers=T, weighting=weightBin)) Encoding(myTdmNC$dimnames$Terms)="UTF-8"

#제대로 됐는지 확인

findFreqTerms(myTdmNC, lowfreq=10)

 

#행렬(matrix)로 변환하는게 상관성 분석의 핵심

mtNC<-as.matrix(myTdmNC)

mtrowNC<-rowSums(mtNC)

mtNC.order<-mtrowNC[order(mtrowNC, decreasing=T)]

freq.wordsNC<-sample(mtNC.order[mtNC.order>30], 25)

freq.wordsNC<-as.matrix(freq.wordsNC)

freq.wordsNC co.matrix<-freq.wordsNC %*% t(freq.wordsNC) #graph 생성

qgraph(co.matrix, labels=rownames(co.matrix), diag=FALSE, layout='spring', vsize=log(diag(co.matrix)*2))

 

 

5) 형용사(감정어) 상관성분석

(1) 결과물

(2) 코드설명: 위의 4) 명사 상관성분석과 코드는 모두 동일하며 NC부분만 PNM으로 변경했다.

# 형용사(감정어) 상관성분석

DtaCorpusPNM<-Corpus(VectorSource(PNM))

myTdmPNM<-TermDocumentMatrix(DtaCorpusPNM, control=list(wordLengths=c(4,10), removePunctuation=T, removeNumbers=T, weighting=weightBin)) Encoding(myTdmPNM$dimnames$Terms)="UTF-8" findFreqTerms(myTdmPNM, lowfreq=10)

mtPNM<-as.matrix(myTdmPNM)

mtrowPNM<-rowSums(mtPNM)

mtPNM.order<-mtrowNC[order(mtrowPNM, decreasing=T)]

freq.wordsPNM<-sample(mtNC.order[mtPNM.order>30], 25)

freq.wordsPNM<-as.matrix(freq.wordsPNM)

freq.wordsPNM co.matrix<-freq.wordsPNM %*% t(freq.wordsPNM)

qgraph(co.matrix, labels=rownames(co.matrix), diag=FALSE, layout='spring', vsize=log(diag(co.matrix)*2))

 

4), 5)의 상관성분석은 아직 잘 이해가 안되어서 조금 더 공부해보아야할 것 같다.

그래도 R 1일차 치고 이정도면 만족스러운 결과물이다!!!

내가 R을 다운받게된 계기는 이 분석을 진행하기 위해서였는데, 코드의 출처는 아래 링크와 같다.

다만 2017년 게시글이다보니 저때와 지금의 카톡 내려받기 txt 포맷이 조금 달라서(어느 os에서 다운받느냐에 따라 또 다르다!!!) 나는 조금씩 수정 하며 진행한 점을 참고하면 되겠다.

내 코드는 안드로이드에서 다운받은 카카오톡 대화내용 기준이다!

(그래봤자 data검색 / replace format쪽만 수정하면 된다)

https://m.post.naver.com/viewer/postView.nhn?volumeNo=9334713&memberNo=33264526&searchKeyword=%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%86%A1&searchRank=1

반응형
반응형

.하고싶은 분석이 있어서 R에서 Konlpy 를 다운받으려고 시도했다: 2020-02-07

> install.packages("KoNLP")

WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/

 

Using Rtools40 on Windows

Starting with R 4.0.0 (released April 2020), R for Windows uses a toolchain bundle called rtools40. This version of Rtools includes gcc 8.3.0, and introduces a new build system based on msys2, which makes easier to build and maintain R itself as well as th

cran.rstudio.com

 

설치가 안되어 여러 방법을 시도해봤다.

1. CRAN 미러를 자동으로, 한국으로도 바꿔봐도 KoNLP가 사라졌는지 설치가 되지 않더라.

2. R 버전문제인줄 알고 R을 5번은 삭제했다가 새버전 받았다가 반복했지만 똑같다.

3. R 사이트에서 Package를 찾아봐도 KoNLP PKG가 없다.

4. 구글링도 해봤으나 최근에 설치하신 분이 없다. . .

수많은 R을 삭제했다가 다시 깔았던 기록들...

그러다가 찾은

R Korea - KRSG(Korean R Study Group)

페이스북 링크 !!!

출처: https://www.facebook.com/groups/krstudy/265600956947517/

안되는 것 정상이라고 한다.

# java, rJava 설치

install.packages("multilinguer")

# 이때 mac 사용자는 데스크탑 비밀번호를 물어봅니다. 입력해줘야 설치가 진행됩니다.

library(multilinguer)

install_jdk()

# 위 함수에서 에러가 발생하면 알려주세요

# https://github.com/mrchypark/multilinguer/issues

# 의존성 패키지 설치

install.packages(c('stringr', 'hash', 'tau', 'Sejong', 'RSQLite', 'devtools'), type = "binary")

# 아카이브된 버전의 패키지 설치

install.packages("https://cran.r-project.org/src/contrib/Archive/KoNLP/KoNLP_0.80.2.tar.gz", repos=NULL, type="source")

설치 완료!!!

하지만 library("KoNLP")시 또 다른 이슈가 발생하는데... 이건 다음 포스팅에서!

 

반응형
반응형

> library("KoNLP")

Fail to install scala-library-2.11.8.jar. Recommand to install library manually in C:/Users/BAEK/Documents/R/win-library/3.6/KoNLP/java

Checking user defined dictionary!

KoNLP를 설치 후 library 실행 시 아래와 같은 에러가 발생하는 경우가 있다.

* KoNLP 설치방법

https://blog.naver.com/song_sec/221800340719

 

[R 프로그래밍] install.packages("KoNLP") - Konlpy 설치불가 이슈 해결

1 .하고싶은 분석이 있어서 R에서 Konlpy 를 다운받으려고 시도했다: 2020-02-07> install.packages(&...

blog.naver.com

해결방법

1. 아래 링크에서 java 파일을 다운받는다. (광고 / 이상한거 절대 아님)

https://drive.gumu.kr/sharing/IK7Bkj1lw

2. Error 상의 출력된 경로에 들어가서 다운받은 java 파일을(압축 풀고) 덮어쓰기 해주면 된다.

- 깔끔하게 끝 -

이슈 미발생 확인!

출처

https://gumu.kr/blog/1010/r-konlp%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98fail-to-install-scala-library-2-11-8-jar/

 

[R] KoNLP패키지 설치 오류(Fail to install scala-library-2.11.8.jar) - Gumu's treasure box

업데이트내용 본 내용은 R 4.0 이전 버전에서만 적용됩니다. 패치를 통해 설치오류가 해결되었다는 공지가 올라왔으나 아직도 지속적으로 설치가 안 되는 분들이 계시는 것으로 보아 완전히 문

gumu.kr

 

반응형
반응형

RStudio를 설치했는데 R을 안깔아서.. R Download 포스팅!

1. R 설치 링크 접속하여 R 다운로드

https://cloud.r-project.org/

 

The Comprehensive R Archive Network

 

cloud.r-project.org

 

캡처들은 3.5.3 버전으로 되어있는데, 3.5.3에서 나는 에러가 발생하여

3.5.3을 삭제하고 3.6.2로 다시 다운받았다. 링크는 3.6.2로 바꾸어뒀으니.. 캡처 내 버전은 신경쓰지 말길!

2. 다운로드 받기

왠지 재부팅하면 빨라질 것 같기도 하고... 근데 저 다운해주는 파일 server 자체가 느린 것 같기도 함.

3. 설치가 다 된후 다운된 exe파일을 실행한다.

4. 그리고 아까 설치한 RStudio를 다시 열어보자

RStudio 설치 링크

https://blog.naver.com/song_sec/221798927338

[R 프로그래밍] R Studio 설치/다운로드

R은 배워본 적 없지만 워낙 유명하기도 하고, 이번에 ADsP 공부하면서 재밌어보여 다운받게 됐다.이 또...

blog.naver.com

열렸다!!!

끝!

반응형
반응형

R은 배워본 적 없지만 워낙 유명하기도 하고, 이번에 ADsP 공부하면서 재밌어보여 다운받게 됐다.

이 또한 하나의 포스팅으로 보여 포스팅!! ㅋㅋ

* RStudio를 다운받기 전에 R을 먼저 다운받아야한다!

R 다운로드 받는 링크는 아래 포스팅 참고 : )

https://blog.naver.com/song_sec/221799018628

[R 프로그래밍] R, R Studio 다운로드

RStudio를 설치했는데 R을 안깔아서.. R Download 포스팅!​​1. R 설치 링크 접속하여 R 다운로드 ...

blog.naver.com

1. 설치 홈페이지 접속

https://rstudio.com/products/rstudio/download/

 

Download the RStudio IDE

RStudio is a set of integrated tools designed to help you be more productive with R. It includes a console, syntax-highlighting editor that supports direct code execution, and a variety of robust tools for plotting, viewing history, debugging and managing

www.rstudio.com

 

2. FREE 버전 다운로드

3. 각자 OS에 맞게 스크롤바 이동하여 적합한 OS버전 다운

4. 약 150MB가 다운되면 설치 팝업이 뜬다.

5. 전부 다음>만 누르면 완료된다.

 

6. 설치된 후 Rstudio를 검색하여 실행

7. 본인 PC의 bit에 맞게 선택 후 OK

끝!

* 사실 난 R을 안깔고 Rstudio부터 깔아서.. R을 설치하러 간다 :)

반응형

+ Recent posts