문자로 된 데이터에서 가치 있는 정보를 얻어 내는 분석 기법을 '텍스트 마이닝(Text mining)'이라고 합니다. 텍스트 마이닝을 할 때 가장 먼저 하는 작업은 문장을 구성하는 어절들이 어떤 품사로 되어 있는지 파악하는 '형태소 분석(morphology Analysis)'입니다. 형태소 분석으로 어절들의 품사를 파악한 후 명사, 동사 형용사 등 의미를 지닌 품사의 단어들을 추출해 각 단어가 얼마나 많이 등자앴는지 확인합니다. 텍스트 마이닝을 통해 SNS나 웹 사이트에 올라온 글을 분석하면 사람들이 어떤 이야기를 나누고 있는지 파악할 수 있습니다.
텍스트 마이닝 준비하기
힙합 음악 가사를 이용해 텍스트 마이닝을 하는 방법을 알아보겠습니다.
1. 패키지 준비하기
한글 자연어 분석 패키지인 KoNLP(Korean Natural Language Processing)를 이용하면 한글 데이터로 형태소 분석을 할 수 있습니다. KoNLP는 자바(Java)가 설치되어 있어야 사용할 수 있습니다. 자바 사이트에 접속해서 사용중인 OS에 맞는 파일을 다운로드해 설치하세요.
https://www.java.com/ko/download/manual.jsp
윈도우 사용자는 사용 중인 OS가 32비트인지, 64비트인지 확인한 후에 다운로드해야 합니다. 32비트 사용자는 온라인 버전과 오프라인 버전을 다운로드하세요.
2.KoNLP를 사용하려면 rJava, memoise 패키지가 설치되어 있어야 합니다. 두 패키지를 설치한 후 KoNLP를 설치합니다. 'KoNLP'의 'o'는 소문자, 'rJava'의 'J'는 대문자입니다.
install.packages("rJava")
install.packages("memoise")
install.packages("KoNLP")
3.설치가 완료되면 KoNLP와 전처리 작업에 사용할 dplyr을 로드합니다.
library(KoNLP)
library(dplyr)
4.사전 설정하기
KoNLP에서 지원하는 NIA 사전은 98만 여 개의 단어로 구성되어 있습니다. 형태소 분석을 하는 데 이 사전을 이용하도록 설정하겠습니다.
useNIADic()
Backup was just finished!
983012 words dictionary was built.
5.데이터 준비하기
먼저 깃허브(bit.ly/doit_rd)에서 hiphop.txt 파일을 다운로드해 프로젝트 폴더에 합입한 다음, readLines()로 불러와 일부를 출력해 보겠습니다. 이 텍스트 파일에는 멜론 차트 랩/힙합 부문 상위 50곡의 가사가 들어있습니다.
#데이터 불러오기
txt <- readLines("hiphop.txt")
head(txt)
[1] "\"보고 싶다" "이렇게 말하니까 더 보고 싶다" "너희 사진을 보고 있어도"
[4] "보고 싶다" "너무 야속한 시간" "나는 우리가 밉다"
hiphop.txt는 아래와 같은 노래들의 가사로 구성되어 있습니다. 50위 전체 목록은 깃허브에 공유한 SongList.xlsx 파일에 있습니다.
순위 | 제목 | 가수 |
1 | 봄날 | 방탄소년단 |
2 | 에라 모르겠다 | BIGBANG |
3 | 우리집을 못 찾겠군요(Feat. 볼빨간사춘기) | 매드클라운 |
4 | 기다렸다 가 | 다이나믹 듀오, 첸(CHEN) |
5 | 당신의 밤(Feat. 오혁) | 황광희 X 개코 |
6 | 저 별 | 헤이즈(Heize) |
7 | 마에스트로(Maestro) | 창모(CHANGMO) |
8 | 피 땀 눈물 | 방탄소년단 |
9 | 돌아오지마(Feat. 용준형 Of 비스트) | 헤이즈(Heize) |
10 | Not Today | 방탄소년단 |
6.특수문자 제거하기
문장에 이모티콘이나 특수문자가 포함되어 있으면 오류가 발생할 수 있습니다. 문자 처리 패키지인 stringr의 str_replace_all()을 이용해 문장에 들어 있는 특수문자를 빈칸으로 수정하겠습니다.
install.packages("stringr")
library(stringr)
#특수문자 제거
txt <- str_replace_all(txt, "\\W", " ")
가장 많이 사용된 단어 알아보기
힙합 가사에 어떤 단어가 많이 사용됐는지 알아보겠습니다.
1.명사 추출하기
먼저 가사에서 명사를 추출해 보겠습니다. 명사를 보면 문장이 무엇에 대한 내용인지 파악할 수 있습니다. KoNLP의 extractNoun()를 이용하면 문장에서 명사를 추출할 수 있습니다.
extractNoun("대한민국의 영토는 한반도와 그 부속도서로 한다")
#[1] "대한민국" "영토" "한반도" "부속도서" "한"
3.힙합 가사에서 명사를 추출하고, 각 단어가 몇 번씩 사용됐는지 나타낸 빈도표를 만들겠습니다. 빈도표는 테이블(table) 형태이므로 다루기 쉽도록 데이터 프레임으로 변환하고 변수명을 수정하겠습니다.
# 가사에서 명사 추출
nouns <- extractNoun(txt)
# 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성
wordcount <- table(unlist(nouns))
# 데이터 프레임으로 변환
df_word <- as.data.frame(wordcount, stringsAsfactors = F)
# 변수명 수정
df_word <- rename(df_word,
word = Var1,
freq = Freq)
3.자주 사용된 단어 빈도표 만들기
가장 많이 사용된 20개 단어를 나타낸 단어 빈도표를 만들겠습니다. 먼저 한 글자로 된 단어는 의마가 없는 경우가 많기 떄문에 nchar()를 이용해 두 글자 이상으로 된 단어만 추출하겠습니다.
#df_word$word를 character화 시키기
class(df_word$word)
df_word$word <- as.character(df_word$word)
class(df_word$word)
# 두 글자 이상 단어 추출
df_word <- filter(df_word, nchar(word) >= 2)
4. 빈도 순으로 정렬한 후 상위 20개 단어를 추출하겠습니다. 출력 결과를 보면 텍스트가 힙합가사이기 떄문에 you, my YAH 같은 영단어가 많이 사용됐다는 것을 알 수 있습니다.
top_20 <- df_word %>%
arrange(desc(freq)) %>%
head(20)
top_20
워드 클라우드 만들기
워드 클라우드(Word cloud)는 단어의 빈도를 구름 모양으로 표현한 그래프입니다. 워드 클라우드를 만들면 단어의 빈도에 따라 글자의 크기와 색깔이 다르게 표현되기 때문에 어떤 단어가 얼마나 많이 사용됐는지 한눈에 파악할 수 있습니다. 힙합 가사에 자주 사용된 단어로 워드 클라우드를 만들어 보겠습니다.
1.패키지 준비하기wordcloud 패키지를 이용하면 워드 클라우드를 만들 수 있습니다. wordcloud 패키지를 설치하고 로드한 후 글자 색깔을 표현하는 데 사용할 RColorBrewer 패키지를 로드하겠습니다. RColorBrewer 패키지는 R에 내장되어 있으니 별도로 설치하지 않아도 됩니다.
# 패키지 설치
install.packages("wordcloud")
# 패키지 로드
library(wordcloud)
library(RColorBrewer)
2. 단어 색상 목록 만들기
RColorBrewer 패키지의 brewer.pal()을 이용해 단어의 색깔을 지정할 떄 사용할 색상 코드 (Hex Color Code)목록을 만듭니다.
# Dark2 색상 목록에서 8개 색상 추출
pal <- brewer.pal(8, "Dark2")
3.난수 고정하기
wordcloud()는 함수를 실행할 때마다 난수(무작위로 생성한 수)를 이용해 매번 다른 모양의 워드 클라우드를 만들어 냅니다. 항상 동일한 워드 클라우드가 생성되도록 wordcloud()를 실행할 하기 전에 set.seed()로 난수를 고정합니다.
set.seed(1234)
4.워드 클라우드 만들기
앞에서 만든 df_word를 이용해 워드 클라우드를 만들겠습니다. df_word는 단어와 단어가 사용된 빈도, 두 변수로 구성된 데이터 프레임입니다.
wordcloud()의 파라미터들은 워드 클라우드의 모양을 결정하는 기능을 합니다. 파라미터에 설정한 내용과 뷰어 창 크기에 따라 워드 클라우드 모양이 달라집니다.
wordcloud(words = df_word$word, #단어
freq = df_word$freq, #빈도
min.freq = 2, #최소 단어 빈도
max.words = 200, #표현 단어 수
random.order = F, #고빈도 단어 중앙 배치
rot.per = .1, #회전 단어 비율
scale = c(4, 0.3), #단어 크기 범위
colors = pal) #색상 목록
출력된 워드 클라우드는 많이 사용된 단어일수록 글자가 크고 가운데에 배치되며, 덜 사용된 단어일수록 글자가 작고 바깥쪽에 배치되는 형태로 구성되어 있습니다. 이 워드 클라우드를 보면 힙합 가사에 어떤 단어가 많이 사용됐는지 직관적으로 알 수 있습니다.
5. 단어 색상 바꾸기
단어 색상 목록을 이용하면 워드 클라우드의 단어 색을 바꿀 수 있습니다. 파란색 계열의 색상 목록을 만들어 빈도가 높을수록 진한 파란색으로 표현되도록 만들어 보겠습니다.
pal <- brewer.pal(9, "Blues")[5:9] #색상 목록 생성
set.seed(1234) #난수 고정
wordcloud(words = df_word$word, #단어
freq = df_word$freq, #빈도
min.freq = 2, #최소 단어 빈도
max.words = 200, #표현 단어 수
random.order = F, #고빈도 단어 중앙 배치
rot.per = .1, #회전 단어 비율
scale = c(4, 0.3), #단어 크기 범위
colors = pal) #색상 목록
'R > 쉽게 배우는 R 데이터분석' 카테고리의 다른 글
국정원 트윗 텍스트 마이닝 (0) | 2020.03.14 |
---|---|
한국인의 삶을 파악하라! -09 (0) | 2020.03.05 |
한국인의 삶을 파악하라! -08 (0) | 2020.03.05 |
한국인의 삶을 파악하라! -07 (0) | 2020.03.04 |
한국인의 삶을 파악하라! -06 (0) | 2020.03.04 |