class: center, middle, inverse, title-slide # Shiny로 네이버 뉴스 검색하기 ## - 소스를 중심으로
###
유충현
--- layout: true <div class="my-footer"> <span> <a href="https://r2bit.com" target="_blank">한국R사용자회</a> </span> </div> --- ## 발표자와 자료 소개 <br> .pull-left[ ### .pink[발표자 소개] .pink[ - 현) 한화생명 Data Analytics팀 - 현) 한국R사용자회 대표 - 다수의 데이터 분석 프로젝트 수행 - 데이터 분석 솔루션 개발 - 현) 분석가? 개발자? 정체성 혼란중 ] ] .pull-right[ ### .light-blue[자료소개] .light-blue[ - 데이터 수집기 개발: - [네이버 오픈 API 데이터 수집](https://choonghyunryu.github.io/tidyverse-meets-shiny/open_api.html)외 2개 웹페이지 - Shiny 어플리케이션 개발: - [네이버 뉴스 검색 애플리케이션](https://choonghyunryu.github.io/tidyverse-meets-shiny/news_app.html)외 5개 웹페이지 - 슬라이드 노트: - [Shiny로 네이버 뉴스 검색하기](https://choonghyunryu.github.io/tidyverse-meets-shiny/slide.html) ] ] --- ## 미트업 FAQ .pull-left-long-wide[ **Q - 발표 자료를 공유해 줄 수 있나요?** - **발표 자료**와 관련된 Shiny 앱 **소스**는 **모두 공개**합니다. - 발표자료: [https://choonghyunryu.github.io/tidyverse-meets-shiny](https://choonghyunryu.github.io/tidyverse-meets-shiny) - 앱 소스: [https://github.com/choonghyunryu/scrap_app](https://github.com/choonghyunryu/scrap_app) **Q - 앱에서 사용한 한글 형태소분석기는 어떻게 설치하나요?** - Docker 이미지: - [https://github.com/choonghyunryu/docker_rserver](https://github.com/choonghyunryu/docker_rserver) - RStudio Server, Shiny Server, Web Server, R Packages - 은전한닢 형태소분석기, RMecab - Google Chrome for pagedown package ] --- class: middle # Shiny 애플리케이션이란 무엇일까? --- class: middle # .hand[We...] .huge[.green[have]] .hand[데이터 파일, 혹은 DBMS의 테이블 데이터] .huge[.pink[want]] .hand[웹 어플리케이션 안에서 데이터 분석 기능의 구현] --- ## 바늘과 실, 그리고 R과 Shiny .pull-left[ <img src="img/R_Shiny.jpeg" width="50%" style="display: block; margin: auto;" /> - **R을 사용 웹 애플리케이션 프레임워크** - 오픈소스 R 패키지 및 서버 - HTML, CSS, JS 지식 없이 앱 개발 ] .pull-right[ <img src="img/bitstat_kor.jpeg" width="70%" style="display: block; margin: auto;" /> - BitStat 오픈통계 패키지 개발 중 - **기업 내 데이터분석 앱 활용** - https://shiny.rstudio.com/gallery/ ] --- ## 분석이라 쓰고 개발이라 읽습니다!!! .tip[ 간단한 toy 앱을 어렵지 않게 작성합니다. **복잡한 비즈니스 로직과 분석을 구현**하면서, **분석가가 아닌 개발자의 모습을 발견**합니다.<br> ] <br> .small[ <table class="table" style="margin-left: auto; margin-right: auto;"> <tbody> <tr> <td style="text-align:left;"> Shiny 활용 </td> <td style="text-align:left;"> Toy Shiny </td> <td style="text-align:left;"> Custom Shiny </td> <td style="text-align:left;"> Enterprise Shiny </td> </tr> <tr> <td style="text-align:left;"> 주된 활용 분야 </td> <td style="text-align:left;"> 재미와 학습 수준의 활용 </td> <td style="text-align:left;"> 연구 및 가벼운 응용 프로그램 </td> <td style="text-align:left;"> 비즈니스 요건의 구현 </td> </tr> <tr> <td style="text-align:left;"> 구현의 난이도 </td> <td style="text-align:left;"> 저 </td> <td style="text-align:left;"> 중 </td> <td style="text-align:left;"> 고 </td> </tr> <tr> <td style="text-align:left;"> 유지보수 난이도 </td> <td style="text-align:left;"> 없음 </td> <td style="text-align:left;"> 중간 </td> <td style="text-align:left;"> 아주 높음 </td> </tr> <tr> <td style="text-align:left;"> 마인드 </td> <td style="text-align:left;"> 관심 </td> <td style="text-align:left;"> 열정 </td> <td style="text-align:left;"> 의무 </td> </tr> <tr> <td style="text-align:left;"> 요구사항 </td> <td style="text-align:left;"> R 언어 소양 </td> <td style="text-align:left;"> 웹 어플리케이션 이해 </td> <td style="text-align:left;"> JS, CSS, 프레임워크, 보안, DevOps, ... </td> </tr> </tbody> </table> ] --- class: middle # 앱 개발을 위한 시나리오 --- ## 분석 주제 선정의 배경 .tip[ 데이터 **분석 주제를 선정하는 것부터 데이터 분석이 시작**됩니다. ] .large[.orange[네이버 뉴스 검색하기 주제 선정 이유]] * API 기반의 데이터 수집의 이해 - 뉴스 데이터 수집의 흥미 유발 - 최근 사회적 이슈는 무엇인가? * 텍스트 데이터의 핸들링 이해 - 가벼운 형태소 분석 - Mecab 형태소분석기 소개 - 가벼운 텍스트 데이터 시각화 --- ## 첫번 째 시나리오 .tip[ **네이버 뉴스를 수집**합니다. ] * .orange[무엇으로 뉴스를 수집할까?] - [koscrap 패키지](https://github.com/choonghyunryu/koscrap) - 아파트실거래, NAVER의 뉴스검색 데이터를 수집 - toy 패키지 * .orange[개인의 API 키는 비밀유지가 필수라는데?] - 앱 소스에 API 키 정보 미 기입 - 앱 화면에서 입력 - **사용자 입력정보의 파일 저장** - 재구동 시 입력안해도 됨 - **base64 인코딩** 저장 --- ## 두번 째 시나리오 .tip[ **기사의 내용을 어떻게 파악할까요?** ] * .orange[어떻게 기사를 읽을까?] - 뉴스 **내용 요약을 출력**해서 대략의 맥락 파악하기 - **뉴스 링크**를 눌러 원문 읽기 - 네이버 뉴스 섹션 링크 - 개별 신문사 페이지 링크 - 날짜순/유사도순 정렬 선택, 검색건수 선택 * .orange[어떤 단어들이 발화되는가?] - 수집된 **전체 뉴스**의 **내용 요약**을 대상으로 - 워드클라우드 플로팅 - 상위 최대 돗수 단어 제외하기 - 포함할 최소 돗수 선택하기 --- class: middle # 주요 기능 소개 --- ## 뉴스 검색 기능 .tip[ **API 키/패스워드 입력**후, **검색어**를 입력합니다. **정렬옵션**과 **검색 건수**는 **선택사항**입니다. ] <img src="img/news-list.jpg" width="65%" style="display: block; margin: auto;" /> --- ## 기사 읽기 기능 .tip[ **목록의 뉴스 링크**를 클릭하여 개별 뉴스를 읽을 수 있습니다. ] <img src="img/links.jpg" width="55%" style="display: block; margin: auto;" /> --- ## 시각화 기능 .tip[ **워드클라우드**를 조회합니다. 몇개의 파라미터를 지원합니다. ] <img src="img/wordcloud.jpg" width="65%" style="display: block; margin: auto;" /> --- class: middle # 주요 기능 소개 --- ## API 키 핸들링 .tip[ **입력의 번거로움을 없애고 싶습니다.** **그렇다고 하드코딩으로 소스에 기술하면 안됩니다.** ] * 시나리오 - 소스의 배포 과정에서 API 키가 묻어 나가면 안됩니다. * 구현 - 최초 사용 시 1회 입력 - 이때 API 키를 base64 인코딩으로 히든 파일에 저장 - 이후 파일을 읽어, 사용자 입력을 패스 - git 배포를 전제로 .gitignore에 히든 파일 등록 --- ## 워드 클라우드 .tip[ **뉴스에 발화되는 명사들을 살펴보고 싶습니다.** **좋은 토크나이저는 무엇인가요?** ] * 형태소 분석 - **은전한닢 형태소분석기** with MeCab - 시스템 사전에 NIADic 추가 - **bitTA** with RMeCab - 속도가 빠르고 성능이 좋음 * 로직 - 개별 뉴스 요약에서 일반명사(NNG) 추출 - 개별 추출 일반명사들을 병합하여 시각화 --- class: middle # Q & A