【创新实训】 后端开发记录(3):个性化推荐后台

    技术2022-07-10  86

    需求

    用户以此选择偏好电影的国家/地区、类别、主演,并根据用户的选择,推荐具有代表性的电影,用户选择喜好的电影后,将所选电影加入推荐系统,用来做后续的推荐。

    models.py

    使用movie和user的model

    class Movie(Document): movieId=IntField() source=DictField() name = StringField() nameFrn = StringField() directors = ListField(StringField()) writers = ListField(StringField()) stars = ListField(StringField()) types = ListField(StringField()) country = ListField(StringField()) language = ListField(StringField()) releaseDate = ListField(StringField()) runtime = IntField() imdb = StringField() summary = StringField() timestamp = LongField() year = StringField() _id = ObjectIdField(primary_key=True) class User(Document): _id = ObjectIdField(primary_key=True) phone = StringField() name = StringField() pwd = StringField() emb = ListField(FloatField()) history = ListField(DictField()) question = IntField()

    urls.py

    添加url

    urlpatterns = [ path('api/question', view=views.question), ]

    view.py

    用户在前端选择后,将相应数据加入cookies传给后端,后端通过分析cookies中是否含有相关已选信息,来判断推荐到达了哪一步。 每一步中都根据用户的已选项通过MongoDB的聚合操作,选出当前步骤需要推荐的频数较高的选项,并返回前端 最后一步用户选择偏好电影后,将电影id和用户信息传入推荐系统,获得推荐结果,返回给前端

    @api_view(['GET']) def question(request): cookies=request.COOKIES if "country" not in cookies: pipeline=[{"$unwind":"$country"}, {"$group":{"_id":"$country","count":{"$sum":1}}}, {"$sort":{"count":-1}}] result=list(Movie._get_collection().aggregate(pipeline))[:12] return JsonResponse({'result': result}, json_dumps_params={'ensure_ascii': False}) if "types" not in cookies: country=urllib.parse.unquote(cookies['country']).split(",") pipeline = [{"$match":{"country":{"$in":country}}}, {"$unwind": "$types"}, {"$group": {"_id": "$types", "count": {"$sum": 1}}}, {"$sort": {"count": -1}}] result = list(Movie._get_collection().aggregate(pipeline))[:12] return JsonResponse({'result': result}, json_dumps_params={'ensure_ascii': False}) if "stars" not in cookies: country=urllib.parse.unquote(cookies['country']).split(",") types = urllib.parse.unquote(cookies['types']).split(",") pipeline = [{"$match": {"country": {"$in": country},"types":{"$in": types}}}, {"$unwind": "$stars"}, {"$group": {"_id": "$stars", "count": {"$sum": 1}}}, {"$sort": {"count": -1}}] result = list(Movie._get_collection().aggregate(pipeline))[:12] return JsonResponse({'result': result}, json_dumps_params={'ensure_ascii': False}) if "movies" not in cookies: country=urllib.parse.unquote(cookies['country']).split(",") types = urllib.parse.unquote(cookies['types']).split(",") stars = urllib.parse.unquote(cookies['stars']).split(",") filters = {} filters['country__in'] = country filters['types__in'] = types filters['stars__in'] = stars result = Movie.objects.exclude('_id').filter(**filters) result = result.order_by("-source__douban__rating").limit(12) return JsonResponse({'result': json.loads(result.to_json())}, json_dumps_params={'ensure_ascii': False}) movieIds=urllib.parse.unquote(cookies['movies']).split(",") for i in range(len(movieIds)): movieIds[i] = int(movieIds[i]) _id=cookies['_id'] user = User.objects.with_id(_id) if "question" not in user: items=views.init_emb(movieIds, _id) user.question=1 elif user.question==0: items=views.init_emb(movieIds, _id) user.question = 1 else: items=views.init_emb(movieIds, _id, False) User.objects.filter(_id=ObjectId(_id)).update_one(question=user.question) return JsonResponse({'success': True,'result':items})
    Processed: 0.012, SQL: 9