【问题标题】:Implementing Trending Topics实施热门话题
【发布时间】:2014-02-17 16:19:28
【问题描述】:

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

我目前拥有的是这样的:

每个帖子都有topic 属性,包含 2 到 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 属性?

【问题讨论】:

    标签: ruby-on-rails database activerecord ruby-on-rails-4 trending


    【解决方案1】:

    回答您的问题:

    (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。编写完该方法后,您可以根据其输出进行排序。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-07
        • 2015-03-08
        • 2015-09-10
        • 2012-01-25
        • 2013-05-24
        • 2017-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多