思考热门发现Tab的内容配置
1
之前有篇文章是介绍如何山寨Instagram的热门发现Tab
其中留了一个坑,如何配置不同类型的数据。
近来跟PM讨论的比较多,所以记一下。
2
首先交代一下背景,
小项目、刚起步,
没有什么数据,直接通过data mining的方法不太合适,
所以运营人员会维护一个热门内容库,并且会对热门内容打tag,包括feed和user。
然后是对于发现页的定位,
帮助用户发现自己感兴趣的东西,引导用户关注这些内容。
3
第一个想法 —— 直接Random
直接对热门内容库随机选择,这个想法最直观,
而且毕竟是经过运营人员筛选出来的,质量通常相当的高。
简单、直接。
第二个想法 —— 以时间做为权重Random
这是一个很直观的优化,新feed感觉上应该更容易引起支持,特别是某些热门一时的话题。
可以简单这样来算:
private double calculateWeightByTime(Date date) {
double weight = 1.0;
double deltaDay = ((double)(System.currentTimeMillis() - date.getTime())) / 1000.0 / 60.0 / 60.0 / 24.0;
if (deltaDay < 99.0) {
weight = 100 - deltaDay;
}
return weight;
}
目前线上的算法就是这个,按照友盟的统计,在热门发现页40%左右的点击会进入feed终端页。
4
第三个想法
问题:
用户(我们)到底想看到什么内容?
感兴趣的呗。
什么是感兴趣的?
给用户一个列表,让其选择。
根据我们使用app的经历,这个方式比较不靠谱。
为什么?
因为很多时候并不知道自己喜欢什么,所以通常都是随便选几个。
那么现在的问题就是如何获取用户的兴趣。
判断用户的兴趣
因为目前有运营的支持,对于优质用户会对其打tag,那么我们可以这样理解用户的兴趣。
用户A关注了用户B,那么用户A的兴趣可以理解为用户B的tags。
这个逻辑总体来说是说的通的,除了礼貌性的互粉,但是身上有tag的用户都是运营筛选出来的,所以这种情况相对不会太多。
另外用户的兴趣也是会变化的,所以基于关注行为判断用户当前的兴趣是一个相对可取的方法。
在于数据量比较少,运营顶得住的情况下,这是一个不错的策略。
当然也可以通过用户点赞和评论的行为,判断用户当前的兴趣。
当数据量上来之后,就可以改为通过协同过滤推荐计算用户当前感兴趣的内容。
问题
既然想出了一种判断用户当前兴趣的方法,那么是否狂推这些内容就行了?
看多了也就看厌了,所以还是想看到一些未知的。
那么现在的问题就是怎么配置已经感兴趣的内容与未知的内容。
配置内容
目前有两个来源:
- 运营筛选的。这些内容和用户都会被打tag。
- 算法计算的。目前是协同过滤推荐,目前来说只是为了丰富一下内容源。
基于用户的兴趣,运营筛选的内容可以分为动态的分为两类:
- 用户目前感兴趣的内容
- 未知内容
那么怎么控制比例呢?
拍脑袋,第一类80%,第二类20%。
然后根据用户的刷新的次数,依次衰减第一类的比例。
大致的思路就是这样。
5
怎么实现
逻辑比较复杂,怎么兼顾响应时间呢?
大致的实现思路如下:
根据用户的兴趣,将运营筛选的内容分为两类,放到redis中,
当有新的关注行为,也就是新的兴趣时,异步更新redis。
用户拉取热门内容时,
拉取redis中的内容,过滤掉已经关注的用户的内容,
根据时间权重随机选择。
如果内容太少,使用协同过滤推荐计算的内容补全。
最后shuffle一下,搞定。