我想知道如何计算上升词(有点类似于reddit的上升线程排序选项)。我所说的上升是指什么是变得流行。上升到顶端的速度最快。示例:
PS:-
、^
和v
只是单词的移动方式。此外,(a)
和(b)
不是单词的一部分。我只是用这种方式展示他们的独特性
上午10:00我有这个列表,在这个排名
1. Cool (a) -
2. Best -
3. Cool (b) -
4. Radical (a) -
5. Sweet (a) -
6. Sweet (b) -
7. Radical (b) -
然后在上午10:15(15分钟后),列表的顺序发生了变化。
1. Best ^
2. Cool (a) v
3. Radical (a) ^
4. Sweet (a) ^
5. Cool (b) v
6. Radical (b) ^
7. Sweet (b) v
然后在上午10:30(15分钟后),列表的顺序再次更改。
1. Best -
2. Radical (a) ^
3. Sweet (a) ^
4. Cool (a) v
5. Radical (b) ^
6. Sweet (b) ^
7. Cool (b) v
正如你所看到的,Cool
这个词作为一个整体显然是受欢迎程度的下降。目前我的算法(我觉得相当愚蠢,但我想不出其他方法)。
我现在的做法是:
- 对于列表中的每个单词,我计算它向上移动了多少个等级(
+ num
)或向下移动了多少(- num
),或者它是否没有移动0
。从技术上讲,这给了我一个费率。Ranks moved per 15 minutes
- 然后,如果同一个单词存在两次(比如单词
Cool
),那么我对速率进行平均 - 然后我把它从高到低排序,我就有了上升的单词
尽管我觉得这不是很好(甚至没有任何意义)。它当然也没有考虑任何历史数据,只考虑每15分钟接收一次的新数据。
我的问题是,我该如何计算出最上面的单词、最下面的单词以及中间的所有单词。
如果您想考虑历史数据,可以使用一些函数来减少旧更改的数据权重。这个函数可能是指数,它衰减得很快:
risingRate = 0
for i = 0:n
risingRate += e^(-i) * RankChange(curr - i)
end
return risingRate
此代码使用单词的n + 1
最后记录来计算其上升率。
每一步的系数为:
0: 1
1: 0.367879
2: 0.135335
3: 0.0497871
4: 0.0183156
5: 0.00673795
6: 0.00247875
7: 0.000911882
8: 0.000335463
9: 0.00012341
10: 4.53999e-05
这些系数为最近的系数分配更大的权重。这正是你可能想要的。
您可以使用e^(-alpha*i)
来调整衰减率。