2

我在 MongoDB 中有一组文档,其“描述”值与推文的大小有关。我需要从中生成一个热门话题列表。显然这是一个已解决的问题,但如果不自己编写代码,我无法找到完成工作的明确答案/宝石。

我在我的应用程序中使用 ruby​​ 和 mongoid。

有没有红宝石可以帮助或处理这个问题?谢谢。

4

2 回答 2

6

我知道没有这样的宝石,但这里有一个你可以为自己编写的算法:

  1. 从文本中提取n-gram 。由于文本很小(你说的推文大小)提取所有 n-gram,这里没有限制。

    "I eat icecream" => {(I), (eat), (icecream), (I eat), (eat icecream), (I eat icecream)}

  2. 计算每个文本的 n-gram 的TF-IDF权重向量

    {(I):0.1, (eat):0.01, (icecream):0.2, (I eat):0.12, (eat icecream):0.001, (I eat icecream):0.00012}

  3. 使用余弦相似度作为向量上的增量聚类算法的度量函数,也许在JRuby上编写Weka

  4. 按人口规模对所有集群进行排序。最大集群中心的 n-gram 是您的热门话题。

于 2011-12-21T18:47:42.487 回答
3

快速搜索ruby ​​gems.org会发现您将不得不进行一些编程。这是一件好事,因为一般检测趋势的系统要么难以设置和调整,要么难以猜测是什么决定了应用程序中的“趋势”。

我将对您的应用程序做出一些假设。

假设用户使用井号标签 (#) 对他们的推文进行自我分类。此外,让我们继续说这些哈希标签的排序计数将确定一个主题是否是趋势。

现在让我们谈谈计算机科学部分。鉴于我们上面的假设,您将需要能够快速查询和排序一组主题标签,以找出趋势。

您正在使用 MongoDB 和 mongoid(使用 rails),因此最简单的方法是创建一个集合,其中包含包含其使用计数的标记文档。在标签和计数上创建索引。

当有人发推文时,找出哈希标签是什么,在标签集合中查找它们并增加它们的计数。要找出趋势,请查询标签集合并按计数排序。这将为您提供所有时间趋势的哈希标签。

如果您想获得更具体的信息,而不是仅仅存储计数,存储计数按时间增量(周、日、小时等)分解,也许将它们分开存储。您可以创建代表您的时间增量而不是单个标签的文档,并将所有标签及其计数存储在其中。

{
    start: "start datetime",
    end: "end datetime",
    tags: {
        awesome: 3,
        cool: 2,
        boring: 2
    }
}

您也可以使用上限集合。希望有所帮助,所有这一切都取决于你想要做什么。您可能会变得非常疯狂并计算随时间衰减的趋势,等等。您可以阅读 reddit 或黑客新闻代码以很好地了解那是什么样的。

于 2011-12-21T18:30:21.453 回答