본문 바로가기
DEV/Web 개발

Web 개발 :: Django rest framework, csv to json_TIL#43

by 올커 2022. 11. 3.

■ JITHub 개발일지 43일차

□  TIL(Today I Learned) ::

Django rest framework, 추천시스템, csv to json

 django restframework와 추천 시스템을 활용한 웹 서비스 구축

 - 추천 시스템을 활용한 웹 서비스를 구축하는 프로젝트를 시작했다.

 - 프로젝트 주제는 사용자가 원하는 음악을 선택받아 관련된 음악들을 추천해주는 웹 서비스를 구현하는 것이다.

 

 - 가장 먼저 해준 것은 가지고 있는 음악 csv 파일을 사용할 수 있는 json 파일로 변환해주는 것이다.

   (DB에 저장하여 사용할 수도 있지만, 테스트를 위해서 json 파일을 그대로 사용하는 것도 가능했다.)

 

 - csv 파일을 json 파일로 변환할 때에는 구글 검색 'csv to json'을 하고 갖고 있는 csv 파일 내용을 메모장을 활용하여 열어서 복사 후 convert해주면 json 파일을 복사해서 사용할 수 있게 된다.

 

 - 추천시스템 사용을 위해서는 아래 라이브러리를 사전에 설치해주어야 했다.

   (*pandas를 먼저 설치하면 numpy는 같이 설치된다.)

pip install numpy
pip install pandas
pip install sklearn

머신러닝을 위해서 만들어 놓은 json 파일을 불러왔다.

import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

import json

song_likes = pd.read_json('../melon_copy.json')

갖고 있는 테이블을 title과 genre_no를 각 행과 열로 지정하고, likes를 값으로 하여 피봇테이블을 만들었다.이 때, 빈 값(NA)은 fillna(0)을 사용하여 0으로 변경해주었다.(일부 프로젝트에 따라 fillna를 0으로 하면 전혀 다른 결과가 나오는 경우도 있다고 한다.)

song_title = song_likes.pivot_table('likes', index='title', columns="genre_no")
song_title = song_title.fillna(0)

print(song_title)

코사인 유사도를 활용한 추천 기능을 사용하기 위해 아래와 같이 입력했다. 그런데 결과값이 이상하게 0 또는 1값으로만 나오고 있다. 또 잘 보면 대칭행렬의 모습이었다. 

item_based_collab = cosine_similarity(song_title, song_title)
print(item_based_collab)


"""
[1394 rows x 31 columns]
[[1. 0. 1. ... 0. 0. 0.]
 [0. 1. 0. ... 0. 0. 0.]
 [1. 0. 1. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 1. 1. 0.]
 [0. 0. 0. ... 1. 1. 0.]
 [0. 0. 0. ... 0. 0. 1.]]
 """

 - 이후의 코드를 작성해보았지만, 결과는 여전히 잘못나오고 있다. 전체 값이 모두 그대로 나오고 있는 듯 하다.

   내일 다시 문제를 확인해봐야겠다.

item_based_collab = pd.DataFrame(item_based_collab, index=song_title.index, columns=song_title.index)
print(item_based_collab)

print(item_based_collab['희망사항'].sort_values(ascending=False)[:10])


"""
title
기억 속의 멜로디          1.0
내가 너를 느끼듯이         1.0
남자도... 어쩔 수 없다.    1.0
남자야                1.0
언제나 그 자리에          1.0
내 눈물 모아            1.0
내 눈물이 하는 말         1.0
어제보다 오늘 더          1.0
내 여자라니까            1.0
내가 날 버린 이유         1.0
Name: 희망사항, dtype: float64
"""

 - json 파일을 DB에 넣는 방법은 생각보다 간단하다. 먼저 옮겨야 할 json 파일을 읽어온다.

import json

with open('melon_copy.json', 'r', encoding='UTF-8') as f:
    song_list = json.load(f)

 - DB에 업로드하기 위해서는 올려줄 DB를 "model"이라는 key에 지정하고, 나머지 값들은 "fields"라는 key에 넣어 업로드해야 한다. 이를 위해 new_list라는 리스트를 만들어주고, 각 값들을 아래 코드를 통해 넣어준다.

new_list = []
for song in song_list:
    new_data = {"model":"recommend.song"}
    new_data["fields"] = song
    new_list.append(new_data)

 - 리스트가 완성이 되었으니 이제 다시 변경된 json 파일을 만들어주어야 한다. 아래 코드를 통해 json 파일을 만들어준다. 'w'는 파일이 있으면 수정하고, 없다면 생성해준다.

with open('song_data.json', 'w', encoding='UTF-8') as f:
    json.dump(new_list, f, ensure_ascii=False, indent=2)

 - 만들어진 파일을 loaddata 명령어를 사용하여 db에 적용한다. 

python manage.py loaddata song_data.json

(* 거꾸로 db에 있는 데이터를 json으로 받아올 경우에는 dumpdata 명령어를 사용한다.)

python manage.py dumpdata > xxx.json.

 

(* 특정 앱의 테이블만 받아올 경우)

python manage.py dumpdata appname > xxx.json

(* 특정 앱만 제외하고 테이블만 받아올 경우)

 

python manage.py dumpdata --exclude appname > xxx.json
반응형

댓글