Art Cinema 프로젝트 개발일지3

LILY YOON·2020년 2월 19일
0

Art Cinema

목록 보기
3/5

메인 기능 알고리즘 구현

앞에 말했다시피 메인기능 알고리즘을 구현했다.
이상형월드컵 방식이 아닌 다른방식을 하기로 했는데,
팀원 중 한명이 좋은 아이디어를 냈다.

1.영화의 main_gerne = 2점, second_genre = 1점 으로 점수를 배정한다
2.장편영화 DB에 있는 영화들을 랜덤으로 두가지 선정하여 고객에게 보여준다.
3.랜덤으로 추출된 2개의 영화 중에서 고객이 선택한 영화의 '메인 장르'에 2점을 더하고 '2번째 장르'에는 1점을 더한다.
4. 20-30번의 반복을 통해서 고객이 선택한 장르의 점수를 총 합산하여 제일 높은 점수의 장르를 '선호 장르 첫번째'로, 2번째로 높은 점수의 장르에 '선호 장르 두번째'가 된다.

이를 바탕으로
random함수를 써서 무작위로 추출했다.

import random

# 두개랜덤뽑아서 출력
comparison_movie = random.sample(all_long_movie, 2)
comparison_movie_1 = comparison_movie[0]
comparison_movie_2 = comparison_movie[1]

그리고 나서 지훈이가 if와 elif 를 이용하여
일일히 장르들을 다 비교하는 코드를 써서 보여줬다.

나는 이것을 깔끔하게 하고싶어서 for문을 이용해서 하고 싶었다.
지훈이가 쓴 코드를 바탕으로

우선 main_genre 값들을 하나의 배열로 넣고 싶었다.

# all_main_genre 라는 변수에 main_genre DB값 담기
all_main_genre = list(db.Long_movie_1.find(['main_genre']))
# all_second_genre 라는 변수에 second_genre DB값 담기
all_second_genre = list(db.Long_movie_1.find(['second_genre']))

하지만 특정 key의 value들을 하나에 다 넣는 것이 어려웠다.

그리고 만약 이게 된다면,

if customer_choice == comparison_movie_1:
     # 비교군 1 영화의 메인장르 변수에 담기
     comparison_movie_1_main_genre = comparison_movie_1['main_genre']
     #메인장르 배열을 돌리고,
     for movie_genre in all_main_genre:
         #선택한 영화 메인 장르 값과 메인장르 배열의 값이 같으면
         if comparison_movie_1_main_genre == all_main_genre[movie_genre]:
             # 선택된 영화의 장르 값에 + 2 점(이거 코드가 맞는지 모르겠오)
             genre_score[movie_genre].update(genre_score=+2)
      #서브장르 배열을 돌리고,
      for movie_genre in all_second_genre:
          #선택한 영화 서브 장르 값과 서브장르 배열의 값이 같으면
          if comparison_movie_1_main_genre == all_second_genre[movie_genre]:
              #선택된 영화의 장르 값에 + 1 점(이거 코드가 맞는지 모르겠오)
              genre_score[movie_genre].update(genre_score=+1)

이렇게 for문을 통해 배열의 값들과 고객의 영화장르 값을 비교하면 코드가 간단해지지 않을까 라고 생각했다.

하지만 저 배열을 만드는 것이 힘들었다.

all_main_genre = list(db.Long_movie_1.find({'_id': 0, 'title' : 0, 'poster' : 0,
                         'director' : 0,'actor' : 0,'summary' : 0,
                         'main_genre' : 1,'second_genre': 0}))

이거는 왜 안되는 것일까...

아무튼 그래서, 점수를 저장하기 위해 했던 딕셔너리인

genre_score = {
    'drama_score': 0,
    'fantasy_score': 0,
    'fear_score': 0,
    'romance_score': 0,
    'adventure_score': 0,
    'thriller_score': 0,
    'noir_score': 0,
    'documentary_score': 0,
    'comedy_score': 0,
    'family_score': 0,
    'mystery_score': 0,
    'war_score': 0,
    'animation_score': 0,
    'crime_score': 0,
    'musical_score': 0,
    'SF_score': 0,
    'action_score': 0
}

를 통해 key값으로 for문을 구현했다.

customer_choice = comparison_movie_1

    # 고객 선택이 1번 영화면,
    if customer_choice == comparison_movie_1 :
        for key in genre_score:
            selected_main_genre = comparison_movie_1_main_genre.split('\n')[1]
            selected_second_genre = comparison_movie_1_second_genre.split('\n')[1]
            if selected_main_genre  == key:
                genre_score[key] = genre_score[key] + 2

            if selected_second_genre == key:
                genre_score[key] = genre_score[key] + 1

여기서는 key 값을 추출할 수 있었다.
그리고 _spilt()를 이용해서 데이터를 분할하는 것이 나는 아직 익숙하지가 않다. 요런 함수들을 많이 써보려고 노력해야겠다.

그리고 while문을 이용해서

        if comparison_movie_1['main_genre'] == comparison_movie_2['main_genre']:
            continue
        elif comparison_movie_1['main_genre'] != comparison_movie_2['main_genre']:
            break

첫번째영화와 두번째 영화의 장르가 같으면 다시 while문을 돌게 된다.
즉, 장르 점수를 합산하지 않고 다시 추출하는 것이다.
그리고 장르가 다르면, while문을 빠져나와서 장르 점수를 합산하게 된다.

이런 과정을 15번정도 반복하기 때문에

for i in range(15):

전체를 for문으로 돌려준다

그리고 마지막으로 합산한 genre_score 값들을 정렬을 통해
가장 점수가 높은 값의 장르와 두번째 높은 장르를 추출한다.

#결과 값 도출
result = sorted(genre_score.items(), key=lambda x: x[1], reverse=True)
print(result)
print("첫번째 선호하는 장르는", result[0])
print("두번째 선호하는 장르는", result[1])

좋은 공부가 됐던 알고리즘이었다.
역시 코딩은 많이 해봐야한다...
그리고 다시한번 팀으로 프로젝트를 진행하게 되어서 다행이면서도 너무 좋다.
팀으로 하면서 많이 배워가는 것 같다.
다른 팀원들도 그랬으면 좋겠다...!!!

0개의 댓글