分享i骚年网热文排序算法—SmartHot

合集下载

路径排序算法 path ranking algorithm pra 实例 例子 源代码

路径排序算法 path ranking algorithm pra 实例 例子 源代码

路径排序算法(Path Ranking Algorithm,简称PRA)是一种用于在有向图中对节点进行排序的算法。

该算法基于节点的路径长度和节点之间的连接关系来对节点进行排序。

下面是一个简单的例子和对应的Python源代码实现。

假设有一个有向图,节点表示公司,边表示合作关系,节点A指向节点B表示公司A雇佣了公司B。

我们希望根据节点的合作关系和节点之间的路径长度对节点进行排序。

首先,我们需要定义一个类来表示有向图中的节点。

该类包含节点的名称、邻居节点和指向邻居节点的指针。

pythonclass Node:def __init__(self, name): = nameself.neighbors = []接下来,我们定义一个类来表示有向图。

该类包含节点列表和边列表。

pythonclass DirectedGraph:def __init__(self):self.nodes = []self.edges = []现在,我们可以实现路径排序算法。

该算法的基本思路是:从根节点开始,沿着路径向叶子节点方向遍历,同时计算每个节点的权重,最终按照权重对节点进行排序。

pythondef path_ranking_algorithm(graph, root):# 初始化节点权重为无穷大node_weights = {node: float('inf') for node in graph.nodes}node_weights[root] = 0# 遍历每个节点,更新权重for node in graph.nodes:for neighbor in node.neighbors:# 计算路径长度和权重path_length = node_weights[node] + 1weight = node_weights[node] + len(neighbor.neighbors) + 1e-5 # 加一个小的常数避免除以零错误# 更新权重node_weights[neighbor] = min(node_weights[neighbor], weight)# 对节点按照权重进行排序sorted_nodes = sorted(graph.nodes, key=lambda node: node_weights[node])return sorted_nodes最后,我们可以使用以下代码来测试路径排序算法:pythonif __name__ == '__main__':# 创建有向图和节点graph = DirectedGraph()A = Node('A')B = Node('B')C = Node('C')D = Node('D')E = Node('E')F = Node('F')G = Node('G')H = Node('H')I = Node('I')J = Node('J')K = Node('K')L = Node('L')M = Node('M')N = Node('N')O = Node('O')P = Node('P')Q = Node('Q')R = Node('R')S = Node('S')T = Node('T')U = Node('U')V = Node('V')W = Node('W')X = Node('X')Y = Node('Y')Z = Node('Z')graph.nodes.extend([A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z])A.neighbors.append(B) # A -> BA.neighbors.append(C) # A -> CB.neighbors.append(D) # B -> DB.neighbors.append(E) # B -> EC.neighbors.append(F) # C -> FC.neighbors.append(G) # C -> GD.neighbors.append(H) # D -> HD.neighbors.append(I) # D -> IE.neighbors.append(J) # E -> JE.neighbors.append(K) # E -> KF.neighbors.append(L) # F -> LF.neighbors.append(M) # F -> MG.neighbors.append(N) # G -> N G.neighbors.append(O) # G ->。

搜索排序算法

搜索排序算法

搜索排序算法排序模型LTR(L2R,learning to rank)Pointwise:对排序列表中的每⼀项,直接学习⼀个值,⽐如可以是预估点击率(Predict CTR,pCTR),然后按照预估值从⼤到⼩排序即可。

常见模型有LR、FFM、GBDT、XGBoost。

GBDT是LTR中应⽤较多的⾮线性模型。

Additive Groves(简称AG)是在随机森林基础上构建的模型,加⼊Bagging算法,使得模型的泛化能⼒更强。

AG由很多Grove 组合(bagging)⽽成,每⼀个Grove由多棵树组成,在训练时每棵树的拟合⽬标是真实值与其它树预测结果之和的残差。

在训练的过程中达到了指定数⽬的树时,重新训练的树会替代掉以前的树。

⾕歌提出的FTRL⽅法能够在线对线性模型进⾏更新。

Pairwise:两两学习两个项的先后关系。

常见模型有GBRank、RankNet、LambdaMart、RankSVM。

LambdaMart是Lambda和MART(Multiple Additive Regression Tree,GBDT的别名)的结合,是GBDT的⼀种针对排序问题的改进。

在计算梯度时LambdaMart重新计算了Lambda,重新赋予了排序梯度的物理意义,它利⽤sigmoid来计算各pair的排序概率,使⽤交叉熵作为损失函数来判断拟合程度,并将排序离线指标(如MAP、NDCG)考虑到梯度中去。

Listwise:将列表的最佳排序当作最终的优化⽬标,通过预测分布和真实排序分布的差距来优化模型,典型的模型如ListNet。

引⼊规范化带折扣的累计收益(Normalized Discounted Cumulative Gain,NDCG)作为衡量列表排序质量的指标,以保证排序效果达到列表级别的最优。

Pairwise模型是指所有⽂档两两组成⼀个pair,⽐如(X1,X2),如果X1的分值⼤于X2则将该pair当作正例+1,否则为负例-1. Pairwise的效果通常好于Pointwise(学术界是如此,⼯业界也越来越多⽤Pairwise了)。

Reddit的评论排序新算法

Reddit的评论排序新算法

Reddit的评论排序新算法# Voldemort投递:这篇翻译自Redditblog,除了投稿之外我更希望煎蛋能够采用这个算法。

解决长久以来文章置顶评论基本上被前十楼占领的问题。

Reddit置顶评论的质量可以说是我见过的网站中最高的,原因就在于Reddit的帖子和评论的排序算法一直以来都是业界领先。

这个算法是xkcd的作者Randall神牛推荐给Reddit的,我的观察是效果相当出众。

其实算法极其简单,就是把原来排序的公式(JavaScript为例)score = oo - xx;改成一个稍微复杂点的公式n = oo + xx;if (n==0) {score = 0;}else {z = 1.96;phat = oo / n;score = (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n);}嗨!我是xkcd的作者Randall,今天来为大家解释下Reddit的新的评论排序系统。

这个系统是我当时极力推荐的。

一般呢,我会给我的博客文章配些手绘图,但是今天这篇文章内容没什么图可配,所以可能会混进些乱七八糟的东西,你们凑合看吧~Reddit现在采用了一个新的算法:“Best”排序(之前有Top/Hot/New/Controversial/Old)。

注意这个算法仅仅用在评论排序中,没有用在文章排序中。

Davean(xkcd系统管理员)之前写过一个补丁,试用了这个新算法大概一周。

今天早上,它正式成为了我们评论区的默认排序方法。

本人认为这个算法相当给力。

其实大多数人都不会注意到有什么变化,它并不影响评论层级等其它东西,但是会极大改善置顶(最高oo)评论的质量。

算法的具体细节可以猛击这篇来自Evan Miller的文章。

作者认为常见的根据投票来排序的体系都存在各自的问题,他解释了算法的具体细节并给出了例子。

如果你想看看新系统在Reddit中运用的实战效果可以直达本文最后附上的截图。

基于用户投票的排名算法:牛顿冷却定律

基于用户投票的排名算法:牛顿冷却定律

基于用户投票的排名算法:牛顿冷却定律这个系列的前三篇,介绍了Hacker News,Reddit 和Stack Overflow 的排名算法。

今天,讨论一个更一般的数学模型。

这个系列的每篇文章,都是可以分开读的。

但是,为了保证所有人都在同一页上,我再说一下,到目前为止,我们用不同方法,企图解决的都是同一个问题:根据用户的投票,决定最近一段时间内的"热文排名"。

你可能会觉得,这是一个全新的课题,伴随着互联网而产生,需要全新的方法来解决。

但是,实际上不是。

我们可以把"热文排名"想象成一个"自然冷却"的过程:(1)任一时刻,网站中所有的文章,都有一个"当前温度",温度最高的文章就排在第一位。

(2)如果一个用户对某篇文章投了赞成票,该文章的温度就上升一度。

(3)随着时间流逝,所有文章的温度都逐渐"冷却"。

这样假设的意义,在于我们可以照搬物理学的冷却定律,使用现成的公式,建立"温度"与"时间"之间的函数关系,轻松构建一个"指数式衰减"(Exponential decay)的过程。

伟大的物理学家牛顿,早在17 世纪就提出了温度冷却的数学公式,被后人称作"牛顿冷却定律"(Newton's Law of Cooling)。

我们就用这个定律构建排名算法。

"牛顿冷却定律"非常简单,用一句话就可以概况:物体的冷却速度,与其当前温度与室温之间的温差成正比。

写成数学公式就是:其中,- T (t)是温度(T)的时间(t)函数。

微积分知识告诉我们,温度变化(冷却)的速率就是温度函数的导数T'(t)。

- H 代表室温,T(t)-H就是当前温度与室温之间的温差。

由于当前温度高于室温,所以这是一个正值。

- 常数α(α>0)表示室温与降温速率之间的比例关系。

一种基于样本加权的位置文本排序算法

一种基于样本加权的位置文本排序算法
务 面临 的挑 战性课 题 。但是 , 独立搜 索引擎存 在着
员 搜索 引擎所 返 回的结果 进行收 集 , 按照一定 然后 的准则 排序 , 终将 排序结 果按一 定顺 序展现 给用 最 户的过 程 。虽 然成 员 搜 索引 擎 的检 索 结 果各 式各
冗余 信息过 载 和索引 数据库 信息覆 盖率低 的 问题 , 不 能提供 大规模 的信 息搜索 , 只有联 合使用 多个搜 索 引擎才 能够满 足用 户需求 。在这种 情况下 , 元搜
索 引擎 系统 应 运 而生 。元 搜 索 引擎 建 立在 多 个 独
样但归纳起来主要由标题 、 摘要和相关度等信息组 成 。因此 , 索引擎 排 序可 以在 成员搜 索引擎排 元搜 序的基础上 , 结合结果的标题、 摘要等信息考虑。 () 1 简单排 序算 法
这 种排序 的方 法 比较 单 一 , 仅 提 高 了 查 全 仅
文章编号
10 5 6 (O 0 O 0 7 0 0 0— 29 2 1 )5— 0 2— 4

种 基 于样 本 加 权 的位 置 文本 排序 算法
敖 飞 , 陈 梅
( 贵州大学 计算机科学与信息学 院, 贵州 贵阳 5 0 2 5 05)

要: 为有 效解 决元搜 索 引擎结 果排 序 的 问题 , 出 了一 种基 于样 本加 权 的位 置文 本排 序 算 提
・ 讯作者 : 通 敖 飞 ,m i:ya18 1@ 16 Cl. E alf _o9 50 2 . O1 l l
第 5期

飞 等 : 种基 于样本加权的位置文本排序算法 一
・ 3・ 7
度, 需要将 查 询 串 q中每个 词 条 t m 与摘 要 a的 e r

搜索排序算法

搜索排序算法

搜索排序算法
算法框架
典型的搜索排序算法框架如下图所示,分为线下训练和线上排序两个部分。

模型包括相关性模型、时效性模型、个性化模型和点击模型等。

特征包括Query特征、Doc特征、User特征和Query-Doc匹配特征等。

日志包括展现日志、点击日志和Query日志。

特征选择
泛特征
Query特征:意图分类、关键词、词权重等。

Doc特征:文章分类、长度、点赞数等。

User特征:年龄、性别等。

Query-Doc匹配特征:类别匹配、BM25。

点击特征:CTR、首次点击等。

日志设计
展现日志:理论上可根据经验进行人工标注打分,并且作为模型的启动训练数据。

点击日志:用户的点击行为日志,可以用于Query日志挖掘,进行查询扩展等,例如多个query搜索结果用户都点击了同一篇文档,则可认为这些query相似。

Query日志:用于和点击/转化数据做联合分析。

全排列算法解析(完整版)

由于本文的,内容比较多,所以希望读者根据自己的要求阅读,不要一次性读完,有些章节 可以分开读。第 1 节到第 5 节提供了全排列的概念和一个初始的算法。第 6 节到第 8 节主要 讲述了字典序的全排列算法。第 9 到第 10 节讲了有关字典序中中介数的概念。第 11 到第 12 节主要介绍了不同的中介数方法,仅供扩展用。第 13 节到 15 节介绍了邻位对换法的全 排的有关知识。16 节讲了有关邻位对换法的中介数,仅供参考。第 17 节讲了组合数生成的 算法。 1.全排列的定义和公式: 从 n 个数中选取 m(m<=n)个数按照一定的顺序进行排成一个列,叫作从 n 个元素中取 m 个元素的一个排列。由排列的定义,显然不同的顺序是一个不同的排列。从 n 个元素中取 m 个元素的所有排列的个数,称为排列数。从 n 个元素取出 n 个元素的一个排列,称为一个全 排列。全排列的排列数公式为 n!,通过乘法原理可以得到。 2.时间复杂度: n 个数(字符、对象)的全排列一共有 n!种,所以全排列算法至少时 O(n!)的。如果要对全 排列进行输出,那么输出的时间要 O(n*n!),因为每一个排列都有 n 个数据。所以实际上, 全排列算法对大型的数据是无法处理的,而一般情况下也不会要求我们去遍历一个大型数据 的全排列。 3.列出全排列的初始思想:
void Permutation(int A[], int m, int n) {
int i, int temp; if(m = = n)
{ for(i = 0;i<n;i++) { if(i != n-1) printf("%d ",A[i]); //有加空格 else printf("%d" A[i]); //没加空格 } //直接输出,因为前 n-1 个数已经确定,递归到只有 1 个数。 printf("\n"); return;

Reddit的评论排序新算法

Reddi‎t的评论排‎序新算法# Volde‎m ort投‎递:这篇翻译自‎R eddi‎t blog‎,除了投稿之‎外我更希望‎煎蛋能够采‎用这个算法‎。

解决长久以‎来文章置顶‎评论基本上‎被前十楼占‎领的问题。

Reddi‎t置顶评论‎的质量可以‎说是我见过‎的网站中最‎高的,原因就在于‎R eddi‎t的帖子和‎评论的排序‎算法一直以‎来都是业界‎领先。

这个算法是‎x kcd的‎作者Ran‎d all神‎牛推荐给R‎e ddit‎的,我的观察是‎效果相当出‎众。

其实算法极‎其简单,就是把原来‎排序的公式‎(JavaS‎c ript‎为例)score‎= oo - xx;改成一个稍‎微复杂点的‎公式n = oo + xx;if (n==0) {score‎= 0;}else {z = 1.96;phat = oo / n;score‎= (phat + z*z/(2*n) - z * Math.sqrt((phat*(1-phat)+z*z/(4*n))/n))/(1+z*z/n);}嗨!我是xkc‎d的作者R‎a ndal‎l,今天来为大‎家解释下R‎e ddit‎的新的评论‎排序系统。

这个系统是‎我当时极力‎推荐的。

一般呢,我会给我的‎博客文章配‎些手绘图,但是今天这‎篇文章内容‎没什么图可‎配,所以可能会‎混进些乱七‎八糟的东西‎,你们凑合看‎吧~Reddi‎t现在采用‎了一个新的‎算法:“Best”排序(之前有To‎p/Hot/New/Contr‎o vers‎i al/Old)。

注意这个算‎法仅仅用在‎评论排序中‎,没有用在文‎章排序中。

Davea‎n(xkcd系‎统管理员)之前写过一‎个补丁,试用了这个‎新算法大概‎一周。

今天早上,它正式成为‎了我们评论‎区的默认排‎序方法。

本人认为这‎个算法相当‎给力。

其实大多数‎人都不会注‎意到有什么‎变化,它并不影响‎评论层级等‎其它东西,但是会极大‎改善置顶(最高oo)评论的质量‎。

排序


使用幂法求PageRank
初始每个网页的 PageRank值均为1 , 即 X t= ( 1 , 1 , 1 ) 。
N-Step-PageRank算法
在经典PageRank算法中, 当冲浪者选择下一步要浏览的网
页时, 只知道当前网页的一步链接信息, 以均匀的概率在当 前网页的超链接指向的网页中选择下一个进行浏览。但是
PageRank简单计算
假设一个由只有4个页面组成的集合:A,B,C和D。如果所有页面都 只链向A,那么A的PR(PageRank)值将是B,C及D的和。
续假设B也有链接到C,并且D也有链接到包括A的3个页面。一个 页面不能投票2次。所以B给每个页面半票。以同样的逻辑,D投出的 票只有三分之一算到了A的PageRank上。
PageRank算法
如果网页T存在一个指向网页A的连接,则表明T的所有 者认为A比较重要,从而把T的一部分重要性得分赋予A。这 个重要性得分值为:PR(T)/L(T) 其中PR(T)为T的PageRank值,L(T)为T的出链数
则A的PageRank值为一系列类似于T的页面重要性得
分值的累加。 即一个页面的得票数由所有链向它的页面的重要性来决 定,到一个页面的超链接相当于对该页投一票。
以2-step PageRank为例, 当冲浪者在浏览网页a, 他/她 可以
“看两步” , 也就是说他/她 还知道网页b、c、d一步的链接情 况, 那么网页b、c、d 被选择的概率与它们各自的出度成正比,
即pab =4/9, pac=3/9, pad =2/9.
页相同的重要性得分,通过迭代递归计算来更新每个页面节
点的PageRank得分,直到得分稳定为止。
PageRank算法
PageRank的计算充分利用了两个假设:数量假设和质量假设。步骤如下: 1)在初始阶段:网页通过链接关系构建起Web图,每个页面设置相同的 PageRank值,通过若干轮的计算,会得到每个页面所获得的最终PageRank

基于用户投票的六大排名算法研究

基于用户投票的六大排名算法研究收藏到:0时间:2013-12-28 文章来源:马海祥博客访问次数:281随着互联网的发展,网站的数量也在随着成倍的增加着,就中国的互联网来说,根据中国互联网信息中心的数据显示,目前中国的网站数量每半年都会以接近10%的数量增长。

这些大量的网站涌现,也就意味着我们已进入了“信息大爆炸”的时代。

而如今用户担心的已不再是信息太少,而是信息太多。

如何从大量信息之中,快速有效地找出最重要的内容,成了互联网的一大核心问题。

所以各种各样的排名算法,已成为目前过滤信息的主要手段之一,尤其是搜索引擎的排名。

在对信息进行排名的同时,也就意味着将信息按照重要性依次排列,并且及时进行更新。

排列的依据,可以基于信息本身的特征,也可以基于用户的投票,即让用户决定,什么样的信息可以排在第一位。

下面,我将借助马海祥博客的平台整理和分析一些基于用户投票的排名算法,跟大家共同分享一下:一、Delicious和Hacker News排名算法1、Delicious排名算法Delicious是提供了一种简单共享网页的方法,它为无数互联网用户提供共享及分类他们喜欢的网页书签。

对于最初的信息排名来说,最直觉、最简单的算法,莫过于按照单位时间内用户的投票数进行排名。

得票最多的项目,自然就排在第一位。

旧版的Delicious,有一个“热门书签排行榜”,就是这样统计出来的,如下图所示:它按照“过去60分钟内被收藏的次数”进行排名。

每过60分钟,就统计一次。

Delicious算法的优点是:比较简单、容易部署、内容更新相当快;Delicious算法的缺点是:一方面,排名变化不够平滑,前一个小时还排名靠前的内容,往往第二个小时就一落千丈,另一方面,缺乏自动淘汰旧项目的机制,某些热门内容可能会长期占据排行榜前列。

2、Hacker News排名算法Hacker News是一个网络社区,可以张贴链接,或者讨论某个主题,如下图所示:每个帖子前面有一个向上的三角形,如果你觉得这个内容很好,就点击一下,投上一票。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分享i骚年网热文排序算法—SmartHot就像Google不会公布其搜索排名算法一样,大多数公司都不会对外公布涉及排名的算法。

因为这个算法一旦公布,总会有人去做SPAM。

同理,i骚年网的热文排序算法也不会对外公布,我们只是向用户提供一些基本的原则。

这一算法被我们命名为SmartHot,是在2009年底i骚年网改版时设计的,到现在已有一年多时间。

这期间我们对算法进行了数次改进和调整,也正因如此,才使得我有机会可以将当时的一些设计思路拿出来与大家分享。

希望通过对这一算法的产生过程的介绍,给更多的网站、程序设计人员一些启发,同样也希望大家踊跃拍砖,共同学习、共同进步。

i骚年网是一个以博客内容聚合为基础的阅读社区,像其他内容聚合网站一样,由于存在海量的内容,因此对内容的提炼尤为重要。

在改版之前,我们一直通过人工方式推荐内容,但人工方式有两个缺陷:一个是人力成本过高,另一个是推荐出的内容往往是编辑喜欢而用户不一定喜欢的。

这次改版,我们希望采用众包的方式,让用户为用户推荐内容,从而节约团队的人力成本,同时也能够真正把用户喜欢的内容推荐出来,使用户的互动更加活跃。

这个推荐列表就是后来的i骚年网热文。

从访问统计来看,热文页的PV也远远高于其他页面。

而热文的幕后,就是靠这套SmartHot算法支撑的。

在提出要研制一套文章排序算法之前,我们先是对这次改版进行了一个规划,整个规划有一个中心思想,那就是让更多的用户参与到网站中来,通过用户的参与提高网站内容的质量,然后再把高质量的内容反馈给用户。

SmartHot要为这一中心思想服务。

后来的实践证明,在这套算法的支撑下,i骚年网实现了飞速的发展,最终带来的主要影响有三:一是更多用户参与到社区的活动中来,二是内容质量大幅提升,三是节约了大量的人力成本而且带来了比人工更好的效果。

在这一中心思想的指导下整个团队开始了对热文排序算法的思考。

提出问题首先,以用户行为为推荐的基础并不是说让用户去推荐,因为用户做太多贡献会使网站失去活力。

更加明智的做法应该是基于用户的各种单一操作,通过数据挖掘找出最值得推荐的文章。

这样就细化成了一个数据挖掘的问题—通过对用户行为数据的挖掘找到好的文章再推荐给全部的用户。

面对这样的问题,团队提出了很多种解决思路。

最简单、最常规的当然就是按照文章的浏览量来排序。

然而无数经历都证明了这不是一个合理的算法,浏览量的高低只能代表访问者被标题、图片等吸引的程度。

如果想要了解用户对文章的真实感受,就得用添柴数(i骚年网中用户通过为文章添柴来表达对其的喜爱)来排序。

但是,无论是浏览数还是添柴数,都是累计的数字,最终必然会因马太效应产生严重问题,使排在前面的文章永远排在前面,新文章无法进入前列。

这时,将二者结合的思路出现了。

我们把添柴数作为正向的参数,把浏览量作为反向的参数。

如果一篇文章被用户浏览了100次、添柴10次,那么就计为0.1分(10/100=0.1)。

这就意味着,浏览量越大,最终的排序分值越小!这是一个很具突破性的想法,因为我们知道很多同行都把浏览量作为正向参数给文章排序。

问题貌似解决了,但是新的问题也随之产生:大多数用户只看不操作,换句话说很多用户即便觉得文章很不错,也懒得去添柴,这样势必导致很多好的文章因为浏览量大反而失去排在前面的机会。

几番斟酌,我们最终决定放弃浏览量这个依据—文章得分以添柴数为基础。

在i骚年网中,对文章的其他操作如评论、分享等也类似于添柴,被赋予一定的分数计入文章的得分。

当然,单纯按得分来排序也是不合理的,这与直接用添柴数排序的结果是一样的。

为了保证用户喜欢的新文章能够永远排在用户同样喜欢的旧文章之前,我们必须要引入时间参数,由用户操作的得分和文章的发布时间共同决定文章的排序值。

添柴数(包括其他用户操作)作为正向的参数,文章发布时间作为反向的参数,最终得到的排序用的排序值与文章得分成正比、与发布时间成反比。

于是又一重要原则产生了—文章排序值随时间的前进而衰减。

分析到这里,团队里的每一个人都欣喜若狂:我们知道算法即将完成了。

但是一个尖锐的矛盾又把我们拉回现实:文章得分是非常容易作弊的。

一个人如果对一篇文章连续添柴,包括换用很多马甲连续添柴,都可以直接获得很多得分。

我们可以限制一名用户连续添柴的次数,可是我们无法限制一个用户注册马甲的数量。

于是,一个关于用户权重的参数—用户系数,出现了。

用户系数与等级相关,等级越高的用户权重越大,刚注册的用户权重极低。

基本思路产生后,问题也就很明确了,接下来就是根据这些问题确定各个目标,然后解决问题。

确定目标根据前面的分析,可以确定如下目标。

1. 为每种用户操作设定其固有的分值。

2. 设定一个时间衰减的速率。

3. 确立一个用户系数模型,使用户的权重随等级变化而变化。

4. 设计一个用户等级体系。

解决问题操作常量(A)i骚年网中用户对文章的操作包括添柴、泼水(添柴的逆操作)、分享和评论等。

添柴、泼水是对文章最简单、最直接的表态:喜欢就添柴,不喜欢就泼水。

其他的操作所对应的分数应该参考这两项操作。

因此将添柴常量定为:1,泼水常量定为-1。

A添柴=1A泼水=-1分享也是对文章的肯定。

如果一个用户给一篇文章添柴,说明他喜欢这篇文章;如果用户分享这篇文章,说明他不仅喜欢这篇文章,还希望其他人也来看这篇文章。

两者比较,分享是比添柴更为强烈的行为。

因此分享应当比添柴得到更多的分,这里将其设定为1.2。

A分享=1.2评论则是一个双面性的操作。

用户可能为赞同某一篇文章而对其评论,也可能是由于非常反对文章中的观点而进行评论。

经过反复思考和研究,我们发现当一个用户对某一篇文章持反对意见而评论时,其实这篇文章是更值得推荐的,因为往往这类文章是那种容易引起争议的或者干脆就是那些最容易被炒火的内容。

从这个角度上看,无论是正面还是负面的评论,这篇文章都应该被推荐,而且应该比添柴、分享有更高的推荐度。

所以我们将评论的操作常量定为1.5。

A评论=1.5时间衰减率(T)时间衰减率的核心问题就是让文章在多长的时间内衰减多大的比例。

一般来说,我们都希望网站上排在前面的内容是新的、热点的。

但是这个“新”可以是一个小时以内,也可以是一天以内、一周以内。

“新”应该视具体情况而定。

访问i骚年网的人通常是每天来看看有什么新鲜的内容,因此按天来衰减对于i骚年网来说是比较合理的。

以t0表示文章的发布时间,t1表示当前时间,T应该是(t1-t0)的函数,即:T=f(t1-t0),其中t0和t1以天为单位。

我们在参考了某网站的Digg版之后发现,即使是排在第一的文章,推荐数也很难超过100;推荐数最多也是100多,极少数的会在200以上,大部分在50~99之间。

根据i骚年网的文章量和用户量,我们推测文章的得分将很难超过100。

我们列举了一组数据:当t 1 - t 0=0 ,1 ,2 ,3,4,5,6,7,文章得分(D)=10,20,30,40,50,60,70,80,90,100时,应该设计何种排序方式?①同一天的文章t相等,所以D越大排名越靠前。

②同样的D,t1-t0越小排名越靠前。

③昨天的文章100分,今天的文章10分,20分,30分,40分,这个100分的文章应该还是排在前面。

④7天前的文章100分,今天的文章10分,20分,30分,40分,这个100分的文章应该排在中间。

①和②是最基本的原则,很好理解。

③和④要解决的是前一个或前N个时间周期的超级热门和今天的一般热门是怎样的先后位置。

那么我们大胆设想了两个函数:[1][2]将(t1-t0)=0,1,2,3,4,5,6,7分别代入以上两式,得:T = +,1 ,1/2 ,1/3 ,1/4 ,1/5 ,1/6 [3]图1 时间衰减率函数的模型图T = +,1 ,1/4 ,1/9 ,1/16 ,1/25 ,1/36 [4]以上两列结果显然[3]更合理,[4]让以前的超级热门也没有任何机会,是不合理的。

经过优化,我们需要把正无穷的结果剔除,最终得出:T =1/(t1− t0 +1)用户系数(u)关于用户系数u的确定,我们首先确定了下面几个原则。

·新注册用户没有话语权。

·用户话语权衡量标准是用户等级(G)。

·新注册用户需要跨过一个很高的门槛才能拥有话语权。

但是一旦越过这个门槛,话语权就应该有一个迅速的提升。

就是说,当某个用户不再是新注册用户之后,话语权就应该和大家差不多。

有话语权的用户之间比较,u不能相差太大,不然不利于保护新手。

总不能让人家新手们添几十次柴还不如老手添一下柴吧!随着等级提升,用户系数u的提升应该越来越慢,并且应该有个极限值,不至于让高等级用户太占便宜,这也是为了保证公平性。

根据上面的原则,我们可以看出,用户系数是一个关于等级的函数,这个函数模型应该如图2所示。

图2 用户系数函数的模型图在图2中,当用户等级G=1时,u=0;当G趋进于正无穷时,u=1。

这样的话,u就永远处于0和1之间,即0 1。

于是老用户能比新用户占便宜,但也占不到太多。

这条曲线还有一个重要点,就是当G离开1变为2时,u应该猛增;而当G从大数再增大时(如从1 0 变为11),u 的增量应该极小。

由上面的模型,我们设计了如下公式:u =1−1/(2G −1)。

用户等级(G)等级的具体计算公式与SmartHot算法关系不大,这里不展开说明,只谈谈我们对等级的特殊处理。

最初在没有考虑SmartHot算法的时候,我们希望为用户的每一步操作奖励一定的经验,经验达到某个阈值就升级。

但是,由于用户等级关系到文章的排序,需要在最初想法的基础上加入一些限制以防止作弊。

对等级的作弊其实很好理解。

比如在一般的RPG网游中,玩家可以通过不停地刷怪获得经验以达到升级的目的,放在i骚年网中就是可以通过不停地分享文章来达到同样的效果。

当用户可以很容易地升级时,作弊者就可以通过注册N个马甲随意地控制热文了。

因此在这里我们做出了一定的限制:在用户操作某一篇文章后的一分钟内,再次进行文章操作(即使是对不同的文章)不能获得经验。

这样一来,用户每小时、每天能够得到的经验都是有限的,有效地避免了刷经验、刷等级。

算法确定解决了以上问题,完整的SmartHot算法已经出来了:Q = D * TT = 1 /(t1 - t0 + 1 )(t1,t0单位为天)D = D1 + D2 + D3 +... + DnDn = A * uu = 1 -(1 /(2^G -1))其中:Q——文章排序的最终依据D——文章总得分G——用户等级A——操作常量u——用户系数T——时间衰减率t0——文章发布时间t1——当前时间一点特殊处理:前面曾经提到过,同一用户对同一篇文章的添柴只允许进行一次,但是我们不能按同样办法限制用户对同一文章的评论次数。

相关文档
最新文档