김의중의 티스토리

2020-2학기 컴퓨터과학종합설계 본문

Project/졸업작품

2020-2학기 컴퓨터과학종합설계

부여오랑캐 2020. 12. 29. 10:14

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


개요

 

가. 개발 과제 요약

 

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

 

나. 개발 과제의 배경 및 효과

 

 ◇ 코로나 레드, 블루로 감정에 대한 위로가 필요함. 그래서 ‘시’로 위로를 하면 좋겠다고 판단하였음. 

 ◇ 많이 사용하는 스마트폰의 앱을 통해서 시를 제공하기로 결정.

 ◇ 개인에게 맞춤형 시 내용을 제공하기 위해 머신러닝을 활용.

 ◇ 한글 시들에 대한 머신러닝 분석, 시에 대한 관심 재고. 

 ◇ 사용자가 시를 직접 창작하고 이를 게시할 수 있도록 하여 참여형 커뮤니티를 형성.

 

다. 개발 과제의 목표와 내용

 

 ◇ 머신러닝으로 한글 시 분석하여 3가지 주제(날씨, 감정, 시간대)에 대한 태깅.

 ◇ 태깅된 시를 데이터베이스에 저장하고, 앱에서 시 데이터 호출.

 ◇ 초기 로그인 API 사용자 정보와 간단한 설문조사를 바탕으로 시 맞춤 추천.

 ◇ 어플리케이션 사용자가 시를 작성하여, 작성된 자작시를 DB에 저장. 해당 시를 다른 사용자에게 추천.

 

라. 기술적 기대효과

 

 ◇ 지도학습 뿐만 아니라 비지도학습, 강화학습을 통한 머신러닝 분석을 진행했을 때, 그 결과를 비교하여 한글 데이터 분석에 대한 정밀함을 예측하고 발전할 수 있음

 ◇ 추후 안드로이드 뿐만 아니라 iOS, Windows같은 다중 플랫폼에서 개발하여 다양한 플랫폼에서 더 많은 사용자가 어플리케이션을 이용하여 확장된 사용자 커뮤니티를 생성 할 수 있음

   

마. 경제적 및 사회적 파급효과

 

 ◇ 시를 읽으며 사용자들에게 감정적인 위로와 치료를 제공 할 수 있음

 ◇ 시인들이 활동할 수 있는 공간을 만들어주어 디지털시대에 좋은 경제적 환경을 마련해줌

 ◇ 사용자의 기분에 맞추어 시를 제공하는 머신러닝을 통해 인간감정에 대한 예측에 대한 정밀한 연구를 진행해볼 수 있음

 

기술 로드맵

 

◇ 시 데이터를 전처리하고, 학습모델에 입력하여 시의 분위기를 자동으로 파악하도록 한다.

◇ Django와 SQLite로 개발한 클라우드 서버로 분위기가 파악된 시 데이터들이 저장되고 앱과 연동한다.

◇ 안드로이드 어플리케이션에서는 Rest API 통신 방식으로 데이터베이스에 접근하고 값을 받아온다.

◇ 사용자는 시를 짓고 저장할 수 있으며, 시 평가와 시 추천의 커뮤니티를 생성할 수 있게 한다.

   

경쟁제품 조사 비교

 

시요일

시의온도

시절

문학동네시인선

밀리의 서재

특징

 

가장 기본적인 

시 추천
어플리케이션.

 

 

사용자가 위치한 곳에 따라서 날씨와 관련된 시를 추천하는 어플리케이션.

 

원하는 시를 
볼 수 있는
어플리케이션.

문학동네 소속 시인들의 시를 볼 수 있는 어플리케이션.

월정액
방식의 전자책 
어플리케이션.

장점

GUI가 깔끔.

위치 기반 추천.

원하는 시를 
볼 수 있음.

 

최신 현대시를 볼 수 있음.

 

커뮤니티 강점.

단점

추천 없음.

오로지 위치에 대한 추천.

옛날시가 많음.

 

추천 없음.

옛날시가 많음.

추천 없음.

유료 앱.

책에 대한 정보 위주.

유료 앱.

 SWOT 분석

 

기회

위협

강점

머신러닝 기반의 시 태깅작업으로 자동으로 시의 분위기를 파악.

코로나로 인해 감정적으로 위축된 사람들에게적절한 위로를 제공하는
감성적인 어플리케이션.

약점

시의 분위기를 주관적으로 느끼는
사람마다의 차이.

추천 알고리즘으로 추천되는 시가 적절하지 않을 가능성.

 

시 자체에 대한 무관심.
실제로 위로의 효과를 주는지에 대한 의문.


설계

 

사용자 요구사항 

 

 ◇ 안드로이드 스마트폰으로 어플리케이션을 실행한다.

 ◇ 카카오 계정을 연동하여 앱 로그인을 실행한다.

 ◇ 주어진 질문1, 질문2를 수행하여 자신의 감정 상태를 표기한다.

 ◇ 질문 결과 표출되는 시를 확인 할 수 있다. 

 ◇ 표출되는 시에 대하여 좋아요를 선택 할 수 있다.

 ◇ 표출되는 시에 대하여 댓글을 남기길 수 있다.

 ◇ 내가 직접 시를 작성할 수 있다.

 ◇ 드로우어를 열어 원하는 옵션을 선택 할 수 있다.

 ◇ 내가 추천 받았던 시 목록을 확인 할 수 있다.

 ◇ 내가 좋아요를 눌렀던 시 목록을 확인 할 수 있다.

 ◇ 내가 작성한 시 목록을 확인 할 수 있다.

 

사용자 요구사항 만족을 위한 기능 정의 및 기능별 정량목표

 

 ◇ 안드로이드 스튜디오 통합개발환경을 사용하여 개발을 진행한다. 이후 릴리즈를 통하여 APK를 작성한다.

 ◇ 카카오 SDK 서버를 통한 카카오 계정을 연동하여 앱 로그인을 구현한다. Oauto2.0과 토큰 기반의 인증을 사용한다.

 ◇ 주어진 질문1, 질문2를 수행한 결과를 API 서버로 전달하여, 사용자의 감정(Feeling)별의 점수를 산출하고 이에 맞는 시 분위기(Tag)를 가진 시를 나타내도록 한다.

 ◇ 질문 결과 표출되는 시는 데이터베이스의 시 데이터에서 가져오도록 한다. 데이터베이스는 OracleDB로 구현한다. 

 ◇ 표출되는 시에 대하여 ‘좋아요’는 ImageButton으로 구현하고 API, DB 서버에 반응하도록 한다.

 ◇ 표출되는 시에 대하여 ‘댓글’을 구현하고 API, DB 서버에 반응하도록 한다.

 ◇ 내가 직접 시를 작성하는 레이어는 프래그먼트가 아닌 별도의 액티비티에서 작성하도록 한다.

 ◇ 드로우어를 열어 원하는 옵션을 선택 하기 위해 안드로이드 Navigation Drawer를 활용한 메뉴를 구현하도록 한다.

 ◇ ‘내가 추천 받았던 시 목록’을 확인 할 수 있도록 Fragment 상에서 표출되도록 구현한다.

 ◇ ‘내가 좋아요를 눌렀던 시 목록’을 확인 할 수 있도록 Fragment 상에서 표출되도록 구현한다.

 ◇ ‘내가 작성한 시 목록’을 확인 할 수 있도록 Fragment 상에서 표출되도록 구현한다.

 

기능 구현을 위한 세부기술 선택사항 (디자인)

 

 ◇ APP: Android Studio IDE / 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 라이브러리를 활용하여 구현.

 

◇ Server 설계


네트워크 구조

 

프로젝트 초기에 학습한 모델의 Evaluation에 시간이 많이 들 것이라 예상하였고, 보다 성능이 좋은 GPU 서버에 Evaluation 작업을 할당하여 작업시간을 줄이려 시도. 

 

하지만 예상한 것보다 Evaluation에 드는 시간이 많지 않아 (API 서버에서 500자 시를 Evaluation할 시 1초 이내로 처리됨) 구조를 단순화하고 작업을 줄이기 위해 Evaluation 작업을 API서버에서 처리하고 GPU서버에서는 학습만 담당하는 구조로 변경. 

 

이외에는 인증을 위해 카카오 API 서버와 E2 Micro VM을 연결.

 

 

 

서버의 기능 제공을 위한 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를 구현했다 볼 수 있음.

 

 

 

 

서버의 인증을 위한 

카카오 소셜로그인과 토큰 기반 인증

 

OAuth는 사용자들이 웹 어플리케이션에게 비밀번호를 제공하지 않고 다른 기관이나 기업에에 인증을 대리하게 하고, 인증 후에 그 권한만을 웹 어플리케이션에서 사용할 수 있게 하는 프로토콜. 

 

카카오에서도 OAuth를 이용한 로그인 API를 제공하는데 이를 이용해 로봇 김삿갓의 로그인 과정을 구현하였고, 로봇 김삿갓 API의 이용을 위한 인증은 세션 기반이 아닌 토큰 기반 인증으로 구현. 

 

아래는 로그인 과정의 흐름.

 

1. 먼저 클라이언트에서 카카오 API서버에 인증 요청을 보낸다.

2. 인증이 성공하였다면 카카오 API 서버에서 이 유저만을 위한 토큰을 발급해준다.

3. 클라이언트는 로봇 김삿갓 API 서버에 이 토큰을 보내 로그인 처리를 요청한다.

4. 로봇 김삿갓 API 서버는 클라이언트로부터 받은 토큰이 올바른 토큰인지 확인하기 위해 카카오 API 서버로 토큰 검증 요청을 보낸다.

5. 카카오 API 서버는 토큰의 검증 결과를 회신한다.

6. 클라이언트에게 받은 토큰이 올바른 토큰이었다면, 로봇 김삿갓의 API 이용을 위한 토큰을 클라이언트에게 발급해준다. 

 

 

 

 


보안을 위해 HTTPS 프로토콜 사용

 

안드로이드 버전 9.0(Pie)부터 SSL 보안이 적용되지 않은 서버와의 통신을 막아놓았기 때문에 로봇 김삿갓 앱(클라이언트)와 서버 통신을 위해, 서버에 HTTPS를 적용.

 ◇ DB 설계

◇ APP 설계

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가 읽거나 쓸 수 있도록 설계.

 

 

 


결과물

play.google.com/store/apps/details?id=com.RKS.robot_kimsatgat_android

 

로봇 김삿갓 - Google Play 앱

머신러닝을 활용한 시 추천 어플리케이션

play.google.com

capstone.uos.ac.kr/cdc/index.php/로봇김삿갓

 

로봇김삿갓 - cdc wiki

프로젝트 개요 기술개발 과제 국문 : 머신러닝을 활용한 시 추천 어플리케이션 개발 영문 : Development of poem recommendation application using machine learning. 과제 팀명 로봇 김삿갓(Robot KimSatGat) 지도교수

capstone.uos.ac.kr

 

'Project > 졸업작품' 카테고리의 다른 글

중간발표까지 할일들  (0) 2020.04.13
착수발표 질문 리스트  (0) 2020.04.12
0313 회의  (0) 2020.03.13
0306 회의  (0) 2020.03.09
0224 회의  (0) 2020.02.24
Comments