코딩일지/TIL: Today I Learned

20221104 TIL

야언 2022. 11. 4. 20:07

오늘의 한 일

  • 추천시스템 프로젝트 - 아이템 기반 협업 필터링 적용

 

추천시스템 프로젝트

 

  • 아이템 기반 협업 필터링 적용

 

특강에서 배운 방식을 이용해서 webtoon_csv파일과 ratings.csv(더미) 파일을 묶어 아이템 기반 협업 필터링을 돌려

특정 웹툰을 지정했을 시에 가장 가까운 모델을 10개정도 타이틀명으로 뽑아낼 수 있었다.

뽑아낸 타이틀명을 반복문을 통해

Webtoon(모델).object.get(title=타이틀명) 을 이용하여 모델로 바꾸고,

이를 빈 리스트에 append시켜 추천웹툰_list로 만들고

시리얼라이저를 거쳐 데이터화시킬 수 있었다.

 

뭔가 할땐 단순했는데 글로 설명하려니까 겁나게 복잡해지는 느낌;

 

 

 

 

 

 

트러블 슈팅

 

  • collaborative_filtering.py 관련

collaborative_filtering.py

import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# from webtoon.models import Webtoon

ratings = pd.read_csv('webtoon/ratings.csv')
webtoons = pd.read_csv('webtoon/naver_webtoon.csv')

# 데이터프레임을 출력했을때 더 많은 열이 보이도록 함
pd.set_option('display.max_columns', 10)
pd.set_option('display.width', 300)
# id를 기준으로 ratings 와 movies 를 결합함
webtoon_ratings = pd.merge(ratings, webtoons, on='id')

user_title = webtoon_ratings.pivot_table('rating', index='title', columns='userId')

user_title = user_title.fillna(0)

item_based_collab = cosine_similarity(user_title, user_title)

item_based_collab = pd.DataFrame(item_based_collab, index=user_title.index, columns=user_title.index)

# webtoon_list = item_based_collab['뷰티풀 군바리'].sort_values(ascending=False)[1:21]  # 연습용

# 연습용 1
# for i in webtoon_list.index:
#     print(i)

# 연습용 2
# for i in webtoon_list:
#     asd = Webtoon.objects.get(title=i)
#     print(asd)
    
    


def item_based_filtering(webtoon):
    webtoon_list = item_based_collab[webtoon].sort_values(ascending=False)[1:21]
    return webtoon_list.index

연습용으로 주석처리한 부분

이 py파일 안에서 Webtoon 모델을 가져와 테스트를 해보고싶은데 임포트를 해도 webtoon 모델이 임포트가 안된다는 오류가 뜬다..

도대체 왜?

이유를 구글링을 통해 찾아봐도 지금 상황에 어울리는 설명이 보이질 않아 헤딩을 좀 오래했다..

그런데 막상 코드상 오류는 아무리 봐도 없는것 같아서 그냥 실제 views.py 안에서 postman을 통해 실험해보면 될것같단 생각이 들었다..

결국 제대로 webtoon_id로 Webtoon 모델을 가져와서 타이틀명만 꺼내서 사용해 필터링이 돌아가는지,

필터링을 통해 만들어진 10개의 웹툰(타이틀명)으로 웹툰 리스트를 형성해 시리얼라이저를 거쳐서 데이터형태로 전송할 수 있을지 실제 views.py 안으로 끌고와서 실험해 보았다.

 

 

 

webtoon - views.py

from webtoon.collaborative_filtering import item_based_filtering

# 아이템 협업 필터링 리스트 연습중
class PracticeView(APIView):
    def get(self, request, webtoon_id):
        webtoons = []
        a = get_object_or_404(Webtoon, id=webtoon_id)
        b = item_based_filtering(a.title)
        for i in b:
            c = get_object_or_404(Webtoon, title=i)
            webtoons.append(c)
        print(webtoons)
        serializer = WebtoonSerializer(webtoons, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

webtoon- urls.py

urlpatterns = [
	..
    path('<int:webtoon_id>/practice/', views.PracticeView.as_view(), name='Webtoon_practice_view'),
	..
]

 

 

 

 

 

확인용으로 넣어둔 print(webtoons)도 잘 먹힘

 

굿굿