《基于mahout on spark + elastic search搭建item推荐系统》

项目的背景

推荐系统可以在用户没有明确表述需求的情况下,给出准确的,甚至超出预期的建议结果,以提升用户满意度和GMV。

典型的推荐场景如下:
电商,根据商品推荐商品

用户点击的详情页商品
推荐商品列表

根据推荐位置划分合适的推荐算法

推荐算法有很多种,但是在互联网行业使用较多实现效率高的算是“协同过滤”。但是根据不同的位置用户接受程度的不同,又有所区分。
推荐算法的分类,可以参考这篇博文
http://www.ibm.com/developerworks/cn/web/1103_zhaoct_recommstudy1/index.html

本项目的主要目标:
基于项目的协同过滤推荐
基于项目的协同过滤推荐的基本原理也是类似的,只是说它使用所有用户对物品或者信息的偏好,发现物品和物品之间的相似度,然后根据用户的历史偏好信息,将类似的物品推荐给用户,下图 很好的诠释了它的基本原理。

基于item的推荐

假设用户 A 喜欢物品 A 和物品 C,用户 B 喜欢物品 A,物品 B 和物品 C,用户 C 喜欢物品 A,从这些用户的历史喜好可以分析出物品 A 和物品 C 时比较类似的,喜欢物品 A 的人都喜欢物品 C,基于这个数据可以推断用户 C 很有可能也喜欢物品 C,所以系统会将物品 C 推荐给用户 C。
与上面讲的类似,基于项目的协同过滤推荐和基于内容的推荐其实都是基于物品相似度预测推荐,只是相似度计算的方法不一样,前者是从用户历史的偏好推断,而后者是基于物品本身的属性特征信息。

架构设计目标

  1. 实时:订阅推荐系统关注的数据流:推荐商品点击数据。实时记录推荐过,点击过的商品。

  2. 非实时:复用现有的离线数据集,如:用户属性,商品属性,商品喜欢,买手关注,商品购买记录。

  3. 初版推荐算法,基于item推荐item。结果出现在app商品详情页。
    数据出现的具体策略:
    (1) 优先基于item的协同过滤items 集合
    (2) 同类目下最热门的items集合(by search)
    (3) 同类目下最新的items集合(by search)

  4. 在商品详情页的底部尝试如下算法流程
    A)基于协同过滤的item推荐
    1) 使用详情页item内容;使用该用户历史购买/喜欢/点击商品的item内容的共现性质的协同过滤算法。
    原因:此处给出基于物品的推荐更好被用户理解(没有差别特别巨大的商品推荐出来)。
    为了解决冷启动问题:
    B)基于item内容的推荐
    1) 同二级分类下面的热门商品/最新鲜商品
    2) 基于搜索,标题丢进query检索,取top k结果,也可以使用类目做进一步的限制。
    3) 将来有更多的标签后,可以使用elasticsearch的more like this功能。
    C)过滤掉已经沟通过/喜欢过/展示过的数据

  5. 未来
    随着分享和晒单的数据增多,可以在“发现”tab引入基于用户维度的协同过滤推荐。
    “今日推荐”:根据user维度的协同过滤和热度综合。

整体架构

架构图

说明

  1. 离线系统负责算法的数据搜集,数据来源于2处
    1)mysql集群:如用户表,商品表,赞等等。
    2)消息队列:如用户准实时的点击,赞等交互行为日志。

  2. 在线使用elastic search提供服务
    我个人感觉的优点如下:
    1)复用搜索服务集群,开发效率稳定性比较有保证。
    2)通过搜索的方式召回,天然去除了热点带来的“马太效应”的问题。
    3)通过elastic search的多列,天然支持多列的boosting推荐。
    具体请参考这篇博客:http://occamsmachete.com/ml/2014/10/07/creating-a-unified-recommender-with-mahout-and-a-search-engine/

  3. 计算集群
    1)需要先搭建好spark和mahout
    2)本项目主要使用了其中的spark-itemsimilarity 算法,我们主要集中于数据实时全面的准备即可。
    详细请参考:https://mahout.apache.org/users/algorithms/intro-cooccurrence-spark.html

  4. 在线请求
    一个典型的query如下:
    {
    "query":{
    "query_string":{
    "query":"rec_buy^3:68827 OR rec_like^1: 68827 "
    }}
    }
    通过购买或者喜欢召回item相似的商品作为推荐list。并可根据业务调整不同的重要性,如这个query,我们认为购买行为比点赞行为更能反映用户的喜好。
    最终返回的结果list需要去除用户已经购买过或浏览过的商品集合。

上线效果

由于使用elastic search集群,在gc正常下,系统运行十分稳定
显著提升了用户的停留时间和gmv
在更全面更快速搜集好用户行为数据后,有希望进一步提升推荐的效果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容