Api 개발/flask

영화추천 모듈화 개발

공부짱짱열심히하기 2023. 1. 10. 09:58

같은경로안에 두가지 (실시간,주기적업데이트) 만들어놓고 때때로 클래스이름만 바꿔서 활용한다

 

class MovieRecommendRealTimeResource(Resource) :

    @jwt_required()
    def get(self) :

        user_id = get_jwt_identity()

        try :
            connection = get_connection()

 

select  m.title, r.user_id, r.rating
from movie m
left join rating r
on r.movie_id = m.id;

쿼리문으로 이동 ㄱㄱ

 

movie_correlations = pd.read_csv('data/movie_correlations.csv',index_col='title')

영화 추천 코드를 따로 csv로 뽑아낸게(batch) 아니라 실시간 작업

            df = pd.DataFrame(data=result_list)
            movie_correlations = df.pivot_table(index='user_id',columns= 'title', values='rating')

            df.corr(min_periods=50)

            movie_correlations = df.corr(min_periods=50)

 

둘의 결과가 같다

 

connection이 한번 연결되면 쿼리가 두세개가 연결되도 된다.

# 내 별점정보를 가져와야, 나의 맞춤형 추천 가능.

# 내 별점정보를 가져와야, 나의 맞춤형 추천 가능.
            query = ''' select m.title, r.rating
                        from rating r
                        join movie m
                        on r.movie_id = m.id
                        where user_id = %s; '''

            record = (user_id, )
            cursor = connection.cursor(dictionary=True)

            cursor.execute(query, record)

            result_list = cursor.fetchall()
            

            cursor.close()
            connection.close()

        except Error as e :
            print(e)            
            cursor.close()
            connection.close()
            return {"error" : str(e)}, 500

 

복사

        # 4. db로부터 가져온 내 별점정보를
        # 데이터프레임으로 만든다.
        my_rating = pd.DataFrame(data=result_list)

        #5. 내 별점 정보 기반으로, 추천영화 목록을 만든다.
        similar_movie_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=['correlations']
            similar_movie['Weight'] = my_rating['rating'][i] * similar_movie['correlations']
            similar_movie_list = similar_movie_list.append(similar_movie)


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

        recommend_movie_list = similar_movie_list.reset_index().groupby('title')['Weight'].max().sort_values(ascending=False).head(count)
        recommend_movie_list = recommend_movie_list[recommend_movie_list>0]

        print(recommend_movie_list)

        # 8. json으로 보내야댐
        recommend_movie_list = recommend_movie_list.to_frame()
        recommend_movie_list = recommend_movie_list.reset_index()
        recommend_movie_list = recommend_movie_list.to_dict('records')

        return {"result" : "success" ,
                "items" : recommend_movie_list , 
                "count" : len(recommend_movie_list)}, 200
        #쿼리 스트링으로 받는 데이터는 전부 문자열로 처리해버린다
        count = request.args.get('count')
        count = int(count)

또 복사

 

그후 app에 연결해주기

 

 

실시간이기때문에 상관계수 테이블이 바뀐다.

 

 

실시간 결과물이기때문에 시간이 더 오래걸린다