Post List

2018년 12월 8일 토요일

R에서 워드클라우드 표현하기 (yes24 프로그래밍 인기도서 순위)




워드 클라우드란 글자를 구름모양으로 만들며,
자주 나오는 글자를 더욱 크게 만드는 이미지입니다.
아마 이미 많이들 보셨을 듯 합니다.


yes24의 프로그래밍 관련 인기도서의 책 제목
워드 클라우드로 표현해보도록 하겠습니다.




먼저 국내도서 - IT 모바일 - 프로그래밍 언어에 접속합니다.





그 중 판매량순 그리고 2번 페이지를 클릭하면,
url이 다음과 같이 변경됩니다.

http://www.yes24.com/24/Category/Display/001001003022?ParamSortTp=05&PageNumber=2


여기서 우리는 ParamSortTp가 기본순, 판매량순... 정보에서 판매량 순
PageNumber가 페이지 번호임을 알 수 있습니다.

즉, PageNumber 뒤의 숫자만 변경해주면
해당 페이지의 내용을 긁어올 수 있습니다.

책 제목부분만을 긁어오기 위해
개발자도구를 활용하여 HTML 정보를 가져오도록 합니다.





개발자도구 화면을 잘 이용하여 확인해보면
웹페이지에서 책 제목 부분은

.goods_info 클래스 하부의
.goods_name 클래스 하부의
a 태그에 위치하고 있습니다.

library(rvest)
library(httr)

num = rep(1:50)
url = "http://www.yes24.com/24/Category/Display/001001003022?ParamSortTp=05&PageNumber=" url = paste0(url, num)


먼저 num 변수에 1부터 50까지의 숫자를 지정하고
paste0을 이용해 30번째 페이지 까지의 url을 만들어 줍니다.




다음과 같이 형식에 맞게 url이 생성됩니다.
물론 페이지를 더 늘리고 싶다면 num 숫자를 더 크게 하면 됩니다.

book_name = lapply(url, function(x) {
  
  name = tryCatch({
    GET(x) %>%
    read_html() %>%
    html_nodes(".goods_info") %>%
    html_nodes(".goods_name") %>% 
    html_node("a") %>%
    html_text
  }, error = function(e) {print("Error")})
  
  Sys.sleep(2)
  
  print(x)
  return(name)
}) %>% unlist()

lapply 함수를 사용해 해당 페이지마다 책제목을 크롤링 하도록 합니다.
먼저 GET() 함수를 통해 url 데이터를 받아온 후,
read_html(), html_nodes(), html_node() 함수를 이용해
해당 부분의 데이터를 차례대로 발라냅니다.

그 후 html_text() 함수를 이용해 텍스트 부분만을 추출합니다.

각 loop 마다 슬립은 2초간 주며,
tryCatch() 함수를 이용해 크롤링 에러시 "Error" 를 반환합니다.
(특정 페이지에서 인코딩 문제로 에러가 발생합니다.
원인은 모르겠네요....)

또한 각 loop 마다 list의 형태로 저장되므로,
unlist()를 통해 리스트형태를 풀어주도록 합니다.


> head(book_name)
[1] "Do it! 점프 투 파이썬"                           "윤성우의 열혈 C 프로그래밍"                     
[3] "밑바닥부터 시작하는 딥러닝 "                     "핸즈온 머신러닝"                                
[5] "모두의 파이썬"                                   "파이썬을 이용한 머신러닝, 딥러닝 실전 개발 입문"


book_name 변수를 확인해보면,
책 제목들이 잘 쌓인것이 확인됩니다.

library(dplyr)
library(stringr)

name = str_split(book_name, pattern = " ") %>% 
  unlist() %>%
  table() %>%
  as.data.frame(stringAsFactors = F)

names(name)[1] = "word"


이번엔 책 제목들을 단어 단위로 쪼개주어 줍니다.
먼저 stringr 패키지의 str_split() 함수를 이용하여 패턴별로 단어를 나누어 주며,
그 기준은 공백, 즉 " "로 합니다.

이를 unlist() 통해 리스트 형태로 풀어준 흐
table() 함수를 통해 빈도수를 계산해 줍니다.
그 후, as.data.frame() 함수를 통해 데이터 프레임 형태로 만들어주며,
팩터 형태로 변환되는 것을 막기 위해 파라미터 값은 F로 설정해 줍니다.

name의 이름이 .로 설정되므로 이를 'word' 라는 이름으로 바꾸어 줍니다.


name = name %>%
  mutate(word =  str_replace_all(word, " ", "")) %>% 
  filter(!word %in% c("", "프로그래밍", "Programming", "배우는")) %>% 
  arrange(desc(Freq))

이번엔 클랜징 작업을 하도록 합니다.
먼저 dplyr 패키지의 mutate() 함수를 사용하여
word 열의 데이터를 바꾸어 주도록 합니다.

그 방법은 str_replace_all() 함수를 통해 
word열에서 공백으로 존재하는 " " 문자를
모두 ""로 바꾸어 주도록 합니다.

그 후 filter() 함수를 사용하여 특정 기준을 선택하며,
그 기준으로 ""(공백), "프로그래밍", "Programming", "배우는" 이란 단어가
포함되지 않은 열만을 선택해 줍니다.

공백은 사실 아무 이유없이 발생하는 문자열이며,
프로그래밍(Programming)과 배우는 이란 단어는
프로그래밍 책이라면 당연히 제목에 발생하는 문자이기 때문입니다.

그 후, arrange() 함수를 통해 정렬을 해주며,
desc() 함수를 통해 내림차순으로 정리해 줍니다.


> head(name, 20)
           word Freq
1        파이썬  108
2          위한   56
3          자바   54
4             C   50
5          입문   46
6           C++   45
7               39
8  자바스크립트   36
9        데이터   34
10         코딩   30
11         언어   29
12     시작하는   25
13       활용한   24
14           C#   23
15       스프링   21
16       딥러닝   19
17         개발   18
18         기초   18
19     스크래치   18
20   파이썬으로   18


head() 명령으롤 통해 빈도수가 높은 상위 20개 단어를 살펴보겠습니다.
파이썬이 압도적으로 많으며 (역시 대세 언어군요),
자바, C, C++, 자바스크립트, C# 등이 뒤를 잇는군요

아쉽게 R은 40위에 위치하고 있습니다......


library(wordcloud)

set.seed(1234)
wordcloud(words = name$word,
          freq = name$Freq,
          min.freq = 2,
          max.words = 500,
          random.order = F,
          rot.per = .2,
          scale=c(3,.4),
          colors=brewer.pal(8, "Dark2")
          )


이번에는 이를 워드 클라우드로 표현해보도록 하겠습니다.
먼저 랜덤값 방지를 위해 초기 시드를 1234로 고정하도록 합니다.

wordcloud() 함수에서 각 파라미터를 살펴보면
words는 단어,
freq는 빈도수,
min.freq는 최소 요구 빈도수 (빈도가 특정수 이상의 단어만 표현),
max.words는 최대 몇 단어를 나타낼지,
random.order 를 F로 두면 가장 많은 빈도의 단어가 먼저 표현되게,
rot.per는 단어중 세로로 나오는 비율,
scale은 크기 빈도가 가장 큰 단어와 작은 단어 폰트 사이의 크기,
colors는 단어들의 색을 나타냅니다.

간혹 

Warning messages:
1: In wordcloud(words = name$word, freq = name$Freq, min.freq = 2,  :


과 같은 오류가 뜨면 스케일의 문제이니
scale 부분의 값을 잘 조정하면 오류없이 그림이 나옵니다.



워드 클로우드로 표현한 인기 도서 순위는 다음과 같습니다.
역시나 파이썬이 압도적이군요.....

전처리를 더 잘하고, 여러 파라미터 값들을 잘 조정한다면
더욱 이쁜 워드 클라우드를 만들 수 있습니다.

댓글 없음:

댓글 쓰기