학부공부/데이터마이닝과통계

논문제목+논문저자+논문발간일 크롤링 / wordcloud2

IT grow. 2018. 11. 18. 19:56
반응형





오늘은 구글에서 논문 저자와 메인제목과 메인내용을 가져와 볼 것이다.

먼저 , 구글에 IT논문을 쳐서 , 검색기록들을 분석해 본다 .

 

그런데 , 검색을 하다보니 , 내가 찾고자 하는 정보와 관련없는 내용들이 너무 많았다….

나는 논문관련된 정보만 추출하고 싶었다.

그래서 구글말고 논문 전문 사이트를 이용하기로 하였다.

 

그래서 이용하게된 DBpia 사이트 :

http://www.dbpia.co.kr/SearchResult/TopSearch?isFullText=0&searchAll=IT

 

이 사이트는 논문의 종류가 굉장히 다양하고 정보가 많았다.

 

이 사이트를 이용해서 분석하기 전에 앞서 ,

구글의 페이지 이동에 관해서 알아보았다.

 

 

1번째 페이지 :

https://www.google.com/search?q=%EB%85%BC%EB%AC%B8&ei=EpXvW6bUAcWn8AX6jJvgBg&start=0&sa=N&ved=0ahUKEwimpYnjx9reAhXFE7wKHXrGBmw4ChDy0wMIdw&biw=1522&bih=812

 

 

2번쨰 페이지 : https://www.google.com/search?q=%EB%85%BC%EB%AC%B8&ei=75TvW-SUIoOW8gWz5YLgCQ&start=10&sa=N&ved=0ahUKEwikyNHSx9reAhUDi7wKHbOyAJwQ8tMDCHU&biw=1522&bih=812

 

3번째 페이지 :

https://www.google.com/search?q=%EB%85%BC%EB%AC%B8&ei=RJXvW5yjI8jQ8wWNgLCoDQ&start=20&sa=N&ved=0ahUKEwic1Zb7x9reAhVI6LwKHQ0ADNUQ8tMDCHc&biw=1522&bih=812

 

4번째 페이지 :

 

https://www.google.com/search?q=%EB%85%BC%EB%AC%B8&ei=gZXvW8mCHMeO8wXR0I7IDA&start=30&sa=N&ved=0ahUKEwiJx5qYyNreAhVHx7wKHVGoA8k4FBDy0wMIeA&biw=1522&bih=812

 

구글은 페이지 이동에 사용하는 변수를 start로 주었고 , 이 값의 증가는 10이였다.

보통 페이지 이동할 때 page = 숫자 , 이런 식으로 설정되어있는데, 구글은 이상하게 증가값이 10이였다..

 

 

 

다시 본론으로 들어와서

 

사이트에 들어가서 IT를 입력해 주고 결과값들을 보면 IT와 관련된 논문들이 나오는 것을 알 수 있었다 .

 

그런데 이 사이트는 논문을 사고 파는 그런곳같았다.

 

아무튼 , 이제 이 사이트에서 페이지의 이동이 어떻게 되는지 알아 보자 .

 

검색창에 IT를 입력했을 때 변하는 사이트의 주소는 다음과 같다.

http://www.dbpia.co.kr/SearchResult/TopSearch?isFullText=0&searchAll=IT

searchAll 변수를 사용해서 IT를 검색하는 것을 알 수 있다.

 

첫 번째 페이지의 주소는 다음과 같다.

http://www.dbpia.co.kr/SearchResult/Search?q=%28%5BIT%C2%A7coldb%C2%A72%C2%A751%C2%A73%5D%29&searchWord=%EC%A0%84%EC%B2%B4%3D%5E%24IT%5E*&Collection=0&nSort=1&nSorttype=desc&Page=1&nPagesize=20&searchAll=IT&Multimedia=0&isFullText=0&Collection=0&SearchMethod=0&SrvYN=&PublishDate=&PublishSttDate=&PublishEndDate=

두번째 페이지의 주소는 다음과 같다.

http://www.dbpia.co.kr/SearchResult/Search?q=%28%5BIT%C2%A7coldb%C2%A72%C2%A751%C2%A73%5D%29&searchWord=%EC%A0%84%EC%B2%B4%3D%5E%24IT%5E*&Collection=0&nSort=1&nSorttype=desc&Page=2&nPagesize=20&searchAll=IT&Multimedia=0&specificParam=0&isFullText=0

 

세 번째 페이지는 다음과 같다 .

http://www.dbpia.co.kr/SearchResult/Search?q=%28%5BIT%C2%A7coldb%C2%A72%C2%A751%C2%A73%5D%29&searchWord=%EC%A0%84%EC%B2%B4%3D%5E%24IT%5E*&Collection=0&nSort=1&nSorttype=desc&Page=3&nPagesize=20&searchAll=IT&Multimedia=0&isFullText=0&Collection=0&SearchMethod=0&SrvYN=&PublishDate=&PublishSttDate=&PublishEndDate=

 

이를 통해서 우리는 page 라는 변수를 통해서 페이지의 이동이 되는 것을 알 수 있다.

 

그래서 생각해 볼 수 있는 것이

 

Page를 변수로 두기 위해서 Page를 기준으로 앞 뒤 url을 각각 따로 저장시키는 것이다.


들어가기 전에 앞서서 이 작업을 수행하기 위해서는 몇 가지 패키지들이 필요하다.

library(rvest)

library(xml2)

# 크롤링을 해오기 위해서 필요한 라이브러리들

install.packages("tm")

install.packages("wordcloud2")

install.packages("NLP")

# 필요한 패키지들 


#wordcloud2를 구동하기 위한 라이브러리들 

library(devtools)

library(htmlwidgets)

library(htmltools)

library(jsonlite)

library(yaml)

library(base64enc)

library(tm)

library(NLP)

library(wordcloud2)

 

First_url <- "http://www.dbpia.co.kr/SearchResult/Search?q=%28%5BIT%C2%A7coldb%C2%A72%C2%A751%C2%A73%5D%29&searchWord=%EC%A0%84%EC%B2%B4%3D%5E%24IT%5E*&Collection=0&nSort=1&nSorttype=desc&Page="

 

# First_url :  Page라는 페이지의 이동 변수를 기준으로  앞 주소 

 

second_url <- "&nPagesize=20&searchAll=IT&Multimedia=0&isFullText=0&Collection=0&SearchMethod=0&SrvYN=&PublishDate=&PublishSttDate=&PublishEndDate="

# second_url : Page 라는 페이지의 이동 변수를 기준으로 뒤 주소

 

 

urls <- NULL

 

for(x in 1:5)

{

  urls[x] <- paste0(First_url,as.character(x),second_url)

}

è  이제 앞뒤로 따로 만들어준 urlpaste를 사용해서 하나의 주소로 만들어 줄 것인데 , 이때 for문을 사용해서 1~5페이지의 url주소를 담는 urls변수를 만들어서 싹 다 저장시켜 준다.

 

links <- NULL

 

이제 가져온 주소들에서 본문기사로 넘어가는 주소 url를 가져올 것이다.

 

for(url in urls)

{

 

  #에러 방지

  download.file(url, destfile = "scrapedpage.html", quiet = TRUE)

  html <- read_html("scrapedpage.html")

 

  links <- c(links, html %>% html_nodes(".titleWarp") %>% html_nodes('a') %>% html_attr('href') %>% unique())

 

  # titleWarp는 메인 기사 본문을 의미한다.

  # 찾고자 하는 부분이 class일 경우 앞에 . 을 붙이고 , id이면 #을 붇인다.

  # 가져오고자 하는 클래스명에 띄어쓰기가 있을 경우 띄어쓰기 있는 부분에 .을 사용하면 된다.

  # class = titleWarp : main article

}

 

그런데 , 여기서 저장된 links를 보게 되면 13 , 14 Journal인데 , 15bookrail 의 주소를 가지는것을 확인할 수 있다 . 그래서 , 정제할 필요가 있다고 느낀다.

[13] "/Journal/ArticleDetail/NODE02152540?TotalCount=1544220&Seq=13&q=(%5BIT%C2%A7coldb%C2%A72%C2%A751%C2%A73%5D)&searchWord=%EC%A0%84%EC%B2%B4%3D%5E%24IT%5E*&Multimedia=0&isIdentifyAuthor=0&Collection=0&SearchAll=IT&isFullText=0&specificParam=0&SearchMethod=0&Sort=1&SortType=desc&Page=1&PageSize=20" 
 [14] "/Journal/ArticleDetail/NODE02239356?TotalCount=1544220&Seq=14&q=(%5BIT%C2%A7coldb%C2%A72%C2%A751%C2%A73%5D)&searchWord=%EC%A0%84%EC%B2%B4%3D%5E%24IT%5E*&Multimedia=0&isIdentifyAuthor=0&Collection=0&SearchAll=IT&isFullText=0&specificParam=0&SearchMethod=0&Sort=1&SortType=desc&Page=1&PageSize=20" 
 [15] "http://www.bookrail.co.kr/view/product_detail.asp?co_id=N1004016"

 

 

Grep를 사용해서 journal이 존재하는 url만 따로 num_GCFurl 변수에 저장시킨다.

 

num_GCFurl <- grep("Journal/",links)

결과값

[1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35
[34]  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68
[67]  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100

 

저장이 잘 들어가졌다 .

 

 

이제 links_green 이라는 변수에 걸러진 url 주소들을 저장시켜 줄 것이다.

 

links_green <- NULL

 

# 각 번호에 해당되는 links url links_green에 담는다

# 이 말은 즉슨 , green 기사 url links_green에 저장시키는 것이다.

 

for(num in num_GCFurl)

{

  links_green <- c(links_green, links[num])

}

 

Links_green 결과값은 다음과 같다 .

너무 많아서 마지막만 출력해 본다

[98] "/Journal/ArticleDetail/NODE06357343?TotalCount=1544220&Seq=100&q=(%5BIT%C2%A7coldb%C2%A72%C2%A751%C2%A73%5D)&searchWord=%EC%A0%84%EC%B2%B4%3D%5E%24IT%5E*&Multimedia=0&isIdentifyAuthor=0&Collection=0&SearchAll=IT&isFullText=0&specificParam=0&SearchMethod=0&Sort=1&SortType=desc&Page=5&PageSize=20"

 

그런데 , 여기서 또하나 이상한게 있다.

추출되거 걸러진 주소값을 들어가 보면 서버에서 거절을 한다

 

 

 


 

그래서 보니까 주소값이 이상하긴 하다보통 메인주소의 하위로 가면서 타고 들어가게 되는데 , 메인 페이지의 주소값이 없었다.

 

다음과 같이 메인주소를 걸러진 url에 순서대로 대입해 주었다.

links_dbpia <- NULL

links_dbpia <- paste0("http://www.dbpia.co.kr",links_green[1:98])

 

 

이제 준비 작업은 끝났다.

 

본격적으로 크롤링을 해보자 . 이 부분은 코드를 통해서 설명해 보겠다.

 

main_article <- NULL # main_article , 본문기사

è  메인 문의 기사 제목을 크롤링할 부분

write_name <- NULL # wirte_name , 저자

è  논문에 참여 or 쓴 사람들

Filter_name <- NULL  # Maping group user , 논문제작을 같이한 저자끼리 묶기 위해

è  논문제작에 같이 참여한 사람들을 묶어 주기 위한 변수

small_imformation <- NULL # small_imformation , 소제목과 발간일

è  소제목과 발간일 추출할 부분

 

다음은 위에 설정한 부분들을 토대로 크롤링 하는 부분이다.

 

크롤링을 해 올 때 변수 하나를 설정해 주게된다.

그 변수에 차곡차곡 값들이 쌓이게 된다.

그런데 , write_name은 저자이다.

논문을 쓸 때는 보통 여러명에서 작업하거나 , 혼자하기도 하는데

이것들을 논문에 따라서 묶어줄 필요를 느꼈다.

이렇게 안해주면 논문에 따른 저자들이 제대로 출력이 안될 것이며 , 보기에도 안이쁘다

그래서 나는 다음과 같은 Function 기능을 추가했다.

plus_Str <- function(str,sep=",")

{

  paste(str,collapse = sep)

}

è  function은 문자열 ( 여기서는 이름들 ) 을 받고 sep 로써 “,” 을 줌으로써 구별을 하고

è  paste로써 문자들을 하나의 열로 만드는 Function

그리고 여기서 a는 필터링 된 저자들을 저장하기 위한 주소값이라고 생각하면 된다 .

A의 값이 0 부터 1씩 증가하면서 차곡차곡 쌓일 것이다.

 

a = 0


for문을 돌려서 접근하기 전에 홈페이지 들어가서 우리가 접근하고자 하는 html의 구조를 확인해 보아야 한다.

 

è  메인기사의 class 명은 book_info라는 것을 알 수 있으며 그 하위 태그로 <h3> 감싸진 것을 알 수 있다.

 

 

è  저자의 클래스명은 write_info 로 되어 있으며 , 그 하위 태그 span내에 noticen 클래스로 묶여 있는 것을 알 수 있다.

è  저자들은 특이 했던게 , 저자가 2명이상일 경우에는 span 태그 하위에 <a>태그로써 또 하나의 저자를 만들어 놨다

è  아무튼 noticen 클래스로 접근하면 된다

 

è  위에는 논문의 간략한 초록이다. 이 내용을 같이 크롤링 할려고 했지만 컴퓨터가 감당을 못해서 크롤링하진 않았따아무튼 클래스명은 Con_txt


è  마지막으로 발간일과 간략한 내용을 담고 있는 dt태그이다. 상위 클래스는 Book_info 이며 그 하위 <dl>태그 내에 다시 하위 태그 <dt>로 접근하면 될 것이다.

 

 

이제 다음 for문을 돌려서 크롤링이 제대로 작동하는지 확인해 보자

 

for(link in links_dbpia)

{

  # download.file(link, destfile = "scrapedpage.html" , quite=TRUE)

  # 추후 예방을 위한 download.file은 속도가 약간 느려서 이번에는 그냥 read_html로 읽어와 보겠다.

html <- read_html(link)

è   주소값을 읽어온다 ( html 파일로 )

a <-a + 1

è   초기값 a1이 더해진다.

main_article <- c(main_article, html %>% html_nodes(".book_info") %>% html_nodes("h3") %>% html_text())

 

  write_name <- c(write_name, html %>% html_nodes(".writeInfo") %>% html_nodes(".noticen") %>% html_text())

 

  Filter_name[a] <-plus_Str(write_name,sep=",")

 

  #small_main_text <- c(small_main_text, html %>% html_nodes(".con_txt") %>% html_text())

 

 

  #small_imformation <- c(small_imformation, html %>% html_nodes(".book_info") %>% html_node("dl") %>% html_nodes("dt") %>% html_text())

 

}

 

Main_article 의 결과값 마지막 부분만 출력해 본다. 데이터가 많아서 이다. 칼럼수는 97

"정당성은 빌려올  있는가" 

 

 

Write_name 의 결과값 마지막 부분만 출력해 본다 . 데이터가 많다.

[145] "남정우"      "이해영"      "김영옥"      "김현미"      "김서형"      "김동수"      "이민주"      "박범주"      "이해준"     
[154] "신완선"      "이관후" 

 

앞에서도 말했지만 , 저자들의 이름들이 하나의 이름으로써 write_name에 저장되어 있다 .

이 이름들을 논문에 따라서 같이 작업한 이름끼리 묶어줄 필요가 있다고 생각이 든다.

 

Filter_name의 결과값을 보면 , 다음처럼 첫 칼럼에 “”로 들어가져 있다.

[1] "" 

 

그래서 Filter_name의 첫 칼럼을 지워준다.

Filter_name <- Filter_name[-1]

 

그런데 , 한가지 문제가 더 있다. 다음은 21번째 칼럼을 가져온 것인데 , 이름들이 이어져 있다.

앞에서 말한 문제가 이것이다.

크롤링한 이름들을 하나의 변수에 차곡차곡 쌓는 것인데 , 이것은 보기에 좋을 수 있지만 , 내가 원하는 형태가 아니다.

[21] "최혜민,김성룡,최승년,김희영,조준서,김현화,황은희,이성주,조남영,김병선,조찬우,류권홍,송희영,김도년,이다혜,권오걸,김원준,지형주,곽관훈,문태수,강성배,최상민,문태수,정현,구본근,이주희,곽기영,홍문경,Shoko Tonai,김도승,정대율,노미진,장형유"   

 

그래서 나는 원래에 있는 Filter_name 의 똑 같은 값과 형태를 가지는

Filter_real_name 변수를 또하나 만들어 주었다.

 

Filter_real_name <- NULL

Filter_real_name <- Filter_name[1:97]

 

Filter_real_name은 논문에 매치되는 저자들을 묶어 놓은 저자들이 저장될 변수이다.

 

먼저 for문을 만들어서 돌려주기 전에 , 내가 생각한 것이 맞게 들어가는지 확인해주는 작업이 필요하다

Filter_real_name[2] <- gsub(Filter_name[1],"",Filter_real_name[2])

è  이것은 두번째 칼럼에 첫번째 칼럼에 있는 값이 존재한다면 공백으로 처리하겠다 라는 것을 의미한다

è  실행시켜 보자

실행시켜 보면 결과값은 다음과 같다.

[2] ",김성룡" 

 

이렇게 함으로써 2번째 논문에 해당하는 저자는 김성룡 이 사람으로 추려진다.

 

알맞게 들어감을 확인했으므로  for문을 만들어서 작업해 준다.

for(number in 3:97)

{

  Filter_real_name[number] <- gsub(Filter_name[number-1],"",Filter_real_name[number])

}

2번째 칼럼은 처리했으므로 , 3번째 칼럼부터 진행한다.

 

결과값은 다음과 같다.

[94] ",김동수"                             ",이민주"                             ",박범주,이해준,신완선"              
[97] ",이관후"

 

위 결과값은 94번째 논문의 저자는 김동수” , 95번째 논문의 저자는 이민주” 96번째 논문의 저자는 박범주,이해준,신완선” 97번째 논문의 저자는 이관후라는 것이 확인이 된다.

 

이제 발간일을 저장시켜놓은 small_imformation의 결과값을 보자, 마지막 부분인데

정말 이쁘지 않게 가져왔다. 이부분도 정제할 필요를 느낀다.

[193] "\r\n                    정치사상연구 21 1,  2015.5, 89-114 (27 pages)\r\n                "                                                 
[194] "\r\n                    \r\n                        \r\n                " 

 

 

 

 

다음을 통해서 \r , \n , “ “ 을 제거시킨다.

 

small_imformation <- gsub("\r","",small_imformation)

 

small_imformation <- gsub("\n","",small_imformation)

 

small_imformation <- gsub(" ","",small_imformation)

 

이제 다시 small_imformation의 결과값을 확인해 본다

 

[193] "정치사상연구제211,2015.5,89-114(27pages)"                                           
[194] ""                                          

 

마지막 부분인데 , 이쁘게 되긴했는데 , 2칼럼당 하나의 정보가 들어가있다..

왜그런지는 모르겠지만 , 다시 정제해줄 필요를 느낀다.

 

먼저 , 다음 코드를 통해서 두번째 칼럼을 제거해 본다

small_imformation <- small_imformation[-2]

 

결과값은 다음과 같다.

[2] "IT와법연구제5,2011.2,319-346(28pages)"                                                
  [3] ""  

 

R에서는 칼럼을 제거하면 다음 값이 자동으로 비워진 곳을 채운다

이것 때문에 고생 엄청했다

 

다시 3번째 칼럼을 제거해 보자

 

small_imformation <- small_imformation[-3]

[3] "KoreaBusinessReview18권제3,2014.8,213-245(33pages)"                                 
  [4] ""   

 

내 생각대로 4번째 있던 값이 3번째 칼럼으로 채워진다

마지막으로 4번째를 지워보자.

small_imformation <- small_imformation[-4]

 

결과값은 다음과 같다.

[4] "KoreaBusinessReview16권제1,2012.2,99-117(19pages)"                                  
  [5] ""  

 

이제 먼가 감이 온다.

내가 지워준 칼럼을 기준으로 자동으로 값이 채워지기 때문에 , for문을 통해서 지워볼수 있을 것 같다.

 

for(user in 5:190){

small_imformation <- small_imformation[-user]

}

è  우리는 4번째 칼럼까지 지웠다. 이제 5번째 칼럼을 지울 것인데 , 5번째 칼럼을 지웠다고 가정을 하면 6번째 칼럼에 있던 값이 지워진 5번째 칼럼에 들어갈 것이다. 결론적으로 내가 지워야 할 칼럼들은 5부터 시작해서 1씩 증가하고 , 190까지 지워주면 될 것이다 라는 결론이 나온다.

 

이제 for문의 결과값을 확인해 보면 다음과 같다.

[96] "經營科學第32卷第2,2015.6,1-14(14pages)"                                               
[97] "정치사상연구제211,2015.5,89-114(27pages)"

마지막 부분인데 , 97 칼럼까지 잘 들어간 것을 확인할 수 있다.

이때 칼럼 개수도 확인해야 한다. 왜냐하면 내가 가져온 메인본문의 칼럼수는 97 이였는데 , 이것과 어긋나면 무엇인가 잘못 추출된 것이기 때문이다.

 

본문기사, 저자 , 소제목+발간일을 크롤링해서 정제시켰다.

이제 이 것들을 하나의 새로운 데이터 프레임으로 만들어서 이쁘게 만들어 보겠다.

dt <- data.frame(본문기사=main_article,저자=Filter_real_name,발간일=small_imformation)

 

만든 데이터 프레임을 보면 다음과 같은데 , 너무 안이쁘다 .

그래서 이쁘게 해보겠다.

 

다음의 명령어들을 통해서 각 칼럼들은 왼쪽 정렬을 시킬 것이다

 

dt$본문기사 <- format(dt$본문기사,justify = 'left')

dt$저자 <- format(dt$저자,justify = 'left')

dt$발간일 <- format(dt$발간일,justify = 'left')

 

 

 

 

 

결과값은 다음과 같다.

나름 이쁘게 정리 되었다 ^^

 

이렇게 끝내기는 먼 가 아쉽다.

그래서 나는 csv파일로 저장과 불러오기 , 정제 , 시각화를 해볼 것이다

 

다음 명령어들을 통해서 csv 파일로 각각 별도의 파일로 만들어 준다.

 

write.csv(main_article,"C://Users/user/Desktop/3학년2학기/데이터마이닝과통계/기말_HW2/MainArticle.csv")

write.csv(Filter_real_name,"C://Users/user/Desktop/3학년2학기/데이터마이닝과통계/기말_HW2/Filter_real_name.csv")

write.csv(small_imformation,"C://Users/user/Desktop/3학년2학기/데이터마이닝과통계/기말_HW2/small_imformation.csv")

 

먼저 본문기사를 다뤄보겠다.

 

 

 

상대경로를 통해서 경로를 가져올 것인데 , 이때 주의해야하 점은 아까 저장시켜놓은 각각의 파일은 USer/user/Document 에 저장되어 있어야 한다 . 이상하게도 상대경로가 여기로 저장되어 있었다 한참 해맸다

 

news_path <- paste0(getwd(),"/MainArticle.csv")

modi_txt <- readLines(news_path)

이렇게 함으로써 파일을 읽어 오는 것 까지 되었다.

 

본문기사에 불필요한 기호들은 제거해 준다.

 

modi_txt <- gsub("<U.00A0>"," ",modi_txt)

modi_txt <- gsub("<U.2013>","-",modi_txt)

 

각각 하이픈과 공백은 지워줄 것이다.

 

Txt의 총 line수를 구하고 , line수 만큼 1씩 증가하는 벡터를 생성한다

last_number_of_lines <- length(readLines(news_path))

line_numbers <- seq(1,last_number_of_lines,1)

 

이제 line별 마다 번호를 매기고 , 하나의 data.frame으로 만들어 준다.

doc_ids <- line_numbers

df <- data.frame(doc_id = doc_ids,text = modi_txt, stringsAsFactors = FALSE)

 

만들어준 dfDataframesource를 확인해 본다 .

modi_data <- Corpus(DataframeSource(df))

 

이제 언어를 설정해 줄 것인데 , 한국어로 되어있기 때문에 , 다음처럼 설정해 준다.

Sys.setlocale(category = "LC_ALL",locale ="korean")

 

이제 메인기사의 데이터들을 정제해 볼 것이다.

 

공백이 2개 이상인 것을 1개로 만든다.

modi_data <- tm_map(modi_data,stripWhitespace)

 

숫자는 필요없다. 제거해 준다

modi_data <- tm_map(modi_data,removeNumbers)

 

구둣점들도 제거해 준다.

modi_data <- tm_map(modi_data,removePunctuation)

 

정제가 끝나면 , line별들도 되어 있는 것을 matrix형태로 만들어 준다

 

tdm_modi <- TermDocumentMatrix(modi_data)

 

matrix format시켜 준다

TDM1 <- as.matrix((tdm_modi))

 

이제 모든 단어들의 빈도수를 체크해 보자

v=sort(rowSums(TDM1), decreasing = TRUE)

profile = data.frame(word=names(v),freq=v)

 

 

실행시켜보면 다음과 같다.

 

head(profile,10)

 

word freq
<ec>뿰援<ac>                 <ec>뿰援<ac>   15
\u0080<ed>             \u0080<ed>   14
<8f>                             <8f>   12
誘몄튂<eb>                 誘몄튂<eb>   10
<eb><8c>\u0080<ed> <eb><8c>\u0080<ed>    8
<b8>                             <b8>    6
<ec><ed>                 <ec><ed>    6
<ec><ed>                 <ec><ed>    6
遺꾩꽍                             遺꾩꽍    5
怨좎같                             怨좎같    5

 

결과가 위처럼 뜨게된다 .

이상한게 , 어제만 해도 잘됬는데 , 한글이 깨져버린다

이점을 고치려고 하였으나 차차 찾아보도록 하겠다..

 

 

 

# 저장위치 설정

word_path <- paste0(getwd(),"/MainArticle.csv")

# csv파일로 저장

write.csv(profile, word_path)

 

#수정한 csv파일 불러오기

data <- read.csv(word_path)

# column은 단어의 중복이므로 삭제한다.

data <- data[,-1]

#일정 횟수 이상 검색된 항목만 추출한다.

data_pick <- subset(data, freq >= 0)

# 제일 많이 검색된 순서대로 보기 (10개까지)

head(data_pick,10)

결과값은 다음과 같이 깨진 word를 기준으로 빈도수를 볼 수 가 있다.

word freq
1          <ec>뿰援<ac>   15
2        \u0080<ed>   14
3                <8f>   12
4          誘몄튂<eb>   10
5  <eb><8c>\u0080<ed>    8
6                <b8>    6
7          <ec><ed>    6
8          <ec><ed>    6
9                遺꾩꽍    5
10               怨좎같    5

 

이제 wordclout2로써 시각화를 해볼 것이다.

 

그전에 특정 빈도수에 따른 값들은 글자 색깔을 다르게 줘볼 것이다.

 

# 특정 빈도수에 따른 별도의 색깔 출력

in_out_colors = "function(word,weight)

{return(weight > 5 ? '#4B088A':'#81F7F3')}"

 

 

# word cloud 그리기

# 기존모형으로 wordcloud 생성

# 모양선택 : shape = 'circle' , 'cardioid' , 'diamond ' , 'triangle -forward', 'triangle' , 'pentagon' , 'star'

 

wordcloud2(data_pick,shape = "diamond",size=0.3,color=htmlwidgets::JS(in_out_colors), backgroundColor = "black")


글자 크기인 size = 0.3으로 줘보겠다.

최종결과값은 다음과 같다.

한글이 깨저버려서 값들이 이상하다ㅠㅠ

그렇지만 인코딩 문제를 제외하고선 색깔 옵션이 잘 들어갔고 , 빈도수에 따른 크기도 제대로 들어간 것을 확인할 수 있다.

 

위의 결과는 main_article의 결과이며 , 저자와 , 발간일도 동일하게 해주면 된다

지금은 한글이 깨져서 값이 이쁘게 나오지 않기 때문에 오류 발견시 제대로 올려보겠다ㅠㅠ

 


반응형