트와이스에 대한 문서로 텍스트 마이닝을 해보자.
먼저, 트와이스 관련 문서를 pdf로 다운로드 받아준다.
위키피디아 페이지에서 Download as PDF로 들어가서 해당 페이지를 pdf로 다운로드할 수 있다.
1. PDF 파일을 단일 문자열로 만들기
pdftools를 이용해 pdf 파일을 불러오고 stringr 패키지를 이용해서 텍스트 분석을 할 것이다.
xxxxxxxxxx# 패키지 설치install.packages("pdftools")install.packages("stringr")# 패키지 부착library(pdftools)library(stringr)twice_text <- pdf_text("twice.pdf")# 각 문장 구분을 공백으로 하여 단일 문자열로 결합twice_string <- str_c(twice_text, collapse = " ")여기서 pdf 파일은 프로젝트 폴더 내에 위치시켜주면 된다. 현재 프로젝트 폴더 경로를 보려면 getwd() 명령어를 실행하면 된다.
2. 문자열 전처리
1. 불필요한 참고문헌 부분 제거
위 references 섹션은 텍스트 마이닝에 불필요한 정보이므로 전부 삭제한다.
xxxxxxxxxx# References 섹션이 위치하는 곳을 확인한다.str_locate_all(tolower(twice_string), "references")결과
xxxxxxxxxx[[1]] start end[1,] 4129 4138[2,] 23724 23733위 결과를 보면 references 단어가 위치하는 곳이 두 곳이라는 걸 알 수 있다. 하지만 지워주려는 references 섹션은 뒤에 위치하므로 두 번째 위치가 우리가 찾던 위치이다. 이 위치를 기준으로 오른쪽을 전부 지워준다.
xxxxxxxxxx# 23723을 기준으로 오른쪽의 텍스트를 전부 지운다.twice_trunc <- str_trunc(twice_string, 23723, side="right")2. 둘 이상의 공백 처리
xxxxxxxxxx# 둘 이상의 공백을 하나의 공백으로 대체한다.twice_nospace <- str_replace_all(twice_trunc, "[[:space:]]{1,}", " ")3. 영어 이외의 문자(비 알파벳 문자) 제거
제거 전에 삭제될 문자들을 확인해준다.
xxxxxxxxxx# 삭제될 비 알파벳 문자 확인str_extract_all(twice_nospace, "[^[:ascii:]]{1,}")결과
xxxxxxxxxx[[1]] [1] "트와이스" "トゥワイス" "—" "·" "–" [6] "·" "–" "–" "–" "–" [11] "–" "–" "–" "—" "ō" [16] "–" "–" "–" "나연" "정연" [21] "모모" "사나" "지효" "미나" "다현" [26] "채영" "쯔위" "—" "—" "₩" [31] "₩" "–" "–" "–" "–" [36] "–" "–"이제 해당 문자들을 공백 " "으로 대체하여 삭제해주자.
xxxxxxxxxxtwice_eng <- str_replace_all(twice_nospace, "[^[:ascii:]]+", " ")# 원활한 텍스트 분석을 위해 대소문자를 구분하지 않도록 소문자화시킴twice_eng <- tolower(twice_eng)<잠깐!>
이쯤되면 뭔가 불편함을 느꼈을 수도 있다. 현재 매번 새 객체를 만들어 사용하고 이전에 썼던 객체명을 함수 인수로 계속 전달하고 있다. 이러한 과정을 편리하게 하는 dplyr 패키지를 사용해보자.
xxxxxxxxxxinstall.packages("dplyr")library(dplyr)4. dplyr 패키지를 이용한 텍스트 데이터 전처리
구두점을 포함하고 있는 단어를 고려하여 별도의 처리들을 해주어야 하지만 여기선 무시하고 구두점을 제거하겠습니다.
xxxxxxxxxx# 인용 표시 처리twice_processed <- str_replace_all(twice_eng, "\\[[[:digit:]]+\\]|\\([[:digit:]]+\\)", "") %>% # 구두점 제거 str_replace_all("[[:punct:]]+", " ") %>% # 숫자 제거 str_replace_all("[[:digit:]]+", "") %>% # 전처리 과정에서 생긴 공백 제거 str_replace_all("[[:space:]]{1,}", " ") %>% # 빈칸을 기준으로 분할하여 토큰화 str_split(" ") %>% # 단어 벡터로 변환 unlist()dplyr을 사용하면 보다시피 훨씬 간단하고 빠르게 작업할 수 있게 됩니다. 이제 print(twice_processed)를 실행하면 토큰화된 단어들이 출력되는 것을 볼 수 있습니다.
3. WordCloud 생성하기
wordcloud 패키지를 사용하여 손쉽게 데이터 시각화를 할 수 있습니다.
xxxxxxxxxx# 패키지 설치 및 사용install.packages("wordcloud")library(wordcloud)# 단어 빈도수 계산 후 내림차순 정렬twice_freq <- twice_processed %>% table() %>% sort(decreasing = TRUE)# Dark2 에서 8가지 색상 검색pal <- brewer.pal(8, "Dark2")set.seed(405)wordcloud(words = names(twice_freq), # 고유 단어 열 freq = twice_freq, # 단어 빈도 min.freq = 5, # 표시된 단어의 최소 빈도 max.words = 500, # 빈도 순서로 최대 500개 단어 표시 random.order = FALSE, # 중앙에 위치한 최다 빈도 단어들 random.color = TRUE, # 랜덤 색상 rot.per = 0.1, # 플롯에서 회전하는 단어의 비율 scale = c(8, 0.2), # 단어의 크기 범위 colors = pal) # 단어 색상위 코드를 실행시키면 다음과 같이 word cloud가 생성되게 됩니다.
생성된 word cloud를 자세히 보면 the, and, for와 같은 접속사, 전치사 등 의미없는 단어들이 포함되어있습니다. 이러한 것들을 불용어라고 합니다.
4. 불용어 처리
tm 패키지는 불용어 사전을 제공하는 패키지입니다. 이제 tm 패키지를 통해 불용어를 제거하도록 하겠습니다. tm 패키지가 제공하는 사전은 en, smart 사전 두 가지가 있는데 smart 사전이 훨씬 더 많은 단어를 담고 있으므로 smart 사전을 사용하도록 하겠습니다.
x
# 패키지 설치 및 실행install.packages("tm")library(tm)# 불용어 처리# SMART 사전 내 있는 단어들은 전부 배제합니다.twice_nostop <- twice_processed[!twice_processed %in% stopwords("SMART")]twice_freq <- sort(table(twice_nostop), decreasing = TRUE)[1:50]# Dark2 에서 8가지 색상 검색pal <- brewer.pal(8, "Dark2")set.seed(405)wordcloud(words = names(twice_freq), freq = twice_freq, min.freq = 5, max.words = 500, random.order = FALSE, random.color = TRUE, rot.per = 0.1, scale = c(4, 0.2), colors = pal)결과
이제 위와 같이 깔끔한 결과를 볼 수 있습니다.
'R, Python' 카테고리의 다른 글
| [C/C++/C#] 콘솔에서 글자 색 변경하기 (예시: KMP 알고리즘) (0) | 2019.11.05 |
|---|---|
| [python] 네이트판 웹 크롤러를 만들어보자! (0) | 2019.02.13 |
| [Python] 5분만에 음성 인식 구현하기 (4) | 2019.02.05 |
| python 로딩(애니메이션) 쉽게 구현하기 (1) | 2019.01.23 |
| Tistory에 markdown으로 글쓰기 (0) | 2018.10.12 |
댓글