zoukankan      html  css  js  c++  java
  • 推荐系统

    起因:

    小编近期看了 58沈剑 的架构师之路,在里边,小编看到了一篇关于商城里边的推荐系统的理论文章《从0开始做互联网推荐-以58转转为例》,深有感触,但里边没有详细讲解,所以小编就自己琢磨,最近有点研究成果,所以拿来和大家分享,共同学习,一起进步~

     

    商品推荐:

    为什么我们需要这个商品推荐呢?淘宝里边的商品成百上千万,但大部分我们是不需要的,只有很少的一部分,才是我们需要的,如果我们不实现商品推荐,我们就不能推送较为适合客户的商品,从而会损失一部分客户资源。所以,我们需要实现商品推荐,来实现客户的买了再买,看了再看的目的。

     

    实现商品推荐

    1、收集数据

    我们要根据每个不同的客户,来推荐适合他们的产品,这时候,我们就需要采集用户的数据,如:商品购买记录,商品收藏记录,商品评价记录等数据(这篇文章我们只以这三个记录为准)。所以我们需要创建以下三个表:

    • 用户商品购买记录表
    • 用户商品收藏记录表
    • 用户商品评价记录表

    问:为什么需要这些表?我们不能直接从商品订单表、用户收藏表、评价表里边分析吗?

    答:小编认为这样不好,一是因为后期数据量庞大的时候,读取数据会很慢,不利于我们分析的实时性。二是订单有购买、退款等操作,在数据量大的时候不好识别用户是否退款,不可能每次分析都要去分析全库的,因为有些数据,我们只需要分析一遍就够了,比如购买没退款的。

    // 用户购买商品记录表
    CREATE TABLE `user_purchase` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `user_id` int(11) NOT NULL COMMENT '用户ID',
      `gtype_id` int(11) NOT NULL COMMENT '商品类型ID',
      `goods_id` int(11) NOT NULL COMMENT '商品ID',
      `goods_spec_id` int(11) NOT NULL COMMENT '商品规格ID',
      `price` decimal(11,0) NOT NULL COMMENT '购买单价',
      `num` int(11) NOT NULL COMMENT '购买数量',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户购买商品记录表';
    
    // 用户商品评价记录表
    CREATE TABLE `user_evaluate` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `user_id` int(11) NOT NULL COMMENT '用户ID',
      `gtype_id` int(11) NOT NULL COMMENT '商品类型ID',
      `goods_id` int(11) NOT NULL COMMENT '商品ID',
      `goods_spec_id` int(11) NOT NULL COMMENT '商品规格ID',
      `score` tinyint(2) NOT NULL DEFAULT '1' COMMENT '分数,默认1差评,2中评,3好评',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户商品评价记录表';
    
    // 用户收藏记录表
    CREATE TABLE `user_coll` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `user_id` int(11) NOT NULL COMMENT '用户ID',
      `gtype_id` int(11) NOT NULL COMMENT '商品类型ID',
      `goods_id` int(11) NOT NULL COMMENT '商品ID',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户收藏记录表';

     

    2、分析数据

    我们已经得到了用户的这些数据,接下来,我们便要对这些收集到的数据进行分析,统计起来,所以我们需要三个表来保存这些数据。

    • 商品分值表
    • 用户商品类型购买分值表
    • 用户消费水平表

    问:为什么需要用户商品类型购买分值表呢?

    答:这是记录用户,根据用户购买某类型下的商品次数,评论数,根据特定的加减算法来得到用户购买的比较多的,比较满意的某类型的商品,然后我们可以推荐一部分这类型的商品给用户。

    问:为什么需要商品分值表?

    答:这个表记录了所有用户购买商品以来,对于商品的满意分值,分值越大,代表商品越受欢迎。

    问:为什么需要用户消费水平表?

    答:我们推荐的商品需要符合用户的消费水平,如果不符合,那我们推送也将毫无意义,这个表主要就是记录每个用户的平均消费水平和消费价格区间。

     1 /* 商品分值表 */
     2 CREATE TABLE `goods_score` (
     3   `id` int(11) NOT NULL,
     4   `gtype_id` int(11) NOT NULL COMMENT '商品类型ID',
     5   `goods_id` int(11) NOT NULL COMMENT '商品ID',
     6   `score` int(11) NOT NULL COMMENT '分数值'
     7 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分值表';
     8 
     9 /* 用户商品类型购买分值表 */
    10 CREATE TABLE `user_buy_analysis` (
    11   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    12   `user_id` int(11) NOT NULL COMMENT '用户ID',
    13   `gtype_id` int(11) NOT NULL COMMENT '商品类型ID',
    14   `score` int(11) NOT NULL COMMENT '当前分数值(用于排序)',
    15   PRIMARY KEY (`id`)
    16 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户商品类型购买分值表';
    17 
    18 /* 用户消费水平表 */
    19 CREATE TABLE `user_consumption_analysis` (
    20   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    21   `user_id` int(11) NOT NULL COMMENT '用户ID',
    22   `min_money` decimal(11,2) NOT NULL COMMENT '消费最低金额',
    23   `average_money` decimal(11,2) NOT NULL COMMENT '平均消费金额',
    24   `max_money` decimal(11,2) NOT NULL COMMENT '消费最高金额',
    25   `price_range` varchar(2000) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户消费的价格区间(排序完成)',
    26   PRIMARY KEY (`id`)
    27 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户消费水平表';

    接下来我们需要符合我们业务的打分规则:

    • 购买 +5
    • 退款 -5
    • 收藏 +2
    • 好评 +5
    • 中评 +2
    • 差评 -20

    有了上面的规则之后,我们就可以对我们采集到的数据,进行一一分析,并对每一个商品、商品类型进行打分了。我们可以根据我们的商品单价(影响我们要不要购买最多的因素就是:单价),对于我们用户消费水平进行分析了。

    4、示例

    我们来看以下的四个场景:

    • 场景一:用户A(user_id:234)花了53元购买了一件男衣类型(gtype_id:1)的长袖衣服(goods_id:1),并收藏了,收到衣服之后,A非常满意,于是就给了好评。
    • 场景二:A花了65元买了一件女衣类型(gtype_id:2)的长裙(goods_id:2)给了自己女朋友,A的女朋友收到货之后,穿的好看,质量也好,于是A很开心的给了好评。
    • 场景三:用户A花了24元买了一件男衣类型的短袖(goods_id:3),但是A收到衣服之后,发觉衣服质量存在问题,客服那边有一直拖延,所以A很愤怒,给了一个差评。
    • 场景四:用户B(user_id:235)花了49元也买了一件男衣类型的短袖(goods_id:3),B收到衣服之后,质量很满意,所以B很高兴的给了好评。

    接下来我们就有了以下的数据了:

     1 /* user_purchase: */
     2 id:1user_id234,gtype_id:1,goods_id:1,price:53
     3 id:2user_id234,gtype_id:2,goods_id:2,price:65
     4 id:3user_id234,gtype_id:1,goods_id:3,price:24
     5 id:4user_id235,gtype_id:1,goods_id:3,price:24
     6  
     7 /* user_coll: */
     8 id:1user_id234,gtype_id:1,goods_id:1
     9 
    10 /* user_evaluate: */
    11 id:1user_id234,gtype_id:1,goods_id:1,score:3
    12 id:2user_id234,gtype_id:2,goods_id:2,score:3
    13 id:3user_id234,gtype_id:1,goods_id:3,score:1
    14 id:4user_id235,gtype_id:1,goods_id:3,score:3

    有了上面的数据之后,我们就能通过消息队列,对上面的数据进行分析,就得到了如下的分值数据:

    /* goods_score(商品分数表): */
    id:1,gtype_id:1,goods_id:1,score:5+2+5 = 12
    id:2,gtype_id:2,goods_id:2,score:5+5 = 10
    id:2,gtype_id:1,goods_id:3,score:5-20+5 = -10
    
    /* user_buy_analysis(用户商品类型购买分值表): */
    id:1user_id234,gtype_id:1,score:5+2+5+5-20 = -3
    id:2user_id234,gtype_id:2,score:5+5 = 10
    id:3user_id235,gtype_id:1,score:5+5 = 10
    
    /* user_consumption_analysis(用户消费水平表): */
    id:1user_id234,min_money:24,average_money:(24+65+53/ 3 = 47.33,max_money:65,price_range:{ '50-100': 2,'0-50': 1}
    id:2user_id235,min_money:24,average_money:24,max_money:24,price_range:{ '0-50': 1}

    由上面的数据,我们可以分别分析出比较符合用户A和用户B的商品。

    /* 符合用户A的商品 */
    [
        {
            'goods_id': 1,
            'goods_name': '长袖',
            'gtype_id': 1(男衣),
            'price': 53
        },
        {
            'goods_id': 3,
            'goods_name': '短袖',
            'gtype_id': 1(男衣),
            'price': 23
        },
        {
            'goods_id': 2,
            'goods_name': '长裙',
            'gtype_id': 2(女衣),
            'price': 65
        }
    ]

    结语:

    1、此文章是小编自己的心得,由于小编是新手,所以此文章有许多不足之处,请见谅。

    2、此文章涉及知识较为浅显,具体的设计还需要结合你自己的业务需要来设计。

    3、希望此文章能带给大家一些帮助,帮助大家进步。

  • 相关阅读:
    紫书 习题2-4 子序列的和
    紫书 习题2-3 倒三角形
    HDU 1013 Digital Roots(字符串,大数,九余数定理)
    HDU 1308 What Day Is It?(模拟,日期)
    ACM数论-欧几里得与拓展欧几里得算法
    今日计划
    UVA 10340 All in All(字符串,朴素匹配)
    ACM-字符串
    Codeforces Round #424 B. Keyboard Layouts(字符串,匹配,map)
    Codeforces Round #424 A(模拟)
  • 原文地址:https://www.cnblogs.com/kafeixiaoluo/p/9073822.html
Copyright © 2011-2022 走看看