推薦系統 - 商品推薦(新人心得)


起因:

小編近期看了 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、希望此文章能帶給大家一些幫助,幫助大家進步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM