춤추는 개발자

[SSAFY] 2차 프로젝트 - 영화 추천 서비스 본문

Developer's_til/프로젝트 요약

[SSAFY] 2차 프로젝트 - 영화 추천 서비스

Heon_9u 2021. 7. 30. 22:03
728x90
반응형
📢 SSAFY 정책상 해당 프로젝트의 Github 저장소는 private입니다.

 

💻 프로젝트 페이지와 구조

서비스 페이지

 

프로젝트 구조

🧑 맡았던 역할

  • 명세서별로 나누어 진행
  • 백엔드: Django
  • 프론트엔드: Vue.js
  • 알고리즘: Kmeans-clustering, KNN, 데이터 가공

💪 기여한 점

  • 유사한 데이터끼리 분류해주는 Kmeans-clustering으로 데이터 군집화(영화, 유저)
  • 신규 데이터를 기존에 형성된 군집으로 분류해주는 KNN 알고리즘 구현(신규 영화, 신규 유저 대상)
  • 위의 2가지 알고리즘으로 유사한 영화를 추천해주는 '추천 서비스' 완성
  • Python으로 100만 개의 평점 데이터를 가공하여 유저들의 취향 파악, '유저별 선호하는 장르 순위'라는 새로운 데이터 구축, 이를 기반으로 장르 기반의 '맞춤형 서비스' 완성
  • Django와 Vue.js를 활용하며 영화 상세페이지 제작

✅ 아쉬웠던 점

  • 실제 유저들을 대상으로 추천 서비스의 매칭률을 파악할 수 없었다.
  • 주어진 영화 데이터가 옛날 작품이라 접근성이 떨어졌다. 기능 개발에만 집중하다보니 신규 데이터를 가져올 여유가 없었다.
  • 클러스터링을 할 때 가장 적합한 군집 갯수를 찾지 못해서 임의로 3~7개의 군집 갯수를 정하였다.

🛠 개선해야할 사항

  • 추천 서비스의 평가와 테스트를 어떻게 할지 모색해볼 필요가 있다.
  • 네이버 영화나 영화진흥위원회의 Open API로 최신 영화 데이터 수집하기
  • 최적의 군집 개수를 결정하는데 대표적인 방법인 엘보우 기법과, 실루엣 기법 적용하기

💡 프로젝트를 진행하며 발생한 이슈

  1. 전체 영화 목록을 렌더링하는데 오랜 로딩 시간이 걸렸다.
  2. 추천 서비스 외에 유저별로 개인화된 서비스가 없었다. 즉, 맞춤형 서비스를 제작하는 방법을 모색

🔑 해결책

  1. 1) 한번에 많은 데이터를 화면에 띄우는게 문제라고 판단, 클라이언트에 pagination을 적용했지만 해결하지 못했다.
    2) 서버에서 클라이언트로 응답을 보낼 때, 한번에 많은 데이터가 전달되는게 문제라고 판단, '더보기'버튼을 만들어서 버튼을 누를 때마다 영화 목록을 12개씩 렌더링하였다. 서버에서 클라이언트로 영화 목록을 요청할 때마다 12개씩 응답하며 렌더링 시간을 줄였다.
  2. 명세서에 주어진 데이터 중 100만 개이상의 평점 데이터를 활용하기로 결심, 유저가 영화에 높은 평점을 남겼다면, 해당 영화의 장르를 선호한다는 가정을 세움
    영화명 장르
    movie1 Action, Sci-fi
    movie2 Drama, Sci-fi
    movie3 Action, Romance
     만약 A유저가 movie1에 평점 4.5, movie2에 평점 3, movie3에 평점 4를 남겼다면, 해당 영화가 가진 장르에 도 똑같이 평점을 남겼다고 판단했다.
    결과적으로 A유저가 남긴 장르별 평균 평점은 다음 표와 같다.
    장르명 평균 평점
    Action 4.25
    Adventure 4
    Sci-fi 3.75
    Drama 3
     그래서 A유저의 장르 선호도는 Aciton, Adventure, Sci-fi, Drama 순서가 된다. 이를 바탕으로 100만 개의 평점 데이터를 가공하여 '유저별 선호하는 장르 순위'라는 신규 데이터를 구축했고, 유저별 장르에 따른 영화를 추천해주는 맞춤형 서비스를 완성했다.

 

🙋‍♂️ 전체적인 느낀점

 처음 프로젝트와 다르게 명세서가 주어져서 순차적으로 개발할 수 있었다. 먼저, 팀원들과 메인 역할을 4가지로 백엔드, 프론트엔드, 디자인, 알고리즘 구현으로 나눴고, 여기에 명세서의 항목별로 다시 한번 역할을 디테일하게 나눴다.

 나는 알고리즘 구현을 메인으로 맡았고, 명세서 항목 중 [추천 시스템 개발][영화 상세페이지 제작]을 맡았다. 영화 상세페이지를 제작하면서 프론트엔드까지 직접 개발해보니, 클라이언트에 대해 이해할 수 있었다. 특히, 서버에서 최대한 데이터를 가공해서 전달해야 클라이언트가 편하게 데이터와 뷰를 매핑시킬 수 있음을 느꼈다.

 

 평소 어렵게만 느껴졌던 머신러닝 기법의 알고리즘을 구현하는 과정에서 성취감을 느꼈다. Python 라이브러리의 내부 메서드가 있지만, 직접 numpypandas를 활용해 알고리즘의 동작 과정을 이해하며 구현할 수 있었다.

 뿐만 아니라, 맞춤형 서비스를 구현하기 위해 최신 추천 서비스를 조사하고, 데이터의 특징점(장르)을 세웠다. 이 과정에서 데이터 활용의 무궁무진함을 느낄 수 있었고, 이를 계기로 Kaggle이란 사이트에서 '타이타닉호의 생존자 예측하기'라는 예제를 풀어보았다.

 기본적인 문제였지만, 데이터 컬럼 간의 상관관계를 찾아내고, 그 결과를 시각화하며 데이터가 미래 IT서비스를 개발/개선하는데 기반이 될 수 있음을 다시 한번 느낄 수 있었다.

 

 

 

728x90
반응형