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

本文介绍了一个基于用户偏好的电影推荐系统的设计与实现。系统通过分析用户对电影的国家/地区、类型和主演的偏好,利用MongoDB进行聚合操作,推荐高频率的电影选项。最终,用户选择的电影将被用于个性化推荐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

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

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})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值