0

我目前正在为我的 Rails 应用程序实施 Trending Topics。

我目前拥有的是这样的:

每篇文章都有topic2 到 3 个词的属性来描述其主题。

然后我根据他们的观看次数获得热门帖子(我也有喜欢和收藏,但暂时只使用简单的视图):

def trending_topics
  Post.order("COALESCE(impressions_count, 0) DESC").limit(200)
end

然后我所做的就是只选择独特的主题并显示其中的一些:

  <% trending_topics.select(:topic).map(&:topic).uniq.take(10).each do |topic| %>
      <li><%= topic %></li>
  <% end %>

我的问题是:

  1. 有没有办法让出现频率最高:topic、对它们进行排名并从中挑选出其中的精华?
  2. 这是跟踪热门话题的可持续方式吗?如果没有,有没有办法让它更有效率?
  3. 有没有更好的方法来实现搜索:topic帖子中最流行和最频繁的属性的功能?
4

2 回答 2

1

如果您需要比当前排名算法更复杂的东西,您可能应该看看reddithackernews等网站如何处理这个问题。它相当复杂,但如果你用谷歌搜索它,你应该能够在 Ruby 中找到每个算法的实现。

于 2014-02-17T16:49:07.923 回答
0

要回答您的问题:

(1) 是的,您可以像这样得到每个频率的哈希:topic

array = trending_topics.select(:topic).map(&:topic)
freq = array.inject(Hash.new(0)) { |h,v| h[v] += 1; h }
# => {'topic1'=>3, 'topic2'=>3, 'topic3'=>1, ...}

(2) 这是“可持续的”,因为它不会随着您介绍的帖子/主题数量的增加而增加(因为您仍在从前 200 个帖子中抽样,尽管获得“前 200 个”将需要随着帖子数量的增加,计算时间会稍微增加)。

(3) 我认为这impressions_count不是跟踪趋势的好方法,因为对我来说impressions_count有总印象数,而你想要它的一些时间方面(例如impressions_this_week)。

因此,一种方法是引入一个impressions_this_week定期更新的列。然后你可以根据它来选择。

另一种方法是编写一个方法,使用整体impressions_count以及时间戳created_atupdated_at计算帖子的“热度”。你可以用一个简单的衰减函数来做到这一点,然后调整该函数的常数,直到你得到你想要的衰减。此处显示了与此概念类似的内容:http: //blog.notdot.net/2009/12/Most-popular-metrics-in-App-Engine。编写完该方法后,您可以根据其输出进行排序。

于 2014-02-17T16:42:52.370 回答