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的用户都是运营筛选出来的,所以这种情况相对不会太多。

另外用户的兴趣也是会变化的,所以基于关注行为判断用户当前的兴趣是一个相对可取的方法。

在于数据量比较少,运营顶得住的情况下,这是一个不错的策略。

当然也可以通过用户点赞和评论的行为,判断用户当前的兴趣。

当数据量上来之后,就可以改为通过协同过滤推荐计算用户当前感兴趣的内容。

问题

既然想出了一种判断用户当前兴趣的方法,那么是否狂推这些内容就行了?

看多了也就看厌了,所以还是想看到一些未知的。

那么现在的问题就是怎么配置已经感兴趣的内容与未知的内容。

配置内容

目前有两个来源:

  1. 运营筛选的。这些内容和用户都会被打tag。
  2. 算法计算的。目前是协同过滤推荐,目前来说只是为了丰富一下内容源。

基于用户的兴趣,运营筛选的内容可以分为动态的分为两类:

  1. 用户目前感兴趣的内容
  2. 未知内容

那么怎么控制比例呢?

拍脑袋,第一类80%,第二类20%。

然后根据用户的刷新的次数,依次衰减第一类的比例。

大致的思路就是这样。

5

怎么实现

逻辑比较复杂,怎么兼顾响应时间呢?

大致的实现思路如下:

根据用户的兴趣,将运营筛选的内容分为两类,放到redis中,

当有新的关注行为,也就是新的兴趣时,异步更新redis。

用户拉取热门内容时,

拉取redis中的内容,过滤掉已经关注的用户的内容,

根据时间权重随机选择。

如果内容太少,使用协同过滤推荐计算的内容补全。

最后shuffle一下,搞定。