Skip to content

AIHub-Cinemaster/movie-recommendation-python-deploy

Repository files navigation

영화 추천 커뮤니티 웹 사이트 - 추천 시스템

📬 API

1. 추천 영화 조회

유저별 추천 영화 목록 조회

추천 알고리즘을 이용한 유저별 맞춤 영화 목록을 조회합니다.


  • URL

    /recommendation/:shortId

  • Method

    GET

  • URL Params

    Required:

    shortId=[String]

  • Data Params

    None

  • Success Response

    • Code: 200

    • Content:

      {
        "recommendList": [
          { 
            "movieId": 9909,
            "star": 4.7
          },
          { 
            "movieId": 11360,
            "star": 4.3
          },
          { 
            "movieId": 819,
            "star": 4.1
          }
        ]
      }
  • Error Response

    • Code: 404 NOT FOUND

    • Content:

       {
         "fail": "추천 영화 목록 조회에 실패했습니다." 
       }

2. 추천 영화 평가

평가할 영화 조회

평가할 영화 정보를 랜덤으로 조회합니다.


  • URL

    /eval/:movieCount

  • Method

    GET

  • URL Params

    Required:

    movieCount=[Integer]

  • Data Params

    None

  • Success Response

    • Code: 200

    • Content:

      {
        "movieNum": 3,
        "result": [
          { 
            "movieId": 5418
          },
          { 
            "movieId": 1307 
          },
          { 
            "movieId": 1221
          }
        ]
      }
  • Error Response

    • Code: 404 NOT FOUND

    • Content:

       {
         "fail": "평가 영화 정보 조회에 실패했습니다." 
       }

평가한 영화 등록

평가한 영화 정보를 등록합니다.


  • URL

    /eval

  • Method

    POST

  • URL Params

    None

  • Data Params

    Required:

    shortId=[String]

    movieId=[Integer]

    star=[Double]

  • Success Response

    • Code: 200

    • Content:

      {
        "shortId": "123abc",
        "result": [
          { 
            "movieId": 37550,
            "star": 2
          },
          { 
            "movieId": 862,
            "star": 3.5
          },
          { 
            "movieId": 3525,
            "star": 0.5
          }
        ]
      }
  • Error Response

    • Code: 401 UNAUTHORIZED

    • Content:

       {
         "fail": "유저 정보를 찾을 수 없습니다." 
       }

✨ 추천 시스템

  • MovieLens Datasets

    270,000명의 사용자가 45,000개의 영화에 남긴 26,000,000개의 평가와 750,000개의 태그로 구성

    행렬 분해를 손쉽게 하기 위해 유저 - 아이템 평점 데이터를 유저, 영화, 평점 컬럼별로 정리하였으며, TMDB API 서비스를 사용하기 쉽게 모든 영화 데이터를 TMDB 영화 ID에 맞게 변환하였습니다.


2. 모델 구현

7

추천 알고리즘은 크게 두 가지로 볼 수 있습니다.

콘텐츠 기반 필터링(Content Based Filtering)과 협업 필터링(Collaborative Filtering)입니다.

콘텐츠 기반 필터링은 특정 컨텐츠를 기준으로 비슷한 컨텐츠를 추천해줍니다.

예를 들어, 유저가 특정 영화를 좋아한다면 그것과 비슷한 영화를 추천해주는 방식입니다.

이 방식은 몇 가지 단점이 존재하는데, 유저가 좋아하는 특정 영화와 유사한 영화만 추천해줄 수 있습니다.

즉, 유저의 취향을 고려하지 않은, 영화 장르 전반에 걸친 추천이 아닌 획일화된 추천을 할 우려가 있습니다.

따라서, 우리 팀은 유저의 취향을 고려하여 추천해줄 수 있는 협업 필터링 방식을 사용하기로 했으며 그 중 잠재 요인 협업 필터링을 채택했습니다.

협업 필터링 방식은 다른 유저의 데이터를 기반으로 추천을 해주는 방식입니다.

8 출처

협업 필터링 방식은 최근접 이웃과 잠재요인으로 나뉘는데, 최근접 이웃 방식은 유저를 기준으로 유저간 선호도를 바탕으로 추천해주는 방식과 아이템을 기준으로 아이템간의 연관성을 측정하여 추천해주는 방식이 있습니다.

9 출처

잠재요인 방식은 유저아이템에 대한 평점 행렬에 숨겨져 있는 잠재적 요인을 추출하여 추천해주는 방식입니다.

우리는 유저아이템 평점이라는 대규모 다차원 행렬을 SVD라는 차원 축소 기법으로 행렬 분해하여 잠재 요인을 추출했습니다.

10 출처

잠재 요인 방법은 하나의 최적화 문제라고 볼 수도 있습니다.

유저에 대해서 특정 아이템에 대한 평점을 얼마나 잘 예측하는지를 봐야하기 때문입니다.

이 때문에, RMSE(Root Mean Square Error)를 통해 정확도를 측정하였습니다.

RMSE가 낮을수록 좋은 성능을 보여주는데, 위 수식에서 $\hat{X}$에 대한 RMSE를 낮추는 것이 핵심입니다.

$\hat{X}$는 Utility Matrix, ${U}$는 Left Singular Matrix로 유저와 잠재 요인간의 관계를 나타내고, ${S}$는 Diagonal Matrix로 각 잠재 요인의 중요도를 나타내고, $V^T$는 Right Singular Matrix로 아이템과 잠재 행렬 간의 유사도를 나타냅니다.

이러한 행렬 분해로 추출되는 잠재 요인은 영화가 가지는 장르별 특성 선호드 등이 될 수 있습니다.

SVD는 Utility Matrix에서 잠재 요인을 추출하면서 행렬의 차원을 축소시키고, 유저아이템 각각을 ${r}$차원을 가진 잠재 공간으로 옮깁니다.

이렇게 유저아이템을 직접적으로 비교하여 둘의 관계를 예측합니다.

About

영화 추천 시스템을 위한 fast api 서버 입니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published