인공지능 개발자 양성 과정

[0425] 텍스트 마이닝 (1) - 힙합 가사 텍스트 마이닝

AI gina 2022. 4. 26. 07:33

텍스트 마이닝(Text mining)

 - 문자로 된 데이터에서 가치 있는 정보를 얻어 내는 분석 기법

 - SNS 나 웹 사이트에 올라온 글을 분석해 사람들이 어떤 이야기를 나누고 있는지 파악할 때 활용

 - 형태소 분석(Morphology Analysis) : 문장을 구성하는 어절들이 어떤 품사로 되어 있는지 분석

 - 분석 절차

     – 형태소 분석

     – 명사, 동사 형용사 등 의미를 지닌 품사 단어 추출

     – 빈도표 만들기

     – 시각화

 

 

실습 (1) 힙합 가사 텍스트 마이닝

#힙합 가사 텍스트 마이닝

library(KoNPL) #KoNLP : 한국어 형태소 분석 패키지 로드
useNIADic() #사전 선택
txt <-  readLines("./0425/data/hiphop.txt") #readLines : 텍스트파일 불러오기
library(stringr)
library(dplyr)
txt <- str_replace_all(txt, "\\W", " ") # 특수문자 제거
txt <- str_replace_all(txt, "[^[:alpha:]]", " ") # 알파벳 대문자소문자 아닌 문자 제거
txt

nouns <- extractNoun(txt) #명사만 추출
wordcount <- table(unlist(nouns)) #단어별 빈도표 작성(추출한 명사 리스트 내용만 문자열 벡터로 변환)

#자주 사용된 단어 빈도표 만들기
df_word <-  as.data.frame(wordcount, stringsAsFactors = F) #데이터프레임으로 변환
df_word <- rename(df_word, word=Var1, freq=Freq) #변수명 수정
df_word <-  filter(df_word, nchar(word) >=2) #두글자 이상 단어 추출

top20 <- df_word %>% 
  arrange(desc(freq)) %>% 
  head(20)

 top20
   word freq
1   you   89
2    my   86
3   YAH   80
4    on   76
5  하나   75
6  오늘   51
7   and   49
8  사랑   49
9  like   48
10 우리   48
11  the   43
12 시간   39
13 love   38
14   to   38
15   we   36
16   it   33
17   em   32
18  not   32
19 역사   31
20 flex   30
>
#워드 클라우드 만들기

library(wordcloud) #패키지 로드
library(RColorBrewer) #패키지 로드

#단어 색상 목록만들기
pal <- brewer.pal(8,"Dark2") # Dark2 색상 목록에서 8 개 색상 추출
#워드 클라우드 생성
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) # 색깔 목록

#단어 색상 바꾸기
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) # 색상 목록

**참고 : 텍스트의 패턴을 찾을 때 사용되는 정규 표현식

[:digit:] 혹은 \d : 숫자, 0,1,2,3,4,5,6,7,8,9, 동등한 표현 [0-9].

\D : 숫자가 아님, 동등한 표현 [^0-9].

[:lower:] : 영문 소문자, 동등한 표현 [a-z].

[:upper:] : 영문 대문자, 동등한 표현 [A-Z].

[:alpha:] : 알파벳 대소문자, 동등한 표현 [[:lower:][:upper:]] 혹은 [A-z]

[:alnum:] : 알파벳 숫자 문자, 동등한 표현 [[:alpha:][:digit:]] 혹은 [A-z0-9].

\w : 단어 문자, 동등한 표현 [[:alnum:]] 혹은 [A-z0-9].

\W : 단어가 아닌 것, 동등한 표현 [^A-z0-9].

[:xdigit:] : 16진수 (밑이 16), 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f, 동등한 표현 [0-9A-Fa-f].

[:blank:] : 간격 문자, 즉 스페이스와 탭.

[:space:] : 공백 문자: 탭, 개행문자, 수직탭, 공백, 복귀문자, 서식이송(form feed)

\s : 간격, ` `.

\S : 간격 아님.

[:punct:] : 구두점 문자, ! " # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~.

[:graph:] : 그래픽 (사람이 읽을 수 있는) 문자, 동등한 표현 [[:alnum:][:punct:]].

[:print:] : 출력가능한 문자, 동등한 표현 [[:alnum:][:punct:]\\s].

[:cntrl:] : \n, \r 같은 제어문자, 동등한 표현 [\x00-\x1F\x7F].