Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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"]])
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
 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()
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
 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()
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
0
 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
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
 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())
Ejemplo n.º 12
0
    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)
Ejemplo n.º 13
0
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()
Ejemplo n.º 14
0
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()