示例#1
0
 def test_filter_regions(self):
     """
     [recommendation.filter.Region] Test a region filter on recommendation
     """
     rfilter = SimpleRegionFilter()
     recommendation = [random.random() for _ in range(len(ITEMS))]
     app_rec = [
         Item.get_item_by_id(aid + 1).external_id for aid, _ in sorted(
             enumerate(recommendation), key=lambda x: x[1], reverse=True)
     ]
     for u in USERS:
         user = User.get_user_by_external_id(u["external_id"])
         with self.assertNumQueries(0):
             result = rfilter(user, np.array(recommendation[:]))
         new_rec = [
             Item.get_item_by_id(aid + 1).external_id for aid, _ in sorted(
                 enumerate(result), key=lambda x: x[1], reverse=True)
         ]
         n = len(u["last_apps_region"])
         if n == 0:
             assert new_rec == app_rec, \
                 "Recommendation is not the same when not apps to filter(%s != %s)" % (new_rec, app_rec)
         else:
             for item in u["last_apps_region"]:
                 assert item in new_rec[0-n:], \
                     "Item %s for user %s is not in the last in recommendation %s. Items filtered %s." % \
                     (item, user, new_rec, list(u["last_apps_region"]))
示例#2
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)
示例#3
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"]])
示例#4
0
 def test_filter_regions(self):
     """
     [recommendation.filter.Region] Test a region filter on recommendation
     """
     rfilter = SimpleRegionFilter()
     recommendation = [random.random() for _ in range(len(ITEMS))]
     app_rec = [Item.get_item_by_id(aid+1).external_id
                for aid, _ in sorted(enumerate(recommendation), key=lambda x: x[1], reverse=True)]
     for u in USERS:
         user = User.get_user_by_external_id(u["external_id"])
         with self.assertNumQueries(0):
             result = rfilter(user, np.array(recommendation[:]))
         new_rec = [Item.get_item_by_id(aid+1).external_id
                    for aid, _ in sorted(enumerate(result), key=lambda x: x[1], reverse=True)]
         n = len(u["last_apps_region"])
         if n == 0:
             assert new_rec == app_rec, \
                 "Recommendation is not the same when not apps to filter(%s != %s)" % (new_rec, app_rec)
         else:
             for item in u["last_apps_region"]:
                 assert item in new_rec[0-n:], \
                     "Item %s for user %s is not in the last in recommendation %s. Items filtered %s." % \
                     (item, user, new_rec, list(u["last_apps_region"]))
示例#5
0
文件: models.py 项目: mozilla/frappe
 def get_item_locales(item_id):
     return set([
         pk[0] for pk in Item.get_item_by_id(
             item_id).locales.all().values_list("locale_id")
     ])
示例#6
0
 def get_item_locales(item_id):
     return set([pk[0] for pk in Item.get_item_by_id(item_id).locales.all().values_list("locale_id")])