livin' seberia

R놀이 - 워드클라우드로 몸풀기

play with data

일년 전 요맘때만 해도 "R을 써야 데이터 어쩌고들이 가능하다"는 말을 귀에 못이 박히도록 들었습니다. 당시엔 바빠서 못했지만. 

그래도 일단 설치는 해뒀더랬습니다. http://www.r-project-org 로 들어가 CRAN 에서 한국어 버전을 자신의 운영체제에 맞게 다운받으면 됩니다. 저는 맥순이니까 OS 버전으로 받았지요. 

이후 책도 사두었습니다. 훗날 벌어진 일입니다만, 우리 연구실 사람들은 제가 이 책을 산 걸 보고 "역시 뭘좀 안다"며 감탄하더군요. (사실 새 책 그 상태 그대로인데 말입...) 암튼 얼핏 봐도 정말 제가 원하는 걸 다 알려줄 것 같은 목차와 글자들이 눈에 들어왔습니다. 이제부터 꼼꼼하게 보려고요. 



그렇게 R에 대한 모든 것을 묵혀둔 지 근 반 년이 지났지요. 그간 파이썬과 자바스크립트, 각종 통계와 수학에 몰두하느라 R 자체를 잊고 살았더랬습니다. 서론이 긴데, 결론적으로 오늘은 폭설과 강추위로 인해 세베리아(이 블로그에서 자주 등장할 말입니다. 세종+시베리아의 합성어지요...)에 고립된 기념으로, 또 노트북도 연구실에 있고, 또 위의 저 책도 연구실에 있는데다가, 또 마침 문재인 더민주 대표가 신년기자회견도 한 기념으로다가! 제 맥을 가지고 다룰 수 있는 간단한 워드 클라우드 작성 및 몇 가지 분석을 해보려고 합니다. (후앙) 책도 없고 하니 인터넷 이곳 저곳의 힘을 빌렸지요. 

일단 워드클라우드를 만들려면 한국어 텍스트를 쪼개야겠지요. 그런데 말입니다. 한국어 자체를 분석하기는 참 까다롭습니다. 하지만 어디선가(전희원님께서 개발하셨다고 합니다 http://konlpy.org/ko/v0.4.0/references ) 감사하게도 한국어 자연어 처리가 가능한 KoNLP를 마련해주신 덕에 이렇게 분석이 쉬워졌습니다. 아 정말 감사드립니다. 이외에도 꼬꼬마, KoNLPy 등 각종 프로그램에서 돌아가는 한국어 형태소 분석기가 있지요. 


아, 이게 왜 필요하느냐면 말입니다. (간단 설명)

글 하나를 큰 부분에서부터 좁혀 들어가봅시다. 큰 글 하나 -> 여러개의 문장 -> 문장을 구성하는 요소들이 있을테고, 이 요소 안에서도 각각의 조각들은 제 역할들을 가지고 있답니다. 이를테면, '사과를' 이라는 요소가 있다면, '사과+를' 이 되는 것이지요. 사과는 아시다시피 명사, 를은 목적어를 받쳐주는 조사지요. 요 쪼그만 조각들을 형태소라고 합니다. 전 불문과를 나온 관계로 이걸 morpheme으로 배웠지요. (영어 단어로도 같아요!) 

그런데 이놈의 형태소 분석이 말입니다. 영어는 쉽고 한국어는 어렵습니다. 왜냐면, 영어를 보시면 다들 띄어쓰기로 잘 분리가 돼있죠. 이를테면, you are such a good girl. 이라는 문장이 있을 때 각각의 morpheme들이 제 할 일들을 잘 하고 있구나, 하는 걸 알 수 있습니다. 그런데, 한국어는 보시다시피 글자들이 사각형 형태로 모두 뭉쳐져있지요. ㄱㅏㄴㅏㅊㅗㅋㅗㄹㅔㅅ 이런 식으로 쓰지 않는다는 겁니다. 방금 쓴 '겁니다' 같은 것은 '것+입니다' 인데 의존명사인 것에 ㅂ을 붙여버리는 경우도 있죠. 

대개의 경우 이런 한계를 하나의 엄청나게 큰 말뭉치(나중에 언어분석에서 보게 되겠지만, 브라운코퍼스(browncorpus)같은 걸 일컫습니다)와 비교해 얼마만큼의 확률로 "이건 명사일거야, 이건 동사일걸?"이라며 판단해 풀어나간답니다. 영어에선 위에 말한 코퍼스들이 저런 역할을 하고, 한국어에도 세종코퍼스와 같은 사전들이 있지요. 

그나마 형태소 분석이나 가능한 편입니다. 통사론(문장의 구조에서 접근하는 방식, syntax)으로 한국어를 분석하긴 쉽지 않습니다. 따라서 이 모든 어려움을 극복하고 한국어 자연어 처리 형태소 분석기를 만들어주신 분들께 감사드릴 따름이지요. 물론 더더더 나아져야겠지만 말입니다. (학계가 SCI논문에만 집착하면 한국어의 분석은 날로 요원해질 것입니다 ㅠㅠ) 요즘은 Semantic 즉 의미론적인 부분에서의 연구가 많이 이어지고 있지요. 이런 관련 연구 얘긴 다음에 차차 하기로. 


말이 길어지니 일단 R을 켜서 Console 이라는 곳에 요 명령어들을 쳐서 패키지들(기능꾸러미!)을 설치토록 합니다. 

> install.packages("KoNLP")    

> install.packages("wordcloud")

> install.packages("RcolorBrewer") 

첫번째는 아시다시피 "글은 이렇게 쪼개고, 이녀석은 명사고, 이녀석은 동사야!" 라고 알려줄 KoNLP 꾸러미, 두번째는 워드클라우드를 만들어주는 패키지, 세번째는 R 프로그램에서 앞으로도 누차 쓰일 색채 팔레트입니다. 참고로 KoNLP를 깔 때 Java를 깔라는 말이 나올 수도 있습니다. 그럴땐 주저없이 깔면 됩니다.

이 친구들을 깔았다면, 모두 불러야겠지요. 

> library(KoNLP)

> library(wordcloud)    여기까지만 해도 아래 RColorBrewer은 자동으로 불러집니다.

> library(RColorBrewer)

위에서만 " "를 써줄 뿐 여기선 안 써도 된답니다. 


참.

미리 대통령 연설문 등 몇 가지를 txt 파일로 저장해둡니다. 맥에서 어떻게 txt 저장을 하느냐는 분들도 많은데요(왜냐면, 텍스트입력기라는 기본 프로그램은 확장자가 rtf거든요) 저는 sublime text 2 ( http://www.sublimetext.com/ )라는 프로그램을 쓰고 있는지라, 거기에 붙여넣고 그냥 txt로 저장했답니다. 여러 코딩용 프로그램 써봤지만, 전 이게 가장 편하더라고요. (파이썬 쓸 땐 종종 ipython notebook도 쓰고, xcode 프로그램도 쓸 때가 있습니다마는) 무엇보다 폰트 색깔이 예뻐용(...)


이렇게 저장해둔 txt 파일을 불러와야죠. 저는 걍 홈에다가 갖다 박아놨으므로(안 좋은 습관이라지만...) 홈에서 모두 불러옵니다. 


> f <- file("/Users/Home/park.txt", blocking=F)

> txtLines <- readLines(f)

f라는 이름으로 파일을 불러온 뒤에, 이 f를 계속 부려먹습니다. 요 f를 라인 바이 라인으로 읽어들이거라! 그럼 그것은 txtlines라고 명명하겠다! 라고 선언을 하지요. *(r에선 <- 이런 화살표를 참 많이 씁니다.)


워드 클라우드 특성상 워드 즉 단어들을 다루지요. 아무래도 명사형을 모조리 모아야할 듯 합니다. 


> nouns <- sapply(txtLines, extractNoun, USE.NAMES = F)

f를 좀 정제한 txtLines에서 Noun을 extract하라는 것이지요. 그리고 Names를 쓰는 것은 False 값을 줍니다. 

어떻게 돌아가고 있는지 궁금하면,

> nouns         를 쳐보면 텍스트에서의 명사들만 쭈루룩 정렬됩니다. 이 nouns만 다시 추려서 새 파일로 만들어볼게요. 


> undata=unlist(nouns)

중복된 애들을 빼고 각각 몇 개씩 있는지 한 번 볼까요 

> wordcount <- table(undata)

> length(wordcount)

이걸 내림차순으로 하면

> sort(wordcount, decreasing = T)

오름차순으로 하고 싶다면 decreasing=F 로 하면 됩니다. 


일단 전 여기까지 모두 4개의 파일을 각각 풀어 모아두었죠. 다 어디 쓸 데가 있어서(...)



워드클라우드를 만듭니다. 그 전에 아까 그 Rcolorbrewer 기억나시나요. 

무슨 색이 있을까 궁금하니까, 일단 모든 brewer 색을 보겠습니다.

> display.brewer.all()


아아 예쁜 색이 무척 많아요! 전 이 가운데 음 어떤 팔레트를 쓸까 고민하다가, Pastel1을 골랐답니다.

> pal <- brewer.pal(9, "Pastel1")

앞에 있는 숫자 9는 내가 쓸만큼의 색깔을 뜻해요. 저는 제가 쓸 팔레트에 들어있는 색상의 색깔 모두를 쓸거라 9를 써뒀지요. > pal   이라고 치면 [1] "#FBB4AE" "#B3CDE3" "#CCEBC5" "#DECBE4" "#FED9A6" "#FFFFCC" "#E5D8BD" "#FDDAEC" "#F2F2F2"    이렇게 제가 쓸 색채들이 쭉 나열된답니다. 


색채와 관련해서도 하고 싶은 말이 많은데. 음, 일단 컴퓨터상 색채는 RGB를 중심으로 하고, 또 16진법으로도 표현할 수 있지요. 관련해선 추후 포스팅을 또 하기로.... (한 뒤에 아래에 링크 걸어야겠네요. 호홋)


그리고 드디어, 대망의, 워드클라우드를 만들어봅니다!!!

근데 전 개인적으로 '것', '등'이라는 글자가 너무 많이 나오는 게 싫습니다. (그분은 정말 '것'이라는 의존 명사를 참 많이 쓰시더군요) 따라서 모든 단어는 2자 이상일 수 있도록 함수를 하나 설정해보겠습니다. 이를테면 이런 식이지요. 

> data= Filter(function(x){nchar(x)>=2}, undata)

> wordcount1 <- table(data)

이렇게 해야 두 글자 이상인 단어만 모인 워드카운트 뭉치가 생성됩니다.


> wordcloud(names(wordcount1), freq = wordcount1, scale=c(7,1), rot.per=0.25, min.freq=1, random.order=F, random.color=T, colors=pal)

설명하자면, wordcount 수만큼 frequency(빈도)를 확인해라, 그리고 scale(폰트의 크기)은 최고 7픽셀에서, 제일 작은건 1픽셀까지만. rotation되는 단어의 빈도는 0.25정도로 하고, 등장하는 단어의 가장 작은 빈도 수는 1로, 빈도가 가장 큰 단어를 중앙에 두도록 하기 위해 random order는 False 값을 줍니다. 컬러는 맘대로 해도 좋으니 True 값을, 대신 그 컬러 팔레트는 위에 정한 pal 로 쓰렴!   이렇게 해석이 되는 겁니다. 


아 그런데 이게 무슨 일입니까. 


흐린 건 둘째 치더라도 한글이 즌혀 나오지 않습니다. ('ㅅ')ㅗ

이럴땐 언어 코드가 맞지 않는 경우가 대부분이라 하더이다. 따라서 저는 다시 해결 방법을 찾아봅니다. 제 컴은 맥이니 알아서 UTF-8으로 잘 설정이 돼있고, R Studio 프로그램에서 Tools-GlobalOptions-Default Text encoding:도 utf-8으로 돼있습니다. 찾아보니 이건 Plot을 extract 할 때 pdf의 encoding이 UTF-8으로 돼 있어야 한다는 군요. 이리보고 저리봐도 잘 풀리지 않고 있답니다. ㅠ 아마 어떤 컴퓨터에선가는 다 잘 될 듯.

몸풀기용 워드클라우드 치고 꽤 오랜 시간 매달렸더니 힘이 드네요. 곧 다시 살펴보도록 하지요. 답 아시는 분은 아래 댓글 좀 달아주세요. 흑. 


아무튼, 연구실 윈도기반 컴퓨터를 써서 다시 만든 결과는 다음과 같네요. (너무 흐려서 pal=set1으로 다시 설정했어요)

그 분(1월 13일 신년 기자회견)은 '우리' '국민' '경제' '일자리' 요런 단어를 많이 언급했군요. 

내친김에 다른 당대표들것도 좀 추려볼까요. 

일단 김무성 새누리당 대표(1월 18일 신년기자회견)는 개혁과 국민, 국회 등에 대한 얘길 많이 했네요.

얼핏 보면 앞 워드 클라우드와 다소 비슷한 느낌이 없지 않은 듯한 그런 느낌적인 느낌.... 요건 잠시 뒤 다른 포스팅에서 세부적으로 풀어가겠습니당.

더불어민주당 문재인 대표(1월 19일 신년 기자회견)는 국민과 경제, 우리, 박근혜 등의 단어를 많이 언급했습니다. 경제 보다는 정치라는 단어가 더 많이 보이고요.

얼핏 보면 뭔가 대통령에 대해 참 많은 이야기를 한 듯 합니다.

그렇다면, (이건 신년기자회견문은 아니지만) 국민의당 인재영입위원장의 지난해 12월 27일 신당창당 기자회견문을 볼까요?

국민, 대한, 사람 등도 많지만 특히 새정치를 하겠다고 나온만큼 정치를 많이 언급했군요.

자, 여기서 더 나아간 분석은 곧 업로드됩니다.