From b7eeb0bd95ce780d95e7590bb699f53905b88c47 Mon Sep 17 00:00:00 2001 From: pythagoraswitch Date: Fri, 3 Aug 2018 00:06:49 +0200 Subject: [PATCH] modified for new user data schema and one clip playlist cases --- recommendation_engine.py | 91 +++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 48 deletions(-) diff --git a/recommendation_engine.py b/recommendation_engine.py index 03c6919..ab0f3cc 100644 --- a/recommendation_engine.py +++ b/recommendation_engine.py @@ -96,21 +96,21 @@ class Engine: # Make sure sanity check exists in front-end (error if it does not add up to 16). video_num = nc + np + ns - for event in user.get('events', []): - if event.get('event') == "grid" and event.get('data').get('index') not in grid_events: - grid_events[event.get('data').get('index')] = event.get('data') - if len(grid_events) == video_num: - break - - # # The version where the loop also extract play_index (requires "index" in play event data): - # play_index = None # for event in user.get('events', []): # if event.get('event') == "grid" and event.get('data').get('index') not in grid_events: # grid_events[event.get('data').get('index')] = event.get('data') - # if event.get('event') == "play" and not play_index: - # play_index = event.get('data').get('index') - # if len(grid_events) == video_num and play_index: - # break + # if len(grid_events) == video_num: + # break + + # # The version where the loop also extract play_index (requires "index" in play event data): + play_index = None + for event in user.get('events', []): + if event.get('event') == "grid" and event.get('data').get('index') not in grid_events: + grid_events[event.get('data').get('index')] = event.get('data') + if event.get('event') == "play" and not play_index: + play_index = event.get('data').get('index') + if len(grid_events) == video_num and play_index: + break prev_grid_list = sorted([v for v in grid_events.values()], key=lambda k:k['index']) @@ -119,50 +119,45 @@ class Engine: return self.get_recommendations(user) else: - # Once the "index" is added to play event data, played index will be excluded from the random shuffle - # and deterministically added to staySame pool. - - # video_indx = [*range(playIndex)]+[*range(playIndex+1,video_num)] - video_indx = list(range(video_num)) + # played index is excluded from the random shuffle and deterministically added to staySame pool. + video_indx = [*range(play_index)]+[*range(play_index+1,video_num)] + # video_indx = list(range(video_num)) random.shuffle(video_indx) + video_indx.append(play_index) + next_clip_index = video_indx[:nc] + next_playlist_index = video_indx[nc:nc+np] + stay_same_index = video_indx[nc+np:] + rec_list = [] - # For now, randomly choose a clip in the same playlist instead of switching to the next clip. - # This will be changed once the clip position is tracked in the user data as "playlistPostion" - for i in video_indx[:nc]: - if prev_grid_list[i].get('playlist') is None: - # add this to deal with the absence of "playlist" data in a grid event temporarily. - # If there's no playlist data recorded, add the nextClip pool to nextPlaylist pool for now. - np += nc - nc = 0 - break - else: - # if "playlist" and "playlistPostion" data exists in grid event (it should be in the future) - for playlist in playlists: - if playlist.get('name')== prev_grid_list[i].get('playlist'): - # Discuss how this behavour should be: should it switch to a new playlist if it is the end of the playlist clip sequence already? - # if prev_grid_list[i].get('index') == len(playlist['clips']): - # playlist_pos = 0 - # else: - # playlist_pos = prev_grid_list[i].get('index') + 1 - - rec_list.append((i, { - 'clips': playlist['clips'], - 'position': random.randrange(len(playlist['clips'])), - # 'position': playlist_pos, - 'name': playlist['name'], - 'tags': playlist['tags'], - })) + # select next clip for nextClip pool except when the playlist has only one clip. + for i in next_clip_index: + for playlist in self.playlists: + if playlist.get('name')== prev_grid_list[i].get('playlist'): + if len(playlist["clips"]) == 1: + next_playlist_index.append(i) + break + # Discuss how this behavour should be: should it switch to a new playlist if it is the end of the playlist clip sequence already? + elif prev_grid_list[i].get('playlistPosition') + 1 == len(playlist['clips']): + playlist_pos = 0 + else: + playlist_pos = prev_grid_list[i].get('playlistPosition') + 1 + + rec_list.append((i, { + 'clips': playlist['clips'], + # 'position': random.randrange(len(playlist['clips'])), + 'position': playlist_pos, + 'name': playlist['name'], + 'tags': playlist['tags'], + })) # randomly select playlists (excluding the playlists from the current grid once "playlist" is recorded for grid events) # for nextPlaylist pool. - vids_exclude = [] - # vids_exclude = [e.get("playlist") for e in prev_grid_list] + vids_exclude = [e.get("playlist") for e in prev_grid_list] video = self.get_recommendations(user, vids_exclude) - rec_list += [(i, video[i]) for i in video_indx[nc:nc+np]] + rec_list += [(i, video[i]) for i in next_playlist_index] #staySame pool - # video_indx.append(playIndex) - rec_list += [(i,{}) for i in video_indx[nc+np:]] + rec_list += [(i,{}) for i in stay_same_index] rec_list = sorted(rec_list, key=lambda k:k[0]) return [e[1] for e in rec_list]