=

1、项目介绍

  • 技术栈:Python语言、Django框架(Web后端)、双协同过滤推荐算法(基于用户+基于物品)、requests爬虫(商品数据采集)、HTML(前端界面构建)、MySQL数据库(隐含,支撑商品/用户/行为数据存储)
  • 核心功能:用户认证(登录/注册/退出)、个性化商品推荐(双协同过滤驱动,登录用户精准推荐,未登录用户随机推荐)、商品全流程交互(详情查看/搜索/分类筛选/收藏/打分/购买)、秒杀商品展示(随机5个)、后台数据管理、商品数据爬虫采集
  • 研究背景:电商平台商品量激增,用户面临“信息过载”痛点——传统推荐依赖热门度缺乏个性化,而双协同过滤算法可通过用户行为(打分/浏览)实现精准匹配,解决“找货难”问题,提升用户转化与留存。
  • 研究意义:技术层面,整合Django开发与双协同过滤算法,明确核心代码逻辑(product/views.py的index方法),实现“推荐-交互-管理”闭环;应用层面,为商家提供个性化推荐方案,提升用户购物体验与平台销量;学习层面,适合作为推荐算法+Web开发方向毕业设计,覆盖代码实操与业务落地。

2、项目界面

  1. 双协同过滤推荐算法推荐商品界面(展示基于用户/基于物品两种算法的推荐结果)
    在这里插入图片描述

  2. 系统首页----商品分类界面(展示商品分类导航与秒杀商品列表)

在这里插入图片描述

  1. 商品搜索界面(支持商品关键词检索,展示匹配结果)

在这里插入图片描述

  1. 商品详情页(展示商品信息、支持收藏、打分、购买操作)

在这里插入图片描述

  1. 后台数据管理界面(维护商品/用户/订单数据,配置系统参数)

在这里插入图片描述

  1. 数据网络爬虫界面(配置爬虫任务,采集外部商品数据补充数据库)

在这里插入图片描述

3、项目说明

本项目是基于Django与双协同过滤算法的商品推荐系统,聚焦“个性化推荐+完整购物交互”核心需求,通过清晰的技术逻辑与业务设计,解决电商平台“推荐不精准、用户找货难”的痛点。系统核心技术逻辑围绕product/views.py的index方法展开,该方法是首页功能的核心载体,具体实现四大便捷功能:一是随机获取5个秒杀商品(每次刷新不同,提升用户访问新鲜感);二是加载全量商品分类(支撑前端分类筛选,帮助用户快速定位品类);三是针对登录用户,调用recommend_by_user_id(基于用户的协同过滤)与recommend_by_item(基于物品的协同过滤)方法生成精准推荐列表——其中基于用户的推荐权重来自用户对商品的打分数据,通过计算用户间相似度(如余弦相似度)匹配偏好相似用户的高评分商品;基于物品的推荐权重来自用户浏览记录,通过计算商品间相似度(如基于浏览共现率)推荐相似商品;四是针对未登录用户,随机从数据库获取商品推荐,保障基础用户体验。

系统数据支撑层面,通过requests爬虫采集外部商品数据(如商品基础信息、价格、销量),经清洗后存入数据库,为推荐算法与商品展示提供丰富素材;推荐算法实现阶段,先构建“用户-商品打分矩阵”与“用户-商品浏览矩阵”,再通过scikit-learn、pandas等库计算相似度,预测用户对未交互商品的偏好度,最终按偏好度排序生成推荐列表。业务功能上,系统覆盖用户全流程需求:用户通过注册登录进入系统,在首页可查看秒杀商品、分类导航与个性化推荐;通过搜索/分类筛选找到目标商品,进入详情页完成收藏、打分(为推荐算法提供数据)、购买操作;管理员则通过后台数据管理界面维护商品信息、用户权限与订单数据,确保系统稳定运行。

此外,系统还可通过纳入价格、销量等因素加权优化推荐精度,同时借助简洁的HTML前端界面提升交互体验,既实现了“数据采集-推荐计算-用户交互-后台管理”的完整链路,又通过双协同过滤算法保障推荐个性化,最终帮助商家提升用户留存与销售转化,也为学习推荐算法与Web开发提供了可落地的实践案例。

4、核心代码


"""
协同过滤-基于商品
"""

import math

from account.models import Account
from product.models import Product


class ItemCF:

    # 获得初始化数据
    def __init__(self, data):
        self.similar = dict()
        self.data = data

    def item_similarity(self):
        # 建立物品-物品的共现矩阵
        cooccur = dict()  # 物品-物品的共现矩阵
        buy = dict()  # 物品被多少个不同用户购买N
        for user, items in self.data.items():
            for i in items.keys():
                buy.setdefault(i, 0)
                buy[i] += 1
                cooccur.setdefault(i, {})
                for j in items.keys():
                    if i == j:
                        continue
                    cooccur[i].setdefault(j, 0)
                    cooccur[i][j] += 1
        # 计算相似度矩阵
        for i, related_items in cooccur.items():
            self.similar.setdefault(i, {})
            for j, cij in related_items.items():
                self.similar[i][j] = cij / (math.sqrt(buy[i] * buy[j]))
        print('similar items: ', self.similar.items())
        return self.similar

    # 给用户user推荐,前K个相关用户,前N个物品
    def recommend(self, user, K=6, N=15):
        rank = dict()
        action_item = self.data[user]
        # 用户user产生过行为的item和评分
        for item, score in action_item.items():
            sorted_items = sorted(self.similar[item].items(), key=lambda x: x[1], reverse=True)[0:K]
            for j, wj in sorted_items:
                if j in action_item.keys():
                    continue
                rank.setdefault(j, 0)
                rank[j] += score * wj
        return sorted(rank.items(), key=lambda x: x[1], reverse=True)[0:N]


def recommend_by_item(user_id, u_num=5, p_num=15):
    """
    这是根据用户的浏览数据,进行推荐的
    """
    current_user = Account.objects.get(id=user_id)
    # print("我是当前用户")
    print(current_user.footmark_set.count())
    # 如果当前用户没有浏览任何商品 则按照热度顺序返回
    if current_user.footmark_set.count() == 0:
        book_list = Product.objects.all().order_by("-views_count")[:p_num]
        return book_list
    users = Account.objects.all()
    # 构建评分矩阵
    all_user = {}
    for user in users:
        rates = user.footmark_set.all()
        rate = {}
        # 用户有浏览商品,包装成字典的形式
        if rates:
            for i in rates:
                if i.product.id in rate:
                    rate[i.product.id] += 1
                else:
                    rate.setdefault(str(i.product.id), 1)  # 浏览一次设置为1分
            all_user.setdefault(user.username, rate)
        else:
            # 用户没有浏览过商品,设为0
            all_user.setdefault(user.username, {})
    print("this is all user:", all_user)
    item = ItemCF(data=all_user)
    item.item_similarity()
    recommend_dict = item.recommend(current_user.username, u_num, p_num)
    print('recommend_dict: ', recommend_dict)

    if not recommend_dict:
        # 如果=没有推荐任何商品 则按照热度顺序返回
        maquillage_list = Product.objects.all().order_by("-views_count")[:p_num]
        return maquillage_list

    good_list = [each[0] for each in recommend_dict]
    print('good_list: ', good_list)
    product_qu = Product.objects.filter(id=good_list[0])
    for i in range(1, len(good_list)):
        product_qu = product_qu | Product.objects.all().filter(id=good_list[i])
    return product_qu


def recommend_by_item_collect(user_id, u_num=5, p_num=15):
    """
    这是根据用户收藏的数据进行推荐的
    """
    current_user = Account.objects.get(id=user_id)
    # print("我是当前用户")
    print(current_user.collect_set.count())
    # 如果当前用户没有浏览任何商品 则按照热度顺序返回
    if current_user.collect_set.count() == 0:
        maquillage_list = Product.objects.all().order_by("-views_count")[:p_num]
        return maquillage_list
    users = Account.objects.all()
    # 构建评分矩阵
    all_user = {}
    for user in users:
        rates = user.collect_set.all()
        rate = {}
        # 用户有浏览商品,包装成字典的形式
        if rates:
            for i in rates:
                if i.product.id in rate:
                    rate[i.product.id] += 1
                else:
                    rate.setdefault(str(i.product.id), 1)  # 收藏一次设置为1分
            all_user.setdefault(user.username, rate)
        else:
            # 用户没有浏览过商品,设为0
            all_user.setdefault(user.username, {})
    print("this is all user:", all_user)
    item = ItemCF(data=all_user)
    item.item_similarity()
    recommend_dict = item.recommend(current_user.username, u_num, p_num)
    print('recommend_dict: ', recommend_dict)

    if not recommend_dict:
        # 如果=没有推荐任何商品 则按照热度顺序返回
        maquillage_list = Product.objects.all().order_by("-views_count")[:p_num]
        return maquillage_list

    good_list = [each[0] for each in recommend_dict]
    print('good_list: ', good_list)
    product_qu = Product.objects.filter(id=good_list[0])
    for i in range(1, len(good_list)):
        product_qu = product_qu | Product.objects.all().filter(id=good_list[i])
    return product_qu



Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐