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 __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.º 4
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)