"로봇김삿갓"의 두 판 사이의 차이

cdc wiki
이동: 둘러보기, 검색
(이론적 계산 및 시뮬레이션)
(구성원 및 추진체계)
 
(같은 사용자의 중간 판 74개는 보이지 않습니다)
93번째 줄: 93번째 줄:
 
*류*현: 안드로이드 프론트엔드 개발
 
*류*현: 안드로이드 프론트엔드 개발
 
*이*근: 데이터 전처리, 머신러닝 모델 설계
 
*이*근: 데이터 전처리, 머신러닝 모델 설계
 +
 +
◇ 목요일 수업시간 직 후 회의
 +
◇ 월요일 오후 7시 온라인 디스코드 회의
 +
◇ 토요일 오후 7시 오프라인 회의
 +
◇ Github, Teams, Discord, 카카오톡 으로 파일 및 프로젝트 공유
  
 
==설계==
 
==설계==
151번째 줄: 156번째 줄:
 
  ◇ 안드로이드 어플리케이션에서는 Rest API 통신 방식으로 데이터베이스에 접근하고 값을 받아온다.
 
  ◇ 안드로이드 어플리케이션에서는 Rest API 통신 방식으로 데이터베이스에 접근하고 값을 받아온다.
 
  ◇ 사용자는 시를 짓고 저장할 수 있으며, 시 평가와 시 추천의 커뮤니티를 생성할 수 있게 한다.
 
  ◇ 사용자는 시를 짓고 저장할 수 있으며, 시 평가와 시 추천의 커뮤니티를 생성할 수 있게 한다.
 +
 +
===이론적 계산 및 시뮬레이션===
 +
 +
◇ 머신러닝을 이용해 태그 학습한 모델로 시 데이터에 태깅
 +
- Customized KoNLPy 라이브러리를 이용한 토큰화<br/>
 +
- Interger Encoding과 Word Embedding으로 시 데이터를 벡터화해 단어 특성 표현<br/>
 +
- LSTM을 이용한 모델 구현 및 학습<br/>
 +
- 정확도 평가 후 태깅 작업 및 태그 추천 기능에 이용
 +
 +
◇ 추천 알고리즘을 통한 추천
 +
- 사용자의 감정을 분류<br/>
 +
- 각 감정별 태그 선정 후 태그에 해당하는 시 추천
 +
 +
◇ 사용자의 피드백을 통해 모델 및 알고리즘 개선
 +
- 일일 1회 만족도 조사를 통해 추천 가중치 조정
  
 
===상세설계 내용===
 
===상세설계 내용===
내용
+
*Server
 +
{| class="wikitable" style="font-weight:bold; text-align:center;"
 +
|-
 +
! 기능
 +
! 설명
 +
|-
 +
| [[파일:Network.png]]<br/> 네트워크 구조
 +
| style="font-weight:normal;" | 프로젝트 초기에 학습한 모델의 Evaluation에 시간이 많이 들 것이라 예상하였고, 보다 성능이 좋은 GPU 서버에 Evaluation 작업을 할당하여 작업시간을 줄이려 시도.<br/> 하지만 예상한 것보다 Evaluation에 드는 시간이 많지 않아 (API 서버에서 500자 시를 Evaluation할 시 1초 이내로 처리됨) 구조를 단순화하고 작업을 줄이기 위해 Evaluation 작업을 API서버에서 처리하고 GPU서버에서는 학습만 담당하는 구조로 변경. <br/>이외에는 인증을 위해 카카오 API 서버와 E2 Micro VM을 연결.
 +
|-
 +
| [[파일:Restful2.png]]<br/> 서버의 기능 제공을 위한 RESTful API 구현
 +
| style="font-weight:normal;" | REST는 Representational State Transfer의 약자로 엄격한 의미로의 REST는 자원을 정의하고 자원에 대한 주소를 지정하는 방법들의 모음.<br /> 웹 상의 자료를 HTTP 위에서 쿠키를 통한 세션 트랙킹같은 별도의 전송 계층 없이 전송하기 위한 간단한 인터페이스이므로 간단한 정보 전달을 하는 로봇 김삿갓 서버 구성에 적합. 로봇 김삿갓의 API를 REST로 부르기 위해서는 몇 가지 필수 제약조건을 지켜야 함.<br/><br/>- 인터페이스 일관성 (Uniform)<br/>1. identification of resouces<br/> 2. manipulation of resources through representation <br/> 3. self-descriptive messages<br/>4. hypermedia as the engine of appliacation state (HATEOAS)<br/>- 무상태 (Stateless)<br/>- 캐시 처리 가능 (Cacheable)<br/>- 계층화 (Layered System)<br/>- 클라이언트/서버 구조<br/><br/> 로봇 김삿갓에는 Uniform Interface의 self-descriptive 조건과 HATEOAS 조건을 달성하지 않았으므로 엄밀한 의미로의 REST는 아니지만,<br/> URI의 형태로 자원을 제공하는 Stateless 한 API로 간단한 의미로서의 REST를 구현했다 볼 수 있음.
 +
|-
 +
| [[파일:oauth2-2.png]] <br/> 서버 인증을 위한 카카오 소셜로그인과 토큰 기반 인증
 +
| style="font-weight:normal;" | OAuth는 사용자들이 웹 어플리케이션에게 비밀번호를 제공하지 않고<br/> 다른 기관이나 기업에 인증을 대리하게 하고,<br/> 인증 후에 그 권한만을 웹 어플리케이션에서 사용할 수 있게 하는 프로토콜.<br/> 카카오에서도 OAuth를 이용한 로그인 API를 제공하는데 이를 이용해 로봇 김삿갓의 로그인 과정을 구현하였고, 로봇 김삿갓 API의 이용을 위한 인증은 세션 기반이 아닌 토큰 기반 인증으로 구현. 아래는 로그인 과정의 흐름.<br/><br/>1. 먼저 클라이언트에서 카카오 API서버에 인증 요청을 보낸다.<br/>2. 인증이 성공하였다면 카카오 API 서버에서 이 유저만을 위한 토큰을 발급해준다.<br/>3. 클라이언트는 로봇 김삿갓 API 서버에 이 토큰을 보내 로그인 처리를 요청한다.<br/>4. 로봇 김삿갓 API 서버는 클라이언트로부터 받은 토큰이 올바른 토큰인지 확인하기 위해 카카오 API 서버로 토큰 검증 요청을 보낸다.<br/>5. 카카오 API 서버는 토큰의 검증 결과를 회신한다.<br/>6. 클라이언트에게 받은 토큰이 올바른 토큰이었다면, 로봇 김삿갓의 API 이용을 위한 토큰을 클라이언트에게 발급해준다.
 +
|-
 +
| [[파일:Https.png]]<br/> 보안을 위해 HTTPS 프로토콜 사용
 +
| style="font-weight:normal;" | 안드로이드 버전 9.0(Pie)부터 SSL 보안이 적용되지 않은 서버와의 통신을 막아놓았기 때문에 로봇 김삿갓 앱(클라이언트)와 서버 통신을 위해, 서버에 HTTPS를 적용.
 +
|}
 +
<br/><br/>
 +
* DB
 +
[[파일:db.png]]
 +
<br/><br/>
 +
* APP
 +
{| class="wikitable" style="font-weight:bold; text-align:center;"
 +
|-
 +
! 기능
 +
! 설명
 +
|-
 +
| [[파일:Mvvm.png]]<br/> MVVM 패턴
 +
| style="font-weight:normal;" | MVVM 패턴은 MVP모델의 변형으로 비즈니스 로직 처리와 프레젠테이션 로직 처리를 분리하여 의존성을 낮추고, 모델의 플랫폼에 종속되지 않도록 함.<br/><br/> 1. Model: 앱 내부 DB나 서버에서 제공하는 데이터 등의 실질적인 데이터 계층을 참조하는 계층. 로봇 김삿갓 어플리케이션에서 API 서버에서 데이터를 받아오는 PoemServer 클래스만을 Model로 하였으나 어플리케이션의 로컬 데이터베이스도 같이 사용. 이를통해 서버로부터 한번 받아온 데이터를 로컬 데이터베이스에 저장해두어 서버에 데이터를 요청하는 횟수를 줄이고 서버에 접근할 때 마다 드는 지연시간을 없애 어플리케이션의 반응성을 높일 수 있음.<br/><br/> 2. View: UI처리를 맡는 부분으로, 사용자의 상호작용에 따른 처리를 데이터 바인딩을 통해 ViewModel로 전달. 로봇 김삿갓의 댓글 기능을 예시로 보자면, 댓글 달기 버튼의 클릭 리스너에서 ViewModel의 콜백을 등록하여(DataBinding) 사용자의 상호작용(사용자가 버튼을 클릭했는지)를 ViewModel에게 전달하고, 이후 ViewModel이 Model로부터 데이터를 받아오면 등록된 콜백을 통해 View에 필요한 데이터를 전달함으로써 View와 ViewModel간의 연동을 구현했다.<br/><br/>3. ViewModel: Model과 View사이의 상호작용을 담당. View에서 Model의 데이터를 쉽게 이용할 수 있는 형태로 제공하는 것이 목적으로, Model의 데이터를 콜백의 형태로 View가 읽거나 쓸 수 있도록 설계.
 +
|}
 +
* APP UI 흐름도
 +
[[파일:App_flow-2.png]]
 +
* APP 메뉴 구성
 +
{| class="wikitable" style="text-align:center;"
 +
|- style="font-weight:bold;"
 +
! 시스템
 +
! Level 1
 +
! Level 2
 +
! Level 3
 +
! Level 4
 +
|-
 +
| rowspan="12" | 사용자용<br />프로그램
 +
| rowspan="12" | 홈
 +
| rowspan="6" | 메뉴
 +
| rowspan="2" | 추천 목록
 +
| 좋아요
 +
|-
 +
| 댓글 작성
 +
|-
 +
| rowspan="2" | 좋아요 목록
 +
| 좋아요
 +
|-
 +
| 댓글 작성
 +
|-
 +
| rowspan="2" | 내가 쓴 시
 +
| 좋아요
 +
|-
 +
| 댓글 작성
 +
|-
 +
| rowspan="2" | 추천 된 시
 +
| 좋아요
 +
| rowspan="6" style="text-align:left;" |
 +
|-
 +
| 댓글 작성
 +
|-
 +
| rowspan="4" | 시 작성
 +
| 제목 작성
 +
|-
 +
| 본문 작성
 +
|-
 +
| 시 분위기 체크
 +
|-
 +
| 저장하기
 +
|}
 +
* APP 화면 목록
 +
{| class="wikitable" style="text-align:center;"
 +
|- style="font-weight:bold;"
 +
! 화면 ID
 +
! 화면 명
 +
! 화면 설명
 +
|- style="vertical-align:middle;"
 +
| style="font-weight:bold; text-align:left;" | UI-S1-001
 +
| 로그인 화면
 +
| 로그인 화면
 +
|- style="vertical-align:middle;"
 +
| style="font-weight:bold; text-align:left;" | UI-S1-002
 +
| 기분 물어보기
 +
| 사용자의 기분이 어떤 상태인지 얻는다.
 +
|- style="vertical-align:middle;"
 +
| style="font-weight:bold; text-align:left;" | UI-S1-003
 +
| 태그 물어보기
 +
| 그 기분에 맞는 태그 중 어떤 태그를 볼 것인지 물어본다.
 +
|- style="vertical-align:middle;"
 +
| style="font-weight:bold; text-align:left;" | UI-S1-004
 +
| 메인 화면
 +
| 추천된 시 한편이 나오고 메뉴 버튼과 시 작성 버튼이 있다.
 +
|- style="vertical-align:middle;"
 +
| style="font-weight:bold; text-align:left;" | UI-S1-005
 +
| 메뉴 화면
 +
| 추천 목록 화면, 좋아요 목록 화면, 내가 쓴 시 화면으로 갈 수 있는 버튼들이 있다.
 +
|- style="vertical-align:middle;"
 +
| style="font-weight:bold; text-align:left;" | UI-S2-006
 +
| 시 작성 화면
 +
| 직접 시를 작성 할 수 있다.
 +
|- style="vertical-align:middle;"
 +
| style="font-weight:bold; text-align:left;" | UI-S1-007
 +
| 추천 목록 화면
 +
| 추천된 시의 목록을 확인할 수 있다.
 +
|- style="vertical-align:middle;"
 +
| style="font-weight:bold; text-align:left;" | UI-S1-008
 +
| 좋아요 목록 화면
 +
| 내가 좋아요를 누른 시들을 볼 수 있다.
 +
|- style="vertical-align:middle;"
 +
| style="font-weight:bold; text-align:left;" | UI-S1-009
 +
| 내가 쓴 시 화면
 +
| 내가 작성한 시 들을 볼 수 있다.
 +
|}
 +
* APP 화면 흐름도
 +
[[파일:App_flow22.png]]
  
 
==결과 및 평가==
 
==결과 및 평가==
 
===완료 작품의 소개===
 
===완료 작품의 소개===
 
====프로토타입 사진 혹은 작동 장면====
 
====프로토타입 사진 혹은 작동 장면====
내용
+
{| class="wikitable"
====포스터====
+
|-
내용
+
![[파일:Prototype1.PNG ]]
 +
![[파일:Prototype2.PNG ]]
 +
![[파일:Prototype3.PNG ]]
 +
![[파일:Prototype4-2.png]]
 +
|}
  
 
===관련사업비 내역서===
 
===관련사업비 내역서===
내용
+
{| class="wikitable" style="text-align:center;"
 +
|- style="font-weight:bold;"
 +
! colspan="2" | 소속 학부과
 +
! colspan="2" | 컴퓨터과학부, 공간정보공학과
 +
! 팀명
 +
! style="text-align:left;" | 로봇 김삿갓
 +
|- style="font-weight:bold;"
 +
| colspan="2" | 목
 +
| colspan="2" | 구분
 +
| 예산금액
 +
| 비고
 +
|-
 +
| rowspan="3" colspan="2" style="font-weight:bold;" | 민간경상보조<br />(활동비)
 +
| colspan="2" | 회의비
 +
| 20,000
 +
| rowspan="3" | 공학계열
 +
|-
 +
| colspan="2" | 공간대여료
 +
| 20,000
 +
|-
 +
| colspan="2" | 개발관련서적구매
 +
| 53,000
 +
|-
 +
| colspan="2" style="font-weight:bold;" | 합계
 +
| colspan="4" style="font-weight:bold;" | 93,000 원
 +
|-
 +
| colspan="2" style="font-weight:bold;" | 재료비
 +
| colspan="2" | Android Google Play, 개발자 등록비
 +
| 29,000 * 4
 +
| 공학계열
 +
|- style="font-weight:bold;"
 +
| colspan="2" | 합계
 +
| colspan="4" | 116,000 원
 +
|- style="font-weight:bold;"
 +
| colspan="2" | 총계
 +
| colspan="4" | 209,000 원
 +
|}
  
 
===완료작품의 평가===
 
===완료작품의 평가===
내용
+
* 머신러닝
 +
 
 +
◇ 감정의 복합성과 주관성 문제: 감정은 명확한 기준이 되는 선을 통해 구분되지 않고 유기적으로 연결되어 있으며 같은 것을 보고 사람마다 느끼는 감정은 각자 다름.
 +
◇ 동음이의어 문제: embedding을 통해 단어에 의미를 부여하는 과정에서 동음이의어의 여러 뜻은 문맥에 따라서 해석되지 않고 동일하게 한가지로 인식. 그래서 의도하지 않은 주제 사이의 연관성이 생기거나 다른 의미로 해석되는문제발생.
 +
◇ 데이터셋에 대한 문제와 레이블링의 한계: 초기 시 데이터 수집과정에서 저작권 문제를 고려해 공유마당에서 크롤링, 고전 시의 비중이 높아 학습 시 편향성이 생기는 문제.
 +
◇ 최근 시인들의 시는 저작권 문제 때문에 이용이 어려워 각 주제의 특성을 잘 나타낼 수 있는 시 데이터가 부족했음.
 +
◇ 시의 특성이 생각대로 도출되지 않아 비지도학습에서 지도학습으로 방식을 변경, 여기서 가장 큰 레이블링 문제.
 +
◇ 우리가 원하는 감정이라는 레이블이 있는 시 데이터를 수집할 수 없어 결국 직접 레이블링을 1000개 정도 했지만 역부족. 좋지 않은 데이터셋 문제와 겹쳐 높은 정확도를 내지 못한 가장 큰 원인이라고 판단.
 +
◇ 구한 시 데이터의 대부분이 고전 시인데 의미 파악하기가 어렸으며, 현대 시의 데이터를 구할 때는 저작권 사용에 어려움이 있었음.
 +
◇ 머신러닝 모델을 학습시키기 위한 테스트셋을 만드는데 일일이 태그를 달아줘야 했음.
 +
 
 +
* 안드로이드
 +
◇ 기능이 많은 안드로이드 스튜디오를 처음 사용. 안드로이드용 xml 파일 구성이나 그를 제어하기 위한 java파일 구성과 kotlin파일 복합적인 사용에 어려운 부분이 있었음.
 +
◇ 서버와 앱간의 통신을 위한 코드 구현을 위해서 다루어야하는 Rest API 사용법 학습이 어려웠음.
 +
◇ Navigation System을 적용하는 것과 Fragment를 사용한 화면 전환이 어려웠음.
 +
◇ Git 사용시, branch merge 시 충돌하는 문제가 종종 발생하여 개발을 통합할 때 어려웠음.
 +
 
 +
* 데이터베이스
 +
◇ 데이터베이스의 구조를 구성하면서 테이블 간의 연결성과 무결성을 구현하는 어려움.
 +
 
 +
* GPU 서버
 +
◇ 클라우드 환경에서 사용해야 하기에 터미널로만 이용해야 했음.
 +
◇ 보안성 때문에 IP 사용 승인을 해야 했고, 서로 겹쳐져서 접속하지 않도록 스케줄링 필요.
 +
◇ Linux 환경에 구성된 서버였기 때문에 Linux와 terminal 사용에 대한 이해가 필요했음.
  
 
===향후계획===
 
===향후계획===
내용
 
  
===특허 출원 내용===
+
◇ 고전 시뿐만 아니라 현대 시 데이터를 추가하여 명확한 의미로 분류되도록 데이터 전처리를 원활하게 진행
내용
+
◇ 시 분류의 정확도를 높이기 위한 나머지 라이브러리를 활용. 케라스, 파이토치, Theano등의 머신러닝 모델 추가하고 비교해여 더 좋은 모델로 개선함
 +
◇ 안드로이드의 최신 API에서 제공하는 부가 기능들을 활용하여 애플리케이션의 디자인 개선
 +
◇ 사용자의 질문을 세분화하여 점수산정을 정확하게 하고, 시를 추천해 주는 알고리즘 개선하여 사용자의 만족을 높이는 방식을 개선

2020년 12월 15일 (화) 22:26 기준 최신판

프로젝트 개요

기술개발 과제

국문 : 머신러닝을 활용한 시 추천 어플리케이션 개발

영문 : Development of poem recommendation application using machine learning.

과제 팀명

로봇 김삿갓(Robot KimSatGat)

지도교수

이병정 교수님

개발기간

2020년 9월 ~ 2020년 12월 (총 4개월)

구성원 소개

서울시립대학교 공간정보공학과 20159300** 김*중(팀장)

서울시립대학교 컴퓨터과학부 20149200** 김*석

서울시립대학교 컴퓨터과학부 20149200** 류*현

서울시립대학교 컴퓨터과학부 20149200** 이*근

서론

개발 과제의 개요

개발 과제 요약

◇ 코로나 시대, 메마른 감성으로 일상을 살아가는 사람들에게 적절한 위로와 격려를 하고자 본 프로젝트를 진행하게 되었음. 머신러닝을 활용하여 한글 시를 자연어 처리하여 시의 분위기에 맞는 주제를 태깅 및 데이터베이스에 저장함. 이후, 스마트폰 애플리케이션에서 사용자 데이터를 기반으로 상황에 맞는 적절한 시를 추천하는 것을 목표로 함.

개발 과제의 배경

◇ 코로나 레드, 블루로 감정에 대한 위로가 필요함. 그래서 ‘시’로 위로를 하면 좋겠다고 판단하였음. 
◇ 많이 사용하는 스마트폰의 앱을 통해서 시를 제공하기로 결정.
◇ 개인에게 맞춤형 시 내용을 제공하기 위해 머신러닝을 활용.
◇ 한글 시들에 대한 머신러닝 분석, 시에 대한 관심 재고. 
◇ 사용자가 시를 직접 창작하고 이를 게시할 수 있도록 하여 참여형 커뮤니티를 형성.

개발 과제의 목표 및 내용

◇ 머신러닝으로 한글 시 분석하여 3가지 주제(날씨, 감정, 시간대)에 대한 태깅.
◇ 태깅된 시를 데이터베이스에 저장하고, 앱에서 시 데이터 호출.
◇ 초기 로그인 API 사용자 정보와 간단한 설문조사를 바탕으로 시 맞춤 추천.
◇ 어플리케이션 사용자가 시를 작성하여, 작성된 자작시를 DB에 저장. 해당 시를 다른 사용자에게 추천.

관련 기술의 현황

관련 기술의 현황 및 분석(State of art)

  • 전 세계적인 기술현황
    • 머신러닝: 컴퓨터는 데이터를 분석하고 스스로 학습하는 과정을 거치고 나면 패턴을 인식할 수 있는 능력을 갖추게 된다. 이렇게 되면 입력하지 않은 정보에 대해서도 판단, 결정할 수 있게 되는 것이며, 이것이 바로 기계 학습이다. 다시 말해, 방대한 양의 데이터 가운데 비슷한 것끼리 묶어내고 서로 관계있는 것들의 상하구조를 인식하여 이것을 바탕으로 앞으로의 행동을 예측하는 기술인 것이다.
      • 장점: 더 빠른 의사 결정, 실시간 데이터 처리로 높은 적응성, 알고리즘 활용 비즈니스, 인간이 알지 못하는 더 깊은 통찰력 얻음, 대량의 데이터 처리와 정확한 결과 예측으로 인한 높은 효율성
    • Django: 2005년부터 시작된 Python의 오픈 소스 웹 프레임워크이자 풀 스택 프레임워크. Django 소프트웨어 재단은 소셜 댓글 서비스 디스커스(Disqus)를 만든 곳. Python을 이용해 제작. Django는 Python 기반 웹 프레임워크 중에 가장 널리 퍼져있다.
      • 장점: ORM을 기본적으로 제공, MVT 패턴에서 Model 의 경우 데이터베이스와 연동이 편함, 기본적으로 Model에 해당하는 DBMS는 SQLite를 사용하여 Django Admin 기능을 통해 쉽게 조회/편집이 가능,관리자 페이지를 기본적으로 제공, 자주 사용되는 로직들을 묶어서 기본적으로 제공, 만들어진 엔티티에 따라 권한 목록을 알아서 제공.
    • SQLite: SQLite는 MSSQL, MySQL과 같은 데이터베이스 관리 시스템이지만, 서버가 아니라 오프라인에서 응용 프로그램에 넣어 사용하는 비교적 가벼운 임베디드 데이터베이스이다. 일반적인 RDBMS에 비해 대규모 작업에는 적합하지 않지만, 중소 규모라면 속도도 손색이 없다. 또, API는 단순히 라이브러리를 호출하는 것만 있으며, 데이터를 저장하는 데 하나의 파일만을 사용하는 것이 특징이다. 안드로이드 SDK에도 기본 탑재되어 있으며, 안드로이드 앱의 데이터 관리에 필수적인 컴포넌트라 할 수 있을 정도로 널리 사용되고 있다.
      • 장점: 로컬에서의 간단한 DB 구성, 작은 크기와 간결함, 크로스 플랫폼, 라이센스의 자유, 비용 절감(오픈소스 프로젝트), 특히 로컬에서 구동되는 DB이기 때문에, 네트워크 구성 비용, 방화벽이나 네트워크 주소 변환등의 관리 비용이 들지 않음
    • Android OS: 안드로이드(Android)는 리눅스 커널을 기반으로 구글에서 제작한 스마트폰과 같은 플랫폼의 모바일 운영 체제와 미들웨어 및 중요 애플리케이션이 포함된 소프트웨어 집합이다. 구글은 새로운 운영 체제의 버전 공개와 동시에 소스를 공개하고 있다. 이렇게 공개된 소스를 AOSP라고 한다.
      • 장점: 자바기반, 오픈소스, 완벽한 컴포넌트, 높은 점유율, 높은 이식성, 쉬운 연동
  • 특허조사 및 특허 전략 분석
http://www.kipris.or.kr/ 특허조회에서 ‘머신러닝’,‘지도학습’, ‘자연어 처리’, ‘시 추천’ 키워드를 포함한 조사 결과 관련 특허는 존재 하지 않았음.
◇ 지도학습 머신러닝을 활용한 한글 자연어처리 활용도와 높은 분석력 강조
◇ 안드로이드 어플리케이션을 활용하여 사용자에게 시 추천함 시도들 강조

시장상황에 대한 분석

  • 경쟁제품 조사 비교
경쟁2.png
  • 마케팅 전략 제시
Swot2.png
◇ 다른 앱에서는 사용자 기분에 대한 맞춤 시 제공을 하지 않으므로 이 부분을 강조한다.
◇ 별도의 인증이나 결제 없이 카카오 로그인만으로 이용 할 수 있음을 강조한다.
◇ 안드로이드 스마트폰 이라면 최신 기종이 아니라도 이용 가능함을 강조한다.
◇ 쉽고 빠르게 시를 즐길 수 있음을 강조한다.
◇ 다양한 분위기의 시를 제공하고, 직접 시를 작성하여 평가받는 커뮤니티 제공 서비스를 강조한다.

개발과제의 기대효과

기술적 기대효과

◇ 지도학습 뿐만 아니라 비지도학습, 강화학습을 통한 머신러닝 분석을 진행했을 때, 그 결과를 비교하여 한글 데이터 분석에 대한 정밀함을 예측하고 발전할 수 있음
◇ 추후 안드로이드 뿐만 아니라 iOS, Windows같은 다중 플랫폼에서 개발하여 다양한 플랫폼에서 더 많은 사용자가 어플리케이션을 이용하여 확장된 사용자 커뮤니티를 생성 할 수 있음

경제적, 사회적 기대 및 파급효과

◇ 시를 읽으며 사용자들에게 감정적인 위로와 치료를 제공 할 수 있음
◇ 시인들이 활동할 수 있는 공간을 만들어주어 디지털시대에 좋은 경제적 환경을 마련해줌
◇ 사용자의 기분에 맞추어 시를 제공하는 머신러닝을 통해 인간감정에 대한 예측에 대한 정밀한 연구를 진행해볼 수 있음

기술개발 일정 및 추진체계

개발 일정

개발일정2.png

구성원 및 추진체계

  • 김*중(팀장): 안드로이드 백엔드 개발, 문서작성
  • 김*석: 크롤링, 서버 제작 및 관리
  • 류*현: 안드로이드 프론트엔드 개발
  • 이*근: 데이터 전처리, 머신러닝 모델 설계
◇ 목요일 수업시간 직 후 회의
◇ 월요일 오후 7시 온라인 디스코드 회의
◇ 토요일 오후 7시 오프라인 회의
◇ Github, Teams, Discord, 카카오톡 으로 파일 및 프로젝트 공유

설계

설계사양

제품의 요구사항

  • 사용자 요구사항
◇ 안드로이드 스마트폰으로 어플리케이션을 실행한다.
◇ 카카오 계정을 연동하여 앱 로그인을 실행한다.
◇ 주어진 질문1, 질문2를 수행하여 자신의 감정 상태를 표기한다.
◇ 질문 결과 표출되는 시를 확인 할 수 있다. 
◇ 표출되는 시에 대하여 좋아요를 선택 할 수 있다.
◇ 표출되는 시에 대하여 댓글을 남기길 수 있다.
◇ 내가 직접 시를 작성할 수 있다.
◇ 드로우어를 열어 원하는 옵션을 선택 할 수 있다.
◇ 내가 추천 받았던 시 목록을 확인 할 수 있다.
◇ 내가 좋아요를 눌렀던 시 목록을 확인 할 수 있다.
◇ 내가 작성한 시 목록을 확인 할 수 있다.
  • 사용자 요구사항 만족을 위한 기능 정의 및 기능별 정량목표
◇ 안드로이드 스튜디오 통합개발환경을 사용하여 개발을 진행한다. 이후 릴리즈를 통하여 APK를 작성한다.
◇ 카카오 SDK 서버를 통한 카카오 계정을 연동하여 앱 로그인을 구현한다. Oauto2.0과 토큰 기반의 인증을 사용한다.
◇ 주어진 질문1, 질문2를 수행한 결과를 API 서버로 전달하여, 사용자의 감정(Feeling)별의 점수를 산출하고 이에 맞는 시 분위기(Tag)를 가진 시를 나타내도록 한다.
◇ 질문 결과 표출되는 시는 데이터베이스의 시 데이터에서 가져오도록 한다. 데이터베이스는 OracleDB로 구현한다. 
◇ 표출되는 시에 대하여 ‘좋아요’는 ImageButton으로 구현하고 API, DB 서버에 반응하도록 한다.
◇ 표출되는 시에 대하여 ‘댓글’을 구현하고 API, DB 서버에 반응하도록 한다.
◇ 내가 직접 시를 작성하는 레이어는 프래그먼트가 아닌 별도의 액티비티에서 작성하도록 한다.
◇ 드로우어를 열어 원하는 옵션을 선택 하기 위해 안드로이드 Navigation Drawer를 활용한 메뉴를 구현하도록 한다.
◇ ‘내가 추천 받았던 시 목록’을 확인 할 수 있도록 Fragment 상에서 표출되도록 구현한다.
◇ ‘내가 좋아요를 눌렀던 시 목록’을 확인 할 수 있도록 Fragment 상에서 표출되도록 구현한다.
◇ ‘내가 작성한 시 목록’을 확인 할 수 있도록 Fragment 상에서 표출되도록 구현한다.

설계 사양

  • APP:
 ◆ Android: API 19이상 / Java, Kotlin(Kakao API 사용 코드)
  • Server:
 ◆ API - Google Cloud E2 Micro VM (Google, Django, RestAPI)
 ◆ DB - Oracle ATP Database (Oracle)
 ◆ GPU - NIPA-GPU Quadro RTX 6000 (정보통신산업진흥원)
  • Machine Learning:
 ◆ Python(Customized KoNLPy 라이브러리): 자연어 처리를 위한 토큰화 작업을 위해 여러 토큰화 라이브러리 중 한국어 형태소 처리에 특화되었고 지속적인 업데이트를 하는 것으로 확인된 Customized KoNLPy를 사용함.
 ◆ Word Embedding, Interger Encoding, padding: 시 데이터의 단어 토큰들의 의미를 유지하며 연관성을 비교하기 위해 Word Embedding을 사용하였고 embedding vector를 만드는 과정에서 Interger Encoding 기법을 사용. 딥러닝 모델의 입력을 위해 Padding을 통해 시 본문의 길이를 일정하게 변환.  
 ◆ LSTM(Long Short-Term Memory, 장단기메모리): Neural Network를 구성하는데 초기에는 MLP(MultiLayer Perceptron)를 이용해 구현했으나 DTM(Document-Term Metrix, 문서-단어 행렬)은 단어의 빈도를 기반으로 하는 단점이 존재함. 따라서 단어 순서를 고려할 수 있는 RNN으로 변경했고, 이후 RNN의 장기 의존성 문제(오래된 데이터일수록 영향력이 현저히 줄어든다)가 있어 대안으로 LSTM을 최종적으로 사용함. 시퀀스를 입력받아 시 본문 전체 데이터를 고려해 특성을 추출하고 감정을 분류.
 ◆ Tensorflow, Keras: 머신러닝 모델 학습에는 Tensorflow와 Tensorflow에 내장되어 있는 Keras 라이브러리를 활용하여 구현.

개념설계안

기술로드맵2.png
◇ 시 데이터를 전처리하고, 학습모델에 입력하여 시의 분위기를 자동으로 파악하도록 한다.
◇ Django와 SQLite로 개발한 클라우드 서버로 분위기가 파악된 시 데이터들이 저장되고 앱과 연동한다.
◇ 안드로이드 어플리케이션에서는 Rest API 통신 방식으로 데이터베이스에 접근하고 값을 받아온다.
◇ 사용자는 시를 짓고 저장할 수 있으며, 시 평가와 시 추천의 커뮤니티를 생성할 수 있게 한다.

이론적 계산 및 시뮬레이션

◇ 머신러닝을 이용해 태그 학습한 모델로 시 데이터에 태깅

- Customized KoNLPy 라이브러리를 이용한 토큰화
- Interger Encoding과 Word Embedding으로 시 데이터를 벡터화해 단어 특성 표현
- LSTM을 이용한 모델 구현 및 학습
- 정확도 평가 후 태깅 작업 및 태그 추천 기능에 이용

◇ 추천 알고리즘을 통한 추천

- 사용자의 감정을 분류
- 각 감정별 태그 선정 후 태그에 해당하는 시 추천

◇ 사용자의 피드백을 통해 모델 및 알고리즘 개선

- 일일 1회 만족도 조사를 통해 추천 가중치 조정

상세설계 내용

  • Server
기능 설명
Network.png
네트워크 구조
프로젝트 초기에 학습한 모델의 Evaluation에 시간이 많이 들 것이라 예상하였고, 보다 성능이 좋은 GPU 서버에 Evaluation 작업을 할당하여 작업시간을 줄이려 시도.
하지만 예상한 것보다 Evaluation에 드는 시간이 많지 않아 (API 서버에서 500자 시를 Evaluation할 시 1초 이내로 처리됨) 구조를 단순화하고 작업을 줄이기 위해 Evaluation 작업을 API서버에서 처리하고 GPU서버에서는 학습만 담당하는 구조로 변경.
이외에는 인증을 위해 카카오 API 서버와 E2 Micro VM을 연결.
Restful2.png
서버의 기능 제공을 위한 RESTful API 구현
REST는 Representational State Transfer의 약자로 엄격한 의미로의 REST는 자원을 정의하고 자원에 대한 주소를 지정하는 방법들의 모음.
웹 상의 자료를 HTTP 위에서 쿠키를 통한 세션 트랙킹같은 별도의 전송 계층 없이 전송하기 위한 간단한 인터페이스이므로 간단한 정보 전달을 하는 로봇 김삿갓 서버 구성에 적합. 로봇 김삿갓의 API를 REST로 부르기 위해서는 몇 가지 필수 제약조건을 지켜야 함.

- 인터페이스 일관성 (Uniform)
1. identification of resouces
2. manipulation of resources through representation
3. self-descriptive messages
4. hypermedia as the engine of appliacation state (HATEOAS)
- 무상태 (Stateless)
- 캐시 처리 가능 (Cacheable)
- 계층화 (Layered System)
- 클라이언트/서버 구조

로봇 김삿갓에는 Uniform Interface의 self-descriptive 조건과 HATEOAS 조건을 달성하지 않았으므로 엄밀한 의미로의 REST는 아니지만,
URI의 형태로 자원을 제공하는 Stateless 한 API로 간단한 의미로서의 REST를 구현했다 볼 수 있음.
Oauth2-2.png
서버 인증을 위한 카카오 소셜로그인과 토큰 기반 인증
OAuth는 사용자들이 웹 어플리케이션에게 비밀번호를 제공하지 않고
다른 기관이나 기업에 인증을 대리하게 하고,
인증 후에 그 권한만을 웹 어플리케이션에서 사용할 수 있게 하는 프로토콜.
카카오에서도 OAuth를 이용한 로그인 API를 제공하는데 이를 이용해 로봇 김삿갓의 로그인 과정을 구현하였고, 로봇 김삿갓 API의 이용을 위한 인증은 세션 기반이 아닌 토큰 기반 인증으로 구현. 아래는 로그인 과정의 흐름.

1. 먼저 클라이언트에서 카카오 API서버에 인증 요청을 보낸다.
2. 인증이 성공하였다면 카카오 API 서버에서 이 유저만을 위한 토큰을 발급해준다.
3. 클라이언트는 로봇 김삿갓 API 서버에 이 토큰을 보내 로그인 처리를 요청한다.
4. 로봇 김삿갓 API 서버는 클라이언트로부터 받은 토큰이 올바른 토큰인지 확인하기 위해 카카오 API 서버로 토큰 검증 요청을 보낸다.
5. 카카오 API 서버는 토큰의 검증 결과를 회신한다.
6. 클라이언트에게 받은 토큰이 올바른 토큰이었다면, 로봇 김삿갓의 API 이용을 위한 토큰을 클라이언트에게 발급해준다.
Https.png
보안을 위해 HTTPS 프로토콜 사용
안드로이드 버전 9.0(Pie)부터 SSL 보안이 적용되지 않은 서버와의 통신을 막아놓았기 때문에 로봇 김삿갓 앱(클라이언트)와 서버 통신을 위해, 서버에 HTTPS를 적용.



  • DB

Db.png

  • APP
기능 설명
Mvvm.png
MVVM 패턴
MVVM 패턴은 MVP모델의 변형으로 비즈니스 로직 처리와 프레젠테이션 로직 처리를 분리하여 의존성을 낮추고, 모델의 플랫폼에 종속되지 않도록 함.

1. Model: 앱 내부 DB나 서버에서 제공하는 데이터 등의 실질적인 데이터 계층을 참조하는 계층. 로봇 김삿갓 어플리케이션에서 API 서버에서 데이터를 받아오는 PoemServer 클래스만을 Model로 하였으나 어플리케이션의 로컬 데이터베이스도 같이 사용. 이를통해 서버로부터 한번 받아온 데이터를 로컬 데이터베이스에 저장해두어 서버에 데이터를 요청하는 횟수를 줄이고 서버에 접근할 때 마다 드는 지연시간을 없애 어플리케이션의 반응성을 높일 수 있음.

2. View: UI처리를 맡는 부분으로, 사용자의 상호작용에 따른 처리를 데이터 바인딩을 통해 ViewModel로 전달. 로봇 김삿갓의 댓글 기능을 예시로 보자면, 댓글 달기 버튼의 클릭 리스너에서 ViewModel의 콜백을 등록하여(DataBinding) 사용자의 상호작용(사용자가 버튼을 클릭했는지)를 ViewModel에게 전달하고, 이후 ViewModel이 Model로부터 데이터를 받아오면 등록된 콜백을 통해 View에 필요한 데이터를 전달함으로써 View와 ViewModel간의 연동을 구현했다.

3. ViewModel: Model과 View사이의 상호작용을 담당. View에서 Model의 데이터를 쉽게 이용할 수 있는 형태로 제공하는 것이 목적으로, Model의 데이터를 콜백의 형태로 View가 읽거나 쓸 수 있도록 설계.
  • APP UI 흐름도

App flow-2.png

  • APP 메뉴 구성
시스템 Level 1 Level 2 Level 3 Level 4
사용자용
프로그램
메뉴 추천 목록 좋아요
댓글 작성
좋아요 목록 좋아요
댓글 작성
내가 쓴 시 좋아요
댓글 작성
추천 된 시 좋아요
댓글 작성
시 작성 제목 작성
본문 작성
시 분위기 체크
저장하기
  • APP 화면 목록
화면 ID 화면 명 화면 설명
UI-S1-001 로그인 화면 로그인 화면
UI-S1-002 기분 물어보기 사용자의 기분이 어떤 상태인지 얻는다.
UI-S1-003 태그 물어보기 그 기분에 맞는 태그 중 어떤 태그를 볼 것인지 물어본다.
UI-S1-004 메인 화면 추천된 시 한편이 나오고 메뉴 버튼과 시 작성 버튼이 있다.
UI-S1-005 메뉴 화면 추천 목록 화면, 좋아요 목록 화면, 내가 쓴 시 화면으로 갈 수 있는 버튼들이 있다.
UI-S2-006 시 작성 화면 직접 시를 작성 할 수 있다.
UI-S1-007 추천 목록 화면 추천된 시의 목록을 확인할 수 있다.
UI-S1-008 좋아요 목록 화면 내가 좋아요를 누른 시들을 볼 수 있다.
UI-S1-009 내가 쓴 시 화면 내가 작성한 시 들을 볼 수 있다.
  • APP 화면 흐름도

App flow22.png

결과 및 평가

완료 작품의 소개

프로토타입 사진 혹은 작동 장면

Prototype1.PNG Prototype2.PNG Prototype3.PNG Prototype4-2.png

관련사업비 내역서

소속 학부과 컴퓨터과학부, 공간정보공학과 팀명 로봇 김삿갓
구분 예산금액 비고
민간경상보조
(활동비)
회의비 20,000 공학계열
공간대여료 20,000
개발관련서적구매 53,000
합계 93,000 원
재료비 Android Google Play, 개발자 등록비 29,000 * 4 공학계열
합계 116,000 원
총계 209,000 원

완료작품의 평가

  • 머신러닝
◇ 감정의 복합성과 주관성 문제: 감정은 명확한 기준이 되는 선을 통해 구분되지 않고 유기적으로 연결되어 있으며 같은 것을 보고 사람마다 느끼는 감정은 각자 다름.
◇ 동음이의어 문제: embedding을 통해 단어에 의미를 부여하는 과정에서 동음이의어의 여러 뜻은 문맥에 따라서 해석되지 않고 동일하게 한가지로 인식. 그래서 의도하지 않은 주제 사이의 연관성이 생기거나 다른 의미로 해석되는문제발생.
◇ 데이터셋에 대한 문제와 레이블링의 한계: 초기 시 데이터 수집과정에서 저작권 문제를 고려해 공유마당에서 크롤링, 고전 시의 비중이 높아 학습 시 편향성이 생기는 문제. 
◇ 최근 시인들의 시는 저작권 문제 때문에 이용이 어려워 각 주제의 특성을 잘 나타낼 수 있는 시 데이터가 부족했음.
◇ 시의 특성이 생각대로 도출되지 않아 비지도학습에서 지도학습으로 방식을 변경, 여기서 가장 큰 레이블링 문제.
◇ 우리가 원하는 감정이라는 레이블이 있는 시 데이터를 수집할 수 없어 결국 직접 레이블링을 1000개 정도 했지만 역부족. 좋지 않은 데이터셋 문제와 겹쳐 높은 정확도를 내지 못한 가장 큰 원인이라고 판단.
◇ 구한 시 데이터의 대부분이 고전 시인데 의미 파악하기가 어렸으며, 현대 시의 데이터를 구할 때는 저작권 사용에 어려움이 있었음.
◇ 머신러닝 모델을 학습시키기 위한 테스트셋을 만드는데 일일이 태그를 달아줘야 했음.
  • 안드로이드
◇ 기능이 많은 안드로이드 스튜디오를 처음 사용. 안드로이드용 xml 파일 구성이나 그를 제어하기 위한 java파일 구성과 kotlin파일 복합적인 사용에 어려운 부분이 있었음.
◇ 서버와 앱간의 통신을 위한 코드 구현을 위해서 다루어야하는 Rest API 사용법 학습이 어려웠음.
◇ Navigation System을 적용하는 것과 Fragment를 사용한 화면 전환이 어려웠음.
◇ Git 사용시, branch merge 시 충돌하는 문제가 종종 발생하여 개발을 통합할 때 어려웠음.
  • 데이터베이스
◇ 데이터베이스의 구조를 구성하면서 테이블 간의 연결성과 무결성을 구현하는 어려움.
  • GPU 서버
◇ 클라우드 환경에서 사용해야 하기에 터미널로만 이용해야 했음.
◇ 보안성 때문에 IP 사용 승인을 해야 했고, 서로 겹쳐져서 접속하지 않도록 스케줄링 필요.
◇ Linux 환경에 구성된 서버였기 때문에 Linux와 terminal 사용에 대한 이해가 필요했음.

향후계획

◇ 고전 시뿐만 아니라 현대 시 데이터를 추가하여 명확한 의미로 분류되도록 데이터 전처리를 원활하게 진행
◇ 시 분류의 정확도를 높이기 위한 나머지 라이브러리를 활용. 케라스, 파이토치, Theano등의 머신러닝 모델 추가하고 비교해여 더 좋은 모델로 개선함
◇ 안드로이드의 최신 API에서 제공하는 부가 기능들을 활용하여 애플리케이션의 디자인 개선
◇ 사용자의 질문을 세분화하여 점수산정을 정확하게 하고, 시를 추천해 주는 알고리즘 개선하여 사용자의 만족을 높이는 방식을 개선