왕현성
코딩발자취
왕현성
전체 방문자
오늘
어제
  • 코딩 (277)
    • Python (71)
    • Java (16)
    • MySQL (34)
    • 인공지능 (48)
      • 머신러닝 (16)
      • 딥러닝 (32)
    • 영상처리 (4)
    • Rest API (21)
    • Android Studio (25)
    • streamlit (13)
    • DevOps (22)
      • AWS (9)
      • PuTTY (5)
      • Git (4)
      • Serverless (2)
      • Docker (2)
    • IT 기술 용어 (6)
    • 디버깅 ( 오류 해결 과정 ) (17)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • tune()
  • OpenCV
  • 영상처리
  • alibidetect
  • get_long_description
  • 컴퓨터비전
  • ckpt_file
  • ComputerVision
  • maskimage
  • 딥러닝
  • 비지도학습
  • labelme
  • labelme UnocodeDecodeError
  • imageprocessing
  • UnboundLocalError
  • pip install labelme
  • unsupervised
  • pytorch
  • alibi-detection
  • 기상탐사
  • encoding='utf-8'
  • PYTHON
  • numpy
  • yolov8
  • PIL
  • 영상기술
  • TensorFlow
  • matplotlib
  • 의료이미징
  • 영상처리역사

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
왕현성

코딩발자취

API 서버 - 구글 코랩으로 추천기능 개발 이후 영화 추천하는 API 개발 ( 배포 )
Rest API

API 서버 - 구글 코랩으로 추천기능 개발 이후 영화 추천하는 API 개발 ( 배포 )

2023. 1. 9. 17:56
728x90
  • 해당 기능만을 서술한 포스팅으로, 전체 기능에 대한 소스 코드 확인은 깃 허브에서 확인 가능합니다.
    https://github.com/hyunsungKR/movie_api_server
 

GitHub - hyunsungKR/movie_api_server

Contribute to hyunsungKR/movie_api_server development by creating an account on GitHub.

github.com

각 코드에 설명은 주석처리 되어있다.

from flask import request
from flask_restful import Resource

from mysql_connection import get_connection
from mysql.connector import Error
from flask_jwt_extended import jwt_required
from flask_jwt_extended import get_jwt_identity
import pandas as pd

class MovieRecommendResource(Resource) :
    @jwt_required()
    
    def get(self) :
        # 1. 클라이언트로부터 데이터를 받아온다.
        user_id=get_jwt_identity()
        # 쿼리 스트링으로 받는 데이터는
        # 전부 문자열로 처리된다!!!!!
        number=int(request.args.get('number'))

        # 2. 추천을 위한 상관계수 데이터프레임을 읽어온다.
        movie_correlations=pd.read_csv('data/movie_correlations.csv',index_col='title')

        # 3. 이 유저의 별점 정보를 가져온다. = > 디비에서 가져온다.
        try :
            connection = get_connection()

            query = '''select m.title,r.rating
                    from rating r
                    left join movie m
                    on m.id = r.movie_id
                    where r.user_id = %s;'''
            record = (user_id,)

            cursor = connection.cursor(dictionary=True)
            cursor.execute(query,record)
            result_list = cursor.fetchall()

            print(result_list)

            cursor.close()
            connection.close()

        except Error as e :
            print(e)
            cursor.close()
            connection.close()
            return{"result":"fail","error":str(e)}, 500
        
        # 4. DB로부터 가져온 내 별점 정보를 
        #    데이터 프레임으로 만들어준다.
        my_rating=pd.DataFrame(data=result_list)
        
        
        # 5. 내 별점 정보 기반으로 추천영화 목록을 만든다.
        similar_movies_list = pd.DataFrame()
        for i in range(my_rating.shape[0]):
            movie_title=my_rating['title'][i]
            similar_movie=movie_correlations[movie_title].dropna().sort_values(ascending=False).to_frame()
            similar_movie.columns = ['Correlation']
            similar_movie['weight']=my_rating['rating'][i] * similar_movie['Correlation']
            similar_movies_list=similar_movies_list.append(similar_movie)

        # 6. 내가 본 영화 제거
        drop_index_list=my_rating['title'].to_list()
        for name in drop_index_list :
            if name in similar_movies_list.index :
                similar_movies_list.drop(name,axis=0,inplace=True)
        
        # 7. 중복 추천된 영화는 weight값이 가장 큰 값으로만
        #    중복 제거한다.

        recomm_movie_list=similar_movies_list.groupby('title')['weight'].max().sort_values(ascending=False).head(number)

        


    

        # 8. JSON으로 클라이언트에 보내야한다.
        recomm_movie_list=recomm_movie_list.to_frame()
        recomm_movie_list=recomm_movie_list.reset_index()
        recomm_movie_list=recomm_movie_list.to_dict('records')

        
        
        return {'result':'success','itmes':recomm_movie_list,'count':len(recomm_movie_list)},200

 

포스트맨 테스트 결과

'Rest API' 카테고리의 다른 글

API 서버 - 로그인한 회원과 비회원 구분하여 시스템 개발하기 // jwt_required(optional= )  (0) 2023.01.10
API서버 - 실시간 추천 기능 구현  (0) 2023.01.10
API 서버 - query string 페이징 처리  (0) 2023.01.06
API서버 - 로그아웃 기능 구현하기 (jwt 토큰 파괴)  (0) 2023.01.05
API - Flask_JWT 라이브러리 설치법과 사용법  (0) 2023.01.05
    'Rest API' 카테고리의 다른 글
    • API 서버 - 로그인한 회원과 비회원 구분하여 시스템 개발하기 // jwt_required(optional= )
    • API서버 - 실시간 추천 기능 구현
    • API 서버 - query string 페이징 처리
    • API서버 - 로그아웃 기능 구현하기 (jwt 토큰 파괴)
    왕현성
    왕현성
    AI 머신비전 학습일지

    티스토리툴바