【发布时间】:2012-01-25 12:21:28
【问题描述】:
我在 MongoDB 中有一组文档,其“描述”值大约是一条推文的大小。我需要从中生成一个热门话题列表。显然,这是一个已解决的问题,但如果不自己编写代码,我无法找到一个明确的答案/宝石来完成工作。
我在我的应用程序中使用 ruby 和 mongoid。
是否有任何红宝石可以帮助或处理这个问题?谢谢。
【问题讨论】:
标签: ruby-on-rails ruby mongodb mongoid trending
我在 MongoDB 中有一组文档,其“描述”值大约是一条推文的大小。我需要从中生成一个热门话题列表。显然,这是一个已解决的问题,但如果不自己编写代码,我无法找到一个明确的答案/宝石来完成工作。
我在我的应用程序中使用 ruby 和 mongoid。
是否有任何红宝石可以帮助或处理这个问题?谢谢。
【问题讨论】:
标签: ruby-on-rails ruby mongodb mongoid trending
快速搜索rubygems.org 表明您将不得不进行一些编程。这是一件好事,因为一般检测趋势的系统要么难以设置和调整,要么难以猜测是什么决定了应用程序中的“趋势”。
我将对您的应用程序做一些假设。
假设用户使用井号标签 (#) 对他们的推文进行自我分类。另外,让我们继续说这些哈希标签的排序计数将确定一个主题是否是趋势。
现在让我们谈谈计算机科学部分。鉴于我们上述假设,您将需要能够快速查询和排序一组主题标签,以找出趋势。
您正在使用 MongoDB 和 mongoid(带有 rails),因此最简单的方法是创建一个集合,其中包含包含使用计数的标记文档。在标签和计数上创建索引。
当有人发推文时,找出哈希标签是什么,在标签集合中查找它们并增加它们的计数。要找出趋势,请查询标签集合并按计数排序。这将为您提供所有时间趋势的哈希标签。
如果您想获得更具体的信息,而不是仅仅存储计数,存储计数按时间增量(周、日、小时等)细分,也许可以单独存储它们。您可以创建代表您的时间增量的文档而不是单个标签,并将所有标签及其计数存储在其中。
{
start: "start datetime",
end: "end datetime",
tags: {
awesome: 3,
cool: 2,
boring: 2
}
}
您也可以使用有上限的集合。希望有所帮助,所有这一切都取决于你想要做什么。你可以很疯狂地计算随着时间衰减等的趋势。你可以阅读 reddit 或黑客新闻的代码来很好地了解它是什么样的。
【讨论】:
我知道没有这样的 gem,但这里有一个你可以自己写的算法:
从文本中提取n-grams。由于文本很小(你说的推文大小)提取所有 n-gram,这里没有限制。
"I eat icecream" => {(I), (eat), (icecream), (I eat), (eat icecream), (I eat icecream)}
为每个文本的 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}
使用cosine similarity 作为向量上incremental clustering 算法的度量函数,也许在JRuby 上编写Weka 库
按人口规模对所有集群进行排序。最大集群中心的 n-gram 是您的热门话题。
【讨论】: