对于项目,我需要根据特定对象上的事件对某些对象进行排名 . 但要排名的对象并不相同 .

一些背景:该应用程序是一个类似社交网络的文档管理系统 . 有很多用户可以上传/发布各种类型的“文档”(视频,外部文章 - 例如,在相关博客上找到的文章,在系统内写的文章等) . 但是,用户到用户的消息也应出现在Feed中,以及系统消息等 .

为了分解一点,让我们假设这三个对象应该出现在新闻提要中,按病毒性排序/排序,这是基于事件 .

  • 文件

  • 系统消息

  • 用户到用户或用户到组)消息

每个对象对排名很重要的一些参数:

  • 文件

  • 观看次数

  • 评论数量

  • 股数

  • 与文档的亲密关系(用户对其进行了评论,共享,等等)

  • 用户登记的标签的对应关系

  • 系统消息

  • 重要性等级(例如'Notice','Announcement')

  • 用户/群组消息

  • 对话中的参与程度

更难以理解,创建对象的日期以及发生事件的日期和相关性非常重要 . 再加上复杂性:几乎所有东西都是相对的;例如 . 将文档定义为“病毒式”所需的文档视图数量,因此使其显示在新闻Feed中取决于平均视图数量 . 同样适用于评论,但是对于评论,发布新评论之间的发布日期和时间也很重要....(哦,如果不清楚,排名总是相对于用户,而不是系统范围) .

我的第一个想法是为每个对象定义最大分数( Sm ),定义对象何时到达 Sm 并计算实际分数( Sa ) . IE浏览器 . 系统消息的 Sm 为100,用户/组消息80和文档的 Sm 为60.这意味着如果每个对象中的一个在完全相同的时间创建,并且没有其他参数(注释等)可用,系统消息将首先列出,用户消息将在下一个,最后,但并非最不重要的是,文档 .

所以对于每种类型的对象,我都在寻找一个如下公式:

S(a) = S(m) * {calculations here}

对于系统消息,我猜并不难,因为它只有两个影响 Sa (日期和重要性级别)的参数 . 所以它的得分公式看起来像( I 是数字导入级别):

S(a) = S(m) * I * (1 / (now() - date_posted())

我们假设通知将I = 10且公告I = 20,昨天发布的通知和2天前发布的公告的分数将是:

Notice:       S(a) = 100 * 10 * (1 / 1) = 1000
Announcement: S(a) = 100 * 20 * (1 / 2) = 1000

现在的文件,我真的打破了那个...

我有以下参数需要考虑:

V(o) = number of views
V(a) = average number of views
C(o) = total number of comments
C(a) = average number of comments on this type of object
C(u) = number of comments by the user
SH(o) = total number of shares of this object
SH(a) average number of views of this type of object
SH(u) = has the user shared the document (1 = no, 2 = yes)
T = number of enlisted tags

我找到了Facebook如何计算'virality' here的简化示例 . 他们使用以下公式:

Rank = Affinity * Weight * Decay

如果我将其转换为我的用例,亲和力将是上面列出的参数计算的结果,权重将是基于总观看次数和共享的得分 - 最大值改变除以平均值视图和共享的数量,并且衰减将是基于所触发的事件与创建对象的日期的相关性的复杂计算 .

我试试看:

Affinity = C(u) * SH(u) * T * SH(u)
Weight   = S(m) * (V(o) / V(a)) * (SH(o) / SH(a)) * (C(o) / C(a))
Decay    = (1 / (now() - date_created())) * (1 / (now() - date-of-last-comment())

这会给我一些排名,但它缺少一些东西:

  • 它与系统消息的排名没有任何关系,因此排序将毫无意义

  • 未考虑新评论的频率

所以现在我被卡住了......

为了达到目的,我的问题是:

  • 这是一个好方法,还是我应该尝试一些完全不同的东西?

  • 如果是这样,我应该去哪个方向?