트와이스에 대한 문서로 텍스트 마이닝을 해보자.
먼저, 트와이스 관련 문서를 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] "–" "–"
이제 해당 문자들을 공백 " "
으로 대체하여 삭제해주자.
xxxxxxxxxx
twice_eng <- str_replace_all(twice_nospace, "[^[:ascii:]]+", " ")
# 원활한 텍스트 분석을 위해 대소문자를 구분하지 않도록 소문자화시킴
twice_eng <- tolower(twice_eng)
<잠깐!>
이쯤되면 뭔가 불편함을 느꼈을 수도 있다. 현재 매번 새 객체를 만들어 사용하고 이전에 썼던 객체명을 함수 인수로 계속 전달하고 있다. 이러한 과정을 편리하게 하는 dplyr
패키지를 사용해보자.
xxxxxxxxxx
install.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 |
댓글