def test_diversity_on_recommendation_25(self): """ [recommendation.api.GetRecommendation] Test diversity for size 25 recommendation (at least 2/3 of user genres) """ size = 25 response = \ self.client.get("/api/v2/recommend/%d/" "00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961/" % size) user_id = User.get_user_id_by_external_id("00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961") user_genres = ItemGenre.genre_in( Item.get_item_by_id(item_id) for item_id in User.get_user_items(user_id) ) recommendation_genres = ItemGenre.genre_in( Item.get_item_by_external_id(item_eid) for item_eid in json.loads(response.content)["recommendations"] ) less, more = (user_genres, recommendation_genres) if len(user_genres) < len(recommendation_genres) else \ (recommendation_genres, user_genres) measure = 0 for genre in less: if genre in more: measure += 1 assert measure > len(less)*2./3., \ "Not sufficient genres in recommendation" \ "(user: %d, recommendation: %d, similarity: %d)" % (len(user_genres), len(recommendation_genres), measure)
def test_user_genres_in_recommendation_size_25(self): """ [recommendation.api.GetRecommendation] At least 19 of the top genres in the size 25 recommendation """ get_cache("default").clear() LogEntry.objects.all().delete() size = 25 response = \ self.client.get("/api/v2/recommend/%d/" "00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961/" % size) user_id = User.get_user_id_by_external_id("00b65a359307654a7deee7c71a7563d2816d6b7e522377a66aaefe8848da5961") user_genres = sorted(ItemGenre.genre_in( Item.get_item_by_id(item_id) for item_id in User.get_user_items(user_id) ).items(), key=lambda x: x[1], reverse=True) recommendation_genres = ItemGenre.genre_in( Item.get_item_by_external_id(item_eid) for item_eid in json.loads(response.content)["recommendations"] ) measure = [] for no, (genre, _) in enumerate(user_genres[:int(size)], start=1): if genre not in recommendation_genres: measure.append(no) assert len(measure) < 6, "Major genres failing by index: %s." \ "\nUser %s" \ "\nRecommendation %s" % ( measure, user_genres, [ItemGenre.genre_in([Item.get_item_by_external_id(item)]) for item in json.loads(response.content)["recommendations"]])
def load_rest(): User.load_to_cache() # Load main models Popularity.load_to_cache() TensorCoFi.load_to_cache() if "recommendation.language" in settings.INSTALLED_APPS: from recommendation.language.models import Region Region.load_to_cache() if "recommendation.diversity" in settings.INSTALLED_APPS: from recommendation.diversity.models import ItemGenre, Genre Genre.load_to_cache() ItemGenre.load_to_cache()
def setup_class(cls, *args, **kwargs): """ Put elements in db """ for genre in GENRES: Genre.objects.create(**genre) for app in ITEMS: item = Item.objects.create(name=app["name"], external_id=app["external_id"]) for genre in app["genres"]: g = Genre.objects.get(name=genre) ItemGenre.objects.create(item=item, type=g) for u in USERS: user = User.objects.create(external_id=u["external_id"]) for i in u["items"]: Inventory.objects.create(user=user, item=Item.get_item_by_external_id(i)) Genre.load_to_cache() ItemGenre.load_to_cache()
def test_items_language_cache(self): """ [recommendation.diversity.Cache] Test item in genre cache system """ for i in ITEMS: item = Item.objects.get(external_id=i["external_id"]) for gen in item.genres.all(): assert gen.type.pk in ItemGenre.get_genre_by_item(item.pk), \ "Genre %s for item %s is not in cache" % (gen.type, item)
def __call__(self, recommendation, item_id): genres = ItemGenre.get_genre_by_item(item_id) dropped = 0 for genre in genres: self.counter[genre] -= 1 if self.counter[genre] < 0: dropped += 1 # Change "<" to "<=" improve greatly if dropped <= len(genres): # recommendation.append(item) return True return False
def __init__(self, items, size, user, alpha_constant, lambda_constant): number_items = len(items) user_items = user.owned_items user_genres = ItemGenre.genre_in((item for item in user_items.values())) user_items_count = len(user_items) self.counter = {} for genre_id in Genre.get_all_genres(): genre = Genre.get_genre_by_id(genre_id) try: p_global = genre.count_items / float(number_items) except ZeroDivisionError: p_global = 0. try: p_local = user_genres.get(genre, 0.) / float(user_items_count) except ZeroDivisionError: p_local = 0. self.counter[genre.pk] = int(weighted_p(p_global, p_local, alpha_constant) * size)
def fill_item_genre(self, objects, items, genres): """ Fill item genres connection :param items: :param genres: :return: """ query_item_genres = Q() item_genres = {} for json_item in objects: json_genres = json_item.get(self.item_genres_field, None) or () for json_genre in json_genres: query_item_genres = \ query_item_genres | Q(item_id=items[json_item[self.item_field]].pk, type_id=genres[json_genre].pk) item_genres[(items[json_item[self.item_field]].pk, genres[json_genre].pk)] = \ ItemGenre(item=items[json_item[self.item_field]], type=genres[json_genre]) if len(query_item_genres) > 0: for item_genre in ItemGenre.objects.filter(query_item_genres): del item_genres[item_genre.item_id, item_genre.type_id] ItemGenre.objects.bulk_create(item_genres.values())
def __init__(self, items, size, user, alpha_constant, lambda_constant): number_items = len(items) user_items = user.owned_items user_genres = ItemGenre.genre_in( (item for item in user_items.values())) user_items_count = len(user_items) self.counter = {} for genre_id in Genre.get_all_genres(): genre = Genre.get_genre_by_id(genre_id) try: p_global = genre.count_items / float(number_items) except ZeroDivisionError: p_global = 0. try: p_local = user_genres.get(genre, 0.) / float(user_items_count) except ZeroDivisionError: p_local = 0. self.counter[genre.pk] = int( weighted_p(p_global, p_local, alpha_constant) * size)
application = get_wsgi_application() from django.conf import settings from recommendation.models import Item, User, TensorCoFi, Popularity # Load user and items Item.load_to_cache() User.load_to_cache() # Load main models Popularity.load_to_cache() TensorCoFi.load_to_cache() if "recommendation.language" in settings.INSTALLED_APPS: from recommendation.language.models import Locale, Region Locale.load_to_cache() Region.load_to_cache() #if "recommendation.simple_logging" in recommendation.settings.INSTALLED_APPS: # print("Loading logs to cache...") # from recommendation.simple_logging.models import LogEntry # LogEntry.load_to_cache() # print("done!") if "recommendation.diversity" in settings.INSTALLED_APPS: from recommendation.diversity.models import ItemGenre, Genre Genre.load_to_cache() ItemGenre.load_to_cache()
from django.core.wsgi import get_wsgi_application application = get_wsgi_application() from django.conf import settings from recommendation.models import Item, User, TensorCoFi, Popularity # Load user and items Item.load_to_cache() User.load_to_cache() # Load main models Popularity.load_to_cache() TensorCoFi.load_to_cache() if "recommendation.language" in settings.INSTALLED_APPS: from recommendation.language.models import Locale, Region Locale.load_to_cache() Region.load_to_cache() #if "recommendation.simple_logging" in recommendation.settings.INSTALLED_APPS: # print("Loading logs to cache...") # from recommendation.simple_logging.models import LogEntry # LogEntry.load_to_cache() # print("done!") if "recommendation.diversity" in settings.INSTALLED_APPS: from recommendation.diversity.models import ItemGenre, Genre Genre.load_to_cache() ItemGenre.load_to_cache()