오늘의 한 일
- 추천시스템 프로젝트 - 아이템 기반 협업 필터링 적용
추천시스템 프로젝트
- 아이템 기반 협업 필터링 적용
특강에서 배운 방식을 이용해서 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'),
..
]
굿굿