推荐系统 - 商品推荐(新人心得)

起因:

小编近期看了 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、希望此文章能带给大家一些帮助,帮助大家进步。

posted @ 2018-05-22 21:24  咖啡屋小罗  阅读(2846)  评论(0编辑  收藏  举报