22.11.04(금) Today I Learned

정형빈·2022년 11월 13일
0

TIL

목록 보기
42/71

11/04 오늘의 시간표

09:00 ~ 10:00 [프로젝트] 장고 클론코딩 프로젝트2
10:00 ~ 11:00 [프로젝트] 장고 클론코딩 프로젝트2
11:00 ~ 12:00 [프로젝트] 장고 클론코딩 프로젝트2
12:00 ~ 13:00 [프로젝트] 장고 클론코딩 프로젝트2
13:00 ~ 14:00 점심식사
14:00 ~ 15:00 [프로젝트] 장고 클론코딩 프로젝트2
15:00 ~ 16:00 [프로젝트] 장고 클론코딩 프로젝트2
16:00 ~ 17:00 [프로젝트] 장고 클론코딩 프로젝트2
17:00 ~ 18:00 [프로젝트] 장고 클론코딩 프로젝트2
18:00 ~ 19:00 저녁식사
19:00 ~ 20:00 [프로젝트] 장고 클론코딩 프로젝트2
20:00 ~ 21:00 [프로젝트] 장고 클론코딩 프로젝트2

추천시스템 프로젝트

데이터 베이스 구축

어제 고민하다가 오늘로 넘긴 DB관련 문제를 해결해야 한다. 가장 확실한 방법은 DB의 규모를 줄이는 것인데 규모를 줄였다가 원하는 도서에 대한 정보가 DB에 없어서 못 나오는 경우가 생기면 아쉬울 것 같고 막무가내로 줄인다고해도 데이터셋에서 몇몇 항목이 비어있는 데이터가 있기 때문에 이런걸 검수할 방법이 필요했다. 나는 미련하게도 csv파일을 엑셀로 열어서 필터로 빈 항목이 있는 행을 통째로 날려버리고 DB에 올릴 때 사용하지 않는 불필요한 항목들(가격, 네이버 서지 존재여부 등)은 열 째로 없애버리고 csv파일을 내 입맛에 맞게 대폭 수정하였다. 그렇게 작업을하고 나중에서야 알게 되었는데 pandas에서 데이터값이 null인 데이터를 추려낼 수도 있고 필요없는 열과 행을 삭제할 수도 있었다. 이래서 역시 가지고 있는 사전 지식이 많거나 구글링으로 정보를 얻어내는 능력이 없으면 몸이 고생하는 것 같다.
그렇게 규모를 줄인 csv파일로 DB를 만들어 dumpdata를 통해 json형식의 파일로 만들어 팀원들에게 공유했다.

데이터 베이스 수정

이제 데이터베이스를 완성하고 팀원들에게 배포했으니 다음 기능을 구현해야했다. 다음으로 구현해야할 기능을 찾아보았다. 일단 우선적으로 프론트에서 우리가 만든 DB의 정보를 볼 수 있도록 해야하는데 이걸 구현하는건 팀원들이 맡아주시기로 하고 나는 이 기능이 구현되고나면 분류된 카테고리별로 도서를 나눌 수 있도록 데이터베이스에서 카테고리 필드를 만들어야 했다. 그런데 내가 구한 데이터셋의 컬럼정의서에는 카테고리 필드가 없었다. 대신 부가기호라는 5자리 숫자의 3번째 숫자값이 카테고리라는 정보를 인터넷을 통해 찾아냈다. 이를 이용해 부가기호의 3번째 값을 가져와 해당 숫자에따라 카테고리값을 구하는 함수를 만들어야 했다. 이부분은 카테고리를 담당하는 다솔님이 함수를 만들어주셨다.

# 카테고리 분류해주는 함수
def categories(n):
    if n == '0':
        c = '총류'
    elif n == '1':
        c = '철학, 심리학, 윤리학'
    elif n == '2':
        c = '종교'
    elif n == '3':
        c = '사회 과학'
    elif n == '4':
        c = '자연 과학'
    elif n == '5':
        c = '기술 과학'
    elif n == '6':
        c = '예술'
    elif n == '7':
        c = '언어'
    elif n == '8':
        c = '문학'
    elif n == '9':
        c = '역사, 지리, 관광'
    else:
        c = '기타'

    return c

#함수 정의하기 (row부분엔 해당 table의 row명을 적어준다.)
def insert_Book():
    with open(CSV_PATH,"rt",encoding='UTF8') as csv_file:
@@ -30,14 +57,19 @@ def insert_Book():
                img_url = book[9]
                description = book[10]
                isbn13 = book[1]
                category = book[7]


                n = str(category)[-3]
                category = categories(n)

                # 데이터 추출이 잘 되었는지 확인용
                # li = [title, author, publisher, pub_date, img_url, description, isbn13]
                # li = [title, author, publisher, pub_date, img_url, description, isbn13, category]
                # print(li)

                # 중복방지용 try/except 구문
                try:
                    Book.objects.create(title = title, author = author, publisher = publisher, pub_date = pub_date, img_url = img_url, description = description, isbn13 = isbn13)
                    Book.objects.create(title = title, author = author, publisher = publisher, pub_date = pub_date, img_url = img_url, description = description, isbn13 = isbn13, category=category)
                except:
                    continue

위의 함수로 카테고리를 분류하고 아래의 함수로 가져온 csv에서 필요한 데이터들만 추출해낸다. 여기서 카테고리는 부가기호의 뒤에서 세번째 값에 숫자에 따라 나뉘기 때문에 위와 같이 함수를 설계하였다.

추천시스템

프로젝트의 핵심인 책 추천 시스템을 어떻게 구현할지 찾아보았다. 이상호 튜터님이 특강 때 레퍼런스로 주신 협업필터링 ipynb파일을 활용하고 싶었지만 유저에 따른 평점 데이터셋이 하나도 없어서 새로 구하거나 직접 만들거나 둘 중 하나를 선택해야했다. 정확도의 문제도 있고 아직 도전해보지 않은 분야이기도 하기 때문에 검증된 데이터셋을 활용하기로 했다.
결국 지금까지 힘들게 쌓아온 DB가 아무 의미가 없어져 결국 kaggle에서 새로운 데이터셋을 가져와야 했다.

나머지는 주말간에 시간을 개인적으로 할애해서 데이터셋을 찾고 적용법을 찾아봐야겠다.

오늘 하루를 마치며

결국 이번주 내내 데이터셋 확보에 시간을 거의 다 사용했는데 이미 확보된 데이터셋이 다른 곳에서 사용되지 않아서 새로운 데이터셋을 구한다고 기존에 사용했던 시간과 결과물들이 무의미한 것이 되어버렸다. 앞으로는 프로젝트 기획 단계에서 어떤 데이터셋을 사용할지 확실하게 정해서 두번 세번 작업하는 일이 없도록 계획을 미리 확실하게 잡아둬야겠다.
덕분에 주말에도 할 일이 생겼는데 나 뿐만 아니라 다른 팀원들이 모두 주말간에 잔업을 해야하고 그만큼 노력을 하고 있으니 프로젝트의 결과가 잘 나왔으면 좋겠다.

profile
스파르타 내일배움캠프 3기 수강생 정형빈

0개의 댓글