[关闭]
@yanglfyangl 2018-07-02T05:07:22.000000Z 字数 3818 阅读 1565

机器学习与社交推荐(草稿)

参考:

“用户画像”从生产到应用,背后的标签逻辑是什么?
深解京东个性化推荐系统演进史
精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么?
信息流推荐之EdgeRank
各大推荐引擎 整理
推荐引擎实践--策略篇.pdf
使用 Neo4j 来构建实时的推荐引擎
流动的推荐系统——兴趣Feed技术架构与实现
36氪首发 | 今日头条推荐算法原理全文详解

推荐的几种方式:

  • 规则定义型
  • 统计分析型
  • 学习预测型

常见的打标签方式:
此处输入图片的描述

常见的推荐方式:
此处输入图片的描述

标签分类方式

固有属性:

是指这些指标的赋值体现的是用户生而有之或者事实存在的,不以外界条件或者自身认知的改变而改变的属性。比如:性别、年龄、是否生育等。

用户类:

  • 用户信息
  • 地址信息
  • 学校信息
  • 职业信息
  • ...

圈子类:

  • ...

帖子类:

  • ...

朋友圈类:

  • ...

活动类:

  • ...

推导属性:

由其他属性推导而来的属性,比如星座,我们可以通过用户的生日推导,比如用户的品类偏好,则可以通过日常购买来推导。

  • 由好友关系推导
  • 由加入的圈子所在的属性推导出来
  • 由加入群所在的属性推导出来
  • ...

行为属性:

产品内外实际发生的行为被记录后形成的赋值,比如用户的登陆时间,页面停留时长等。

  • 登录时间,在线时间。
  • 点赞朋友圈或帖子推导出来。
  • 由加入群所在的属性推导出来。
  • 参加的活动推导出来。
  • ...

态度属性:

用户自我表达的态度和意愿。比如说我们通过一份问卷向用户询问一些问题,并形成标签,如询问用户:是否愿意结婚,是否喜欢某个品牌等。当然在大数据的需求背景下,利用问卷收集用户标签的方法效率显得过低,更多的是利用产品中相关的模块做了用户态度信息收集。

  • 根据商品评价推导出来。
  • 根据热点评价推导出来。
  • ...

测试属性:

测试属性是指来自用户的态度表达,但并不是用户直接表达的内容,而是通过分析用户的表达,结构化处理后,得出的测试结论。比如,用户填答了一系列的态度问卷,推导出用户的价值观类型等。

  • 各种调查问卷的结果得出来。
  • ...

几种属性如何组合呢?

主要方式

此处输入图片的描述

千人一面

  • 收集用户信息为重点,一切行为均不能遗漏。
  • 围绕每个人建立一套粗略喜好标签模型。
  • 一定要快,因为用户随时可能离开,给出有兴趣的推荐,对用户留存很好。

千人十面

  • 我们首先要做的就是将用户分组,将有相似喜好的用户找到。(可以用余弦计算方式)
  • 这时候再进来的用户,我们也就可以相应的放在疑似库里了,等到收集到相应的新用户行为,也就能确定这个新用户的相关喜好方向了,成本会减小很

千人百面

  • 需要设定动作权重系数,例如:有效打开=5, 分享=4, 收藏=3, 互动=2 , 其它跳转=1, 无效打开=-2 , 点×=-5。

千人千面

  • 前面收集了所有的数据
  • 要使用协同过滤矩阵及拆解来解决问题

我们的重点

社交的重点是:人、关系、内容、互动; 它们之前的桥梁是推荐算法。**

  1. 画像帮我们找到人;
  2. 人圈群推荐帮我们找到关系;
  3. 爬虫和UGC帮我们找到内容;
  4. 推荐帮助用户降低使用难度和提高平台的收益;
  5. 人工智能帮用户更好的互动;

分析重点(只列举几种)

  1. 圈子推荐
  2. 商品推荐

希望达到的功能举例:

  1. 我刚刚加入平台,什么都不太熟悉,平台可以根据我的
  2. 1. 爱好
  3. 2. 星座
  4. 3. 年纪
  5. 4. 平台上的好友
  6. 5. 看过的帖子
  7. 6. 聊过的天
  8. 7. 。。。
  9. 给我推荐一些合适的圈子出来。
  1. 我和朋友在钓鱼,天气很热,朋友聊到的时候,系统给我推荐一个太阳伞

我们能拿到的数据有

用户相关

  1. 用户信息: UserInfoDTO (姓名,性别,手机号,星座。。。)
  2. 用户好友列表: List<UserID>
  3. 用户访问记录 UserAccessDTO (什么时间,什么情况下,访问了什么模块。。。)
  4. 用户事件记录 UserEventDTO ( 在什么地方发了什么"比如帖子",评论了什么,喜欢了什么。。。)
  5. 用户聊天记录 (什么地方,和什么人聊,聊了什么内容。。。)

圈相关

  1. 圈信息: CircleInfoDTO (圈坐标,圈类型,圈主。。。)
  2. 圈用户列表: List<UserID>
  3. 圈事件记录 CircleEventDTO ( 什么时间,什么人,做了什么事,得到了什么)

群相关

  1. 群信息: CircleInfoDTO (群主,创建时间)
  2. 群用户列表: List<UserID>
  3. 群事件记录 CircleEventDTO ( 什么时间,什么人,做了什么事,得到了什么)

商品相关

  1. 商品信息: GoodsInfoDTO
  2. 购买商品用户列表: List<UserID>
  3. 购买事件记录 OrderEventDTO ( 什么时间,什么人,什么情况下,购买了什么商品)

推荐反馈

  1. 推荐信息: RecommendInfoDTO
  2. 给谁推荐过: List<UserID>
  3. 推荐后用户事件记录 RecommendEventDTO ( 推荐后的用户反馈是什么)

。。。

我们的逻辑是

产品思路基础
1. 人以类聚,物以群分;
2. 同场景下的推荐,以用户反应做为评价标准更有效些。
3. 虽然是用户为主,但需要给运营留下足够的空间。

技术思路基础
1. 以End-End为主导进行分层
2. 每层用机器学习算法解决
3. 将每层通过外部调用整合起来达到最终效果。
4. 适当的缓存,降低并发对系统产生的影响。(组合推荐一般比较慢)

标签不准如何解决

本质上推荐都是打标签为基础。如何解决标签不准造成的麻烦呢。

我们会分成两种标签

  • 用户自定义标签
  • 统计算法打标签
  • 机器学习算法打标签

用户自定义标签并不是指用户随意给打的标签,而是系统给一些标签的定义,由用户进行选择。当一些新用户或新圈子,新群没有标签的时候,通过聚类/分类算法给他们进行一定的聚类,聚类到已经有的分组上,并标记成“机器学习算法标签”。

排序如何工作

为什么要有排序,比如说:

我的好友喜欢了某个主题,在没有任何其它数据的情况下,可能系统会推荐我也喜欢这个主题;
但事实上是,也许我看了一下最上面的后,对它们不感兴趣,反而是最下面的某个我感兴趣。
这种情况下,最好的方式是对我感兴趣的部分进行一定的加权后,再进行推荐。

我们可以参考EdgeRank的思路进行推荐,大概流程如下

  • 推荐引擎先根据各种标签进行推荐。
  • 推荐结果放到zset中。
  • 根据用户历史喜好和用户点击,对结果进行排序。
  • 用户历史的对各种类目喜好信息存到图中。
  • 各种权重会有一定的规则提高或降低,比如:用户点击一次加5,每天对此类目不再关注则降低2。(这样可以让推荐更加人性化,将时间因素加进去)

大概的工作模式

  • 由规则引擎来进行调度。
  • 将准时实时全定义成“规则”函数
  • 用统计引擎来存储数据。
  • 用HanLP来做标签处理
  • 用mahout在dev环境下做离线计算
  • 线上环境待定(可自己搭建Spark集群,也可以使用华为云现有机器学习方案)

大概的规则流

准实时部分:

用户部分:

  1. if 新加用户 then
  2. 用户数据清洗;
  3. 用户基础数据标签提取 and 存入用户基础标签库 ;
  4. 新用户快速分类;
  5. if 用户更新 then
  6. 用户数据清洗
  7. 用户基础数据标签提取 and 存入用户基础标签库 ;
  8. 新用户快速分类;
  9. if 用户上传坐标 then
  10. 坐标清洗
  11. 用户位置标签提取 and 存入用户位置标签库 ;
  12. 新用户快速分类;
  13. if 加好友 then 存入本用户好友标签库 ;
  14. 。。。
  15. 。。。

帖子部分:

  1. if 新/改帖子 then
  2. 文本清洗
  3. 抽取关键字
  4. 存入“关键字_时间:[帖子]”列表 ;
  5. if 点赞 then
  6. 存入用户动作表; //用户动作表为离线分析做基础数据准备。
  7. if 评论 then
  8. 文本清洗
  9. 存入用户动作表 ;

朋友圈部分:

离线部分

  1. 建立各种规则库(用户画像,文本标签。。。)
  2. 全局重新预测,形成标签库后存入前端。
  3. 新词发现。
  4. 计算分类模型。
  5. 聚类发现新的标签。(与后管系统配合。。)
  6. ......

规则类似如下:

  1. if 新数据量 > 1000 then
  2. 清洗新数据
  3. 重新预测
  4. 存入用户/帖子标签
  5. 。。。

如果快速拉取推荐

例如推荐好友

推荐库中存的数据有如下的内容

  1. UserTag_MyTag_UserID:[淘宝达人]
  2. UserTag_"淘宝达人"_Date_"0629":[userID1:score, userID2:score, userID3:score]
  3. UserTag_"淘宝达人"_Date_"0628":[userID1:score, userID2:score, userID3:score]
  4. 。。。
  5. UserTag_"天蝎"_Date_"0629":[userID1:score, userID2:score, userID3:score]
  6. UserTag_"天蝎"_Date_"0628":[userID1:score, userID2:score, userID3:score]
  7. 。。。

基于此,推荐的召回方式如下

  1. // 随机种子用于每次返回不同的数据,支持类似换一批的操作。
  2. List querySuggestByUser(String newUserID, String randomSeed){
  3. List myTagList = getMyTagbyUserID(newUserID);
  4. //逻辑如下:
  5. // 1. 先取今天的,再取最近三天的。
  6. // 2. 如果满足10条了,则停止。
  7. List timeList;
  8. timeList.add(0629);
  9. timeList.add(0628);
  10. timeList.add(0627);
  11. List suggestList;
  12. for() {
  13. suggestList.add(getUserListByTime(myTagList.get(i), timeList));
  14. }
  15. return reOrderBySeed(suggestList, randomSeed)
  16. }

这样,有新用户加入的时候,推荐可以比较快的给出。同时,如果是运营想推广的部分,通过权重的增加,也可以相对容易的实现。

例如推荐帖子

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注