def recommend(self, playlist_id, at=10): playlist_id = int(playlist_id) helper = Helper() ### DUE TO TIME CONSTRAINT THE CODE STRUCTURE HERE IS REDUNTANT ### TODO exploit inheritance to reduce code duplications and simple extract ratings, combine them, simply by iterate over a list of recommenders ### COMMON CODE ### self.hybrid_ratings = None #BE CAREFUL, MAGIC INSIDE :) ### COMBINE RATINGS IN DIFFERENT WAYS (seq, random short, random long) if (helper.is_sequential(playlist_id)): self.userCF_ratings = self.userCF_sequential.get_expected_ratings( playlist_id) self.itemCF_ratings = self.itemCF_sequential.get_expected_ratings( playlist_id) self.cbf_ratings = self.cbf_sequential.get_expected_ratings( playlist_id) self.slim_elastic_ratings = self.slim_elastic_sequential.get_expected_ratings( playlist_id) # self.svd_icm_ratings = self.svd_icm_sequential.get_expected_ratings(playlist_id) self.ALS_ratings = self.ALS_sequential.get_expected_ratings( playlist_id) self.slim_ratings = self.slim_sequential.get_expected_ratings( playlist_id) w_right = self.w_seq else: self.userCF_ratings = self.userCF.get_expected_ratings(playlist_id) self.itemCF_ratings = self.itemCF.get_expected_ratings(playlist_id) self.cbf_ratings = self.cbf.get_expected_ratings(playlist_id) self.slim_elastic_ratings = self.slim_elastic.get_expected_ratings( playlist_id) # self.svd_icm_ratings = self.svd_icm.get_expected_ratings(playlist_id) self.ALS_ratings = self.ALS.get_expected_ratings(playlist_id) self.slim_ratings = self.slim_random.get_expected_ratings( playlist_id) if len(self.URM[playlist_id].indices) > 10: w_right = self.w_long else: w_right = self.w_short self.hybrid_ratings = self.userCF_ratings * w_right["user_cf"] self.hybrid_ratings += self.itemCF_ratings * w_right["item_cf"] self.hybrid_ratings += self.cbf_ratings * w_right["cbf"] self.hybrid_ratings += self.slim_ratings * w_right["slim"] # self.hybrid_ratings += self.svd_icm_ratings * w_right["svd_icm"] self.hybrid_ratings += self.ALS_ratings * w_right["als"] self.hybrid_ratings += self.slim_elastic_ratings * w_right["elastic"] recommended_items = np.flip(np.argsort(self.hybrid_ratings), 0) # REMOVING SEEN unseen_items_mask = np.in1d(recommended_items, self.URM[playlist_id].indices, assume_unique=True, invert=True) recommended_items = recommended_items[unseen_items_mask] return recommended_items[0:at]