하루의 마침표. 는 일기 텍스트에서 추출된 감정에 기반해 컨텐츠를 추천하는 서비스입니다.
멜론, 네이버 영화, 교보문고 등 사용자에게 컨텐츠를 추천하는 서비스는 다양하게 보급되어 있습니다. 그러나 이들 서비스의 공통점은 현재 인기가 많거나, 사용자가 이용했던 컨텐츠와 비슷한 컨텐츠를 추천해줍니다.
인기순으로 나열된 컨텐츠 추천 말고, 감정 기반 컨텐츠 추천은 어떨까요?
본 프로젝트의 메인 아이디어는 사용자의 감정에 기반한 컨텐츠 추천입니다! 사용자의 감정을 텍스트로 입력받아 감정을 분석하고, 사용자의 감정을 세 가지로 분류해 알려드립니다. 기본적으로 사용자의 감정과 동일하게 분류된 컨텐츠를 추천해드리지만, 분류된 감정이 사용자의 감정과 맞지 않거나 사용자가 다른 감정을 원하는 경우 다른 감정을 선택할 수 있습니다. 컨텐츠는 사용자가 선택한 최종 3가지의 감정에 기반해 추천됩니다.
사용자가 오늘 하루를 마무리 하는 일기를 쓰게되면, 일기에 맞는 감정 3가지를 추천해 드립니다.
이때 원하는 감정이 없다면, 목록에서 직접 감정을 선택할 수 있습니다.
그리고 선택 된 감정 기반으로 다양한 컨텐츠들이 추천됩니다.
마지막으로 원하는 컨텐츠가 추천되었다면 컨텐츠를 저장할 수 있습니다.
자세한 내용은 발표 pdf를 참고해주시면 됩니다.
다음 링크를 통하여 poetry를 설치합니다.
https://python-poetry.org/docs
그 이후 다음 커맨드를 입력합니다.
poetry install
-
frontend 모니터링을 위해 새로운 터미널을 실행한 후 다음 커맨드를 차례로 입력합니다.
source virtualenv.sh
cd app/frontend
sreamlit run main_page.py
서버환경에서 실행하는 경우
--server.port {port number}
argument를 추가해주세요. main_page.py 파일명은 추후 수정 예정입니다.로컬환경 실행시 Network URL 주소를, 서버환경에서 실행 시 External URL 주소를 클릭하시면 됩니다.
- 가상환경 활성화를 위해 다음 커맨드를 입력합니다.
source virtualenv.sh
- fastapi server를 구동시키기 위해 다음 커맨드를 입력합니다.
python -m app
* `MongoDB` Cloud j서버
* `Cloud(GCP`) 또는 `local` 에 서치할 수 있습니다.
- MongoDB Docker 실행
# MongoDB image 다운로드
$ docker pull mongo
# MongoDB image 확인
$ docker images
# MongoDB Container 구동
$ docker run --name mongodb-container -v ~/data_db:/data/db -d -p 27017:27017 mongo
- MongoDB Data 적재
$ python mongo_db_setup.py --url {$GCP IP} --port {port number}
크롤러를 사용하기 전, 사용환경에 맞게 Chrome Driver 경로를 변경해주세요.
# 2022.06 top 100
python crawler.py
# 2011 - 2021 top 50
python crawler_year.py
Lyrics_top100.csv, Lyrics_top50_2011.csv, Lyrics_top50_2012.csv, ..., Lyrics_top50_2021.csv
ELECTRA(Efficiently Learning an Encoder that Classifies Token Replacements Accurately)를 한국어 댓글을 이용하여 학습한 모델이며, 신조어, 오탈자 등 구어체의 특징을 가진 데이터셋으로 훈련되었습니다.
위 표를 보게되시면, 일반적인 데이터셋에서는 KoELECTRA의 성능이 앞서지만, 구어체가 많은 NSMC에서는 댓글로 학습한 KcELECTRA의 성능이 더 좋았다는 것을 알 수 있습니다.
Reference : https://github.com/Beomi/KcELECTRA
'음악', '책', '영화', '공연' 총 네가지 도메인에 대해 Selenium
을 활용한 web crawling으로 데이터 수집했습니다.
감정을 분석하는 데에 소개글이 필수이므로 크롤링을 진행하며 소개글이 없거나 소개글을 구할 수 없는 데이터는 제외했습니다.
데이터는 data
디렉토리 내 각 도메인 별 디렉토리에 .csv
로 저장되어 있습니다.
예를 들어 영화 데이터셋은 ./data/movies/movie_dataset_image.csv
파일을 이용해 불러올 수 있습니다. ('image'가 포함된 데이터셋을 사용해야 합니다.)
도메인 별 수집 과정은 다음과 같습니다.
음악은 2022년 6월 기준 멜론 Top100과 2011 ~ 2021년 동안의 Top50 데이터로 이루어져있습니다.
수집된 정보는 '제목', '가수', '가사', 'URL', '이미지' 이렇게 다섯가지로 총 600개의 데이터를 확보했습니다.
책 데이터는 yes24 소설/시 카테고리 중 '강력추천' 도서 목록((http://www.yes24.com/24/Category/More/001001046?ElemNo=95&ElemSeq=1))을 크롤링했으며 수집된 정보는 '도서명', '저자', '소개글', 'URL', '이미지 경로' 총 다섯가지입니다.
중복을 제거해 총 238개의 데이터를 확보했습니다.
경
영화 데이터는 다음의 경로를 통해 수집되었으며 수집된 정보는 '영화 제목', '소개글', 'URL', '이미지 경로' 총 네가지입니다.
중복을 제거하여 총 284개의 데이터를 확보했습니다.
공연 데이터는 네이버 공연 목록에서 '클래식', '뮤지컬', '연극' 등을 포함한 모든 장르를 크롤링했습니다.
상영중/상영예정인 작품을 모두 포함하고 있으며 '공연 제목', '공연 장르', '소개글', 'URL', '이미지 경로' 총 다섯가지 정보를 가지고 있습니다.
중복을 제거하여 총 300개의 데이터를 확보했습니다.
프로덕트 서빙 개요는 다음과 같습니다.
빠르고 간결하게 웹 서비스의 프론트를 만들기 위해 Streamlit을 메인으로 활용했고 HTML, CSS를 추가로 사용했습니다.
또한 비동기 요청 처리, 빠른 속도, 그리고 api testing의 용이성을 이유로 FastAPI를 사용하여 백엔드를 구성했습니다.
프론트엔드는 기본적으로 Streamlit을 통해 구현되며 streamlit.markdown
을 통해 HTML, CSS 문법을 적용하였습니다.
프론트엔드의 모듈은 다음과 같습니다.
- 일기 텍스트 입력 모듈
- 감정 분류 및 감정 선택 모듈
- 선택된 감정 기반 콘텐츠 추천 모듈
- 완성된 피드(일기+콘텐츠) 저장 모듈
백엔드는 FastAPI를 활용하여 구성했습니다. 'Diary', 'Contentes', 'History', '기타'로 구성됩니다.
- GCP Cloud를 사용하여 Local Server와 분리했습니다.
- MongoDB를 사용했습니다.