商品推荐系统

推荐系统首先收集用户的历史行为数据,然后通过预处理的方法得到用户-评价矩阵,再利用机器学习领域中相关推荐技术形成对用户的个性化推荐。有的推荐系统还搜集用户对推荐结果的反馈,并根据实际的反馈信息实时调整推荐策略,产生更符合用户需求的推荐结果。为了更好的去了解一个推荐系统,从0到1了解推荐过程,我们通过一些网上开源的数据来搭建一个推荐系统


一、整体目标

搭建推荐系统的第一步是明确目标和需求:

  1. 业务目标:为用户提供个性化的商品推荐,提高商品曝光率和购买转化率。
  2. 推荐类型
    • 个性化推荐:根据用户的历史行为推荐商品。
    • 热门推荐:根据商品流行趋势推荐高销量或高评价的商品。
    • 相似商品推荐:推荐与用户浏览或购买的商品类似的商品。
  3. 用户需求:分析用户的行为数据,包括浏览、点击、购买、搜索等操作。
  4. 架构设计需求:使用前后端分离的架构,前端使用 Vue.js 提供页面交互,后端采用 Python 开发 API 并执行推荐逻辑。

二、数据准备

1. 数据收集

数据源选取自 Kaggle,常见的数据集包括以下几类:

  • 商品数据(包含类目) :这里我们选择的是amazon-products-dataset-2023-1-4m-products,为什么不是淘宝或者京东商品?问就是没有
  • 评分数据 :用户对商品的评分(如 1~5 分),这里用的是亚马逊商品评分数据,淘宝京东也是没有的
  • 用户行为数据:用户点击、浏览、购买、评分、评论记录等。前期只有一张简单的自建点击表,后续看看怎么扩展吧。

db使用的是sqlite3,搜索东西均为了轻量化,数据获取如下:

python 复制代码
    path = kagglehub.dataset_download("asaniczka/amazon-products-dataset-2023-1-4m-products")
    print("Path to dataset files:", path)

    # 查找 CSV 文件
    data_file = None
    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith(".csv"):
                data_file = os.path.join(root, file)
                break

    # 连接 SQLite 数据库
    conn = sqlite3.connect('db/recommend.db')

用户id当前为了轻量化,我们直接使用用户的ip做为user_id,建表如下:

sql 复制代码
-- auto-generated definition
create table user_clicks
(
    user_id    TEXT,
    asin       TEXT,
    click_time TIMESTAMP
);

2. 数据清洗与预处理

处理原始数据可能出现的问题:

  • 异常值处理:过滤异常数据,如重复记录或评分异常。
  • 缺失值填充:对商品描述等缺失信息填充默认值(如 "无描述")。
  • 格式转换:将数据转换为推荐算法的输入格式,例如生成用户-商品评分矩阵。

对于商品文本信息(如商品描述和标题),可以使用词频统计(TF-IDF)提取关键词。

3. 数据存储与分割

将清洗后的数据存入数据库(如 MySQL),并按时间或用户分割为训练集和测试集:

  • 训练集:用于训练模型,通常使用历史数据。
  • 测试集:用于验证模型性能和推荐结果质量。

三、后端设计与推荐算法开发

后端使用的flask框架,对每一个请求都执行召回、粗排、精排、重排等,最终展示到用户。

1. 推荐算法设计

根据业务需求选择以下推荐方法:

  • 基于协同过滤的推荐

    • 用户协同过滤:分析行为相似的用户并推荐他们关注的商品。
    • 商品协同过滤:按商品之间的相似性推荐,比如推荐与当前商品类似的商品。
  • 基于内容的推荐: 按商品属性(如标题或类别)进行推荐。使用 TF-IDF 方法提取文本特征,并基于余弦相似性计算商品之间的相似性。

  • 基于深度学习的推荐: 使用深度学习方法,如神经协同过滤或序列模型。该方式能够捕捉复杂的用户行为和兴趣变化。

2. 推荐服务开发

后端推荐服务应该支持以下功能:

  • 热门商品推荐:基于销量、评价等指标推荐热门商品。
  • 个性化推荐:根据用户历史行为生成专属推荐列表。
  • 相似商品推荐:基于商品相似性推荐相关产品。

下面是由GPT生成的代码,只展示部分,感兴趣的可以直接去看下源码:github.com/Zephery/ama...

python 复制代码
candidates = recall(user_id)
coarse_ranked = coarse_ranking(candidates)
fine_ranked = fine_ranking(user_id, coarse_ranked)
final_recommendations = re_ranking(user_id, fine_ranked)

四、前端设计与展示

前端采用 Vue.js 构建交互页面,在推荐系统中展示推荐结果。

1. 前端页面结构

前端主要实现以下功能:

  • 首页推荐:展示热门商品。
  • 个性化推荐:为用户提供专属推荐内容。
  • 商品详情页:展示与当前商品关联的推荐商品。

2. 与后端的接口调用

前端与后端通过 API 完成数据交互,获取以下推荐结果:

  • 热门商品列表。
  • 个性化推荐结果。
  • 商品关联推荐内容。

3. 数据展示方式

推荐结果展示在动态页面中,用户可以点击查看商品详情或加入购物车。

4. 成果

体验直达:rec.wenzhihuai.com/products,因服务需要加载大量数据,可能有时候无法访问。

主商品界面

清理浏览记录可把自己的点击日志给清空,可以重新点击别的来体验一下推荐效果。

商品详情页


五、下一步的优化

太多了,这个版本只是个草稿,甚至说是半残品,本人技术有限,大部分也只能看看GPT生成的一些代码,调优还在持续进行中。 1.搜索无法精准找到想要的内容,比如搜索"ipad",出来的却是一大堆ipad相关的配件,这个还在优化中 2.点击单个商品后,再次返回,所推荐的商品相关性太差 3.需要由推荐系统转变为广告系统,增加投放、计费等能力。 慢慢来吧

访问地址:rec.wenzhihuai.com/products 源码:github.com/Zephery/ama...

相关推荐
程序员爱钓鱼1 小时前
Rust const泛型详解:让常量也成为泛型参数
后端·面试·rust
evans在进步2 小时前
Spring Boot 工程化核心详解:Parent、Starter、热部署、事务与多数据源
spring boot·后端·python
宫水三叶的刷题日记2 小时前
馋猫外卖:AI 让字节式试错没有天花板
后端
SomeB1oody3 小时前
【RustyML入门】7.4. 按需裁剪与模块化集成
开发语言·后端·机器学习·rust·教程
罗超驿3 小时前
SpringBoot 快速入门
java·spring boot·后端
卷无止境4 小时前
除了开发api,FastAPI其实也可以配合jinja2模板写页面
后端·python·fastapi
newerp4 小时前
Redis 操作与缓存策略
后端·程序员·go
newerp4 小时前
GORM ORM 基础
后端·程序员·go
小岛前端4 小时前
AI Skills 已经封神,但新的问题却越来越严重!
前端·后端·github
拖孩4 小时前
一个人 + AI 做的小程序,上线 15 天赚了 10 块 5
前端·后端·微信小程序