一、项目技术

开发语言:Python
python框架:Django
软件版本:python3.7/python3.8
数据库:mysql 5.7或更高版本
数据库工具:Navicat11
开发软件:PyCharm/vs code
前端框架:vue.js

二、项目内容和项目介绍

  🎈1.项目内容

   在当今数字化时代,动漫产业蓬勃发展,网络上涌现出海量的动漫资源。对于动漫爱好者来说,在众多选择中找到符合自己口味的动漫作品变得愈发困难。本项目旨在构建一个基于协同过滤算法的动漫推荐系统,通过分析用户对动漫的行为数据(如观看历史、评分记录等),挖掘用户之间的相似性或动漫之间的相似性,从而为用户精准推荐其可能感兴趣的动漫,提升用户发现优质动漫的效率,增强用户在动漫平台上的粘性与满意度。
  🎈2.项目介绍

  
数据分析模块

1.数据预处理:
1.对采集到的动漫数据和用户行为数据进行清洗和预处理操作。在动漫数据方面,处理缺失值,如对于某些缺失制作公司信息的动漫,可以根据其相关联的导演、声优或其他已知信息进行合理推测补充;对于异常值,如不合理的上映年份或过长的动漫名称,进行修正或删除。对文本数据(如剧情简介)进行清洗,去除标点符号、停用词等,然后可以使用自然语言处理技术(如词向量模型 Word2Vec 或 GloVe)将文本转换为向量表示,以便后续进行文本相似性分析。
2.在用户行为数据方面,处理用户评分数据中的缺失值,可采用均值填充或基于用户相似性的填充方法。例如,对于某个用户未评分的动漫,可以根据与该用户相似的其他用户对该动漫的评分来推测填充。同时,对异常的观看时间或操作记录进行筛选和修正,确保数据的准确性和可靠性。
2.用户相似度计算:
1.采用协同过滤算法中的用户相似度计算方法,如余弦相似度、皮尔逊相关系数等。以余弦相似度为例,对于两个用户 A 和 B,其相似度计算公式为:,其中 和 分别表示用户 A 和用户 B 对动漫 的评分, 是用户 A 和用户 B 共同评价过的动漫集合。通过计算用户之间的相似度,构建用户相似度矩阵,该矩阵将作为基于用户的协同过滤推荐的重要依据。
3.动漫相似度计算:
1.除了用户相似度计算,还进行动漫之间的相似度计算。分析动漫的多种特征,如类型、制作公司、声优阵容、剧情关键词等。对于类型特征,可以通过将动漫类型转换为向量形式(如使用独热编码或基于类型频率的向量表示),然后计算向量之间的余弦相似度来衡量动漫在类型上的相似程度。对于剧情关键词,可以利用文本相似性算法(如 TF - IDF 结合余弦相似度)计算其相似性。综合多种特征的相似度计算结果,构建动漫相似度矩阵,用于基于动漫的协同过滤推荐。

推荐算法实现:
1.实现基于协同过滤的推荐算法,包括基于用户的协同过滤推荐和基于动漫的协同过滤推荐。
2.基于用户的协同过滤推荐:首先确定目标用户,然后根据用户相似度矩阵找到与目标用户相似的邻居用户(例如,选取相似度最高的前 个用户)。接着,从邻居用户喜欢且目标用户尚未观看或评分的动漫中,按照一定的推荐策略进行推荐。推荐策略可以是基于邻居用户相似度的加权平均评分,即对邻居用户对某动漫的评分乘以其与目标用户的相似度,然后求和并归一化,得到该动漫对目标用户的推荐得分,按照得分高低推荐动漫。
基于动漫的协同过滤推荐:当用户观看或喜欢某部动漫时,根据动漫相似度矩阵找到与该动漫相似的其他动漫,并推荐给用户。可以根据动漫相似度的高低以及其他因素(如动漫的热门程度、评分情况等)进行排序推荐。此外,还可以考虑将基于用户和基于动漫的协同过滤推荐结果进行融合,综合两者的优势,提高推荐的准确性和多样性

三、核心代码

部分代码:



def config_page(request):
    '''
    获取参数信息
    :return:
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code,
               "data": {"currPage": 1, "totalPage": 1, "total": 1, "pageSize": 10, "list": []}}
        req_dict = request.session.get('req_dict')
        msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], \
        msg['data']['pageSize'] = config.page(config, config, req_dict)
        return JsonResponse(msg)


def config_list(request):
    '''
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code,
               "data": {"currPage": 1, "totalPage": 1, "total": 1, "pageSize": 10, "list": []}}
        req_dict = request.session.get("req_dict")

        msg['data']['list'], msg['data']['currPage'], msg['data']['totalPage'], msg['data']['total'], \
        msg['data']['pageSize'] = config.page(config, config, req_dict)

        return JsonResponse(msg)


def config_info(request, id_):
    '''
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}

        data = config.getbyid(config, config, int(id_))
        if len(data) > 0:
            msg['data'] = data[0]
        return JsonResponse(msg)


def config_detail(request, id_):
    '''
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}

        data = config.getbyid(config, config, int(id_))
        if len(data) > 0:
            msg['data'] = data[0]
        return JsonResponse(msg)


def config_save(request):
    '''
    创建参数信息
    :return:
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}

        req_dict = request.session.get('req_dict')
        param1 = config.getbyparams(config, config, req_dict)
        if param1:
            msg['code'] = id_exist_code
            msg['msg'] = mes.id_exist_code
            return JsonResponse(msg)

        error = config.createbyreq(config, config, req_dict)
        logging.warning("save_config.res=========>{}".format(error))
        if error != None:
            msg['code'] = crud_error_code
            msg['msg'] = error
        return JsonResponse(msg)


def config_add(request):
    '''
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}
        req_dict = request.session.get("req_dict")

        error = config.createbyreq(config, config, req_dict)
        if error != None:
            msg['code'] = crud_error_code
            msg['msg'] = error
        return JsonResponse(msg)


def config_update(request):
    '''
    更新参数信息
    :return:
    '''
    if request.method in ["POST", "GET"]:
        msg = {"code": normal_code, "msg": mes.normal_code, "data": {}}

        req_dict = request.session.get('req_dict')


        config.updatebyparams(config, config, req_dict)

        return JsonResponse(msg)



四、效果图

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐