不同类型对象的病毒算法

时间:2014-04-11 10:21:27

标签: algorithm ranking

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

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

要稍微分解一下,让我们假设这三个对象应该出现在新闻提要中,按病毒性排序/排序,这取决于事件。

  • 文档
  • 系统消息
  • 用户对用户或用户到组)消息

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

  • 文档
    • 观看次数
    • 评论数量
    • 股数
    • 与文档的亲密关系(用户对其进行了评论,共享,等等)
    • 用户登记的标签的对应
  • 系统消息
    • 重要性级别(例如,'通知','公告')
  • 用户/群组讯息
    • 对话中的参与度

为了使其更难,创建对象的日期非常重要,以及发生事件的日期和相关性。再加上复杂性:几乎所有东西都是相对的;例如。文档的视图数量需要将其定义为“病毒”和“病毒”。因此,它出现在新闻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如何计算病毒性和病毒性。 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())

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

  • 它与系统消息的排名没有任何关系,因此排序将毫无意义
  • 新评论的频率未被考虑

所以现在我被困了......

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

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

0 个答案:

没有答案