1

我正在尝试对搜索查询日志进行一些研究。我的第一个兴趣是发现趋势。例如:冬天人们经常患唇疱疹。所以我想在冬天我们可以看到这种类型查询的增长。

我想如何检测趋势:

  1. 使用先验算法或其他东西来获得频繁项集。
  2. 计算时间范围内每组的数量(一小时,一天等)
  3. 如果这是回归 ax + b,则使用线性回归找到相对函数变化,然后我们只需计算 (a*(first_date)+b)/(a*(second_date)+b)

所以我有一个问题:很难在大量数据集上找到频繁项集(我有数百万个查询)。我已经实现了 apriory 算法,但它的工作速度很慢,支持率很低(例如 200k 查询中的 2 次可能需要一天时间)

在我的情况下,最好的算法是什么?也许我可以用另一种方式解决我的任务?

4

1 回答 1

0

这是一个将其缩小到仅计算请求时间范围内的字符串的方法,而不是整个集合。
将您的查询存储在排序的可扩展数据结构中 - 我认为跳过列表非常适合这里。
跳过列表中的查询顺序将按时间升序排列。
注意:将新查询添加到跳过列表很容易 - 您总是附加它,因为它总是“更大”然后(发生在所有现有查询之后)。

现在,当您需要搜索时间范围时 - 您不需要遍历所有查询,而是仅在它的相关部分上进行迭代,因为可以在跳过中快速找到时间范围的第一个和最后一个元素列表。

为了提高效率,我会使用双映射为每个字符串提供唯一的 ID,并且只存储 ID。从 ID 中创建直方图可能比为原始字符串创建直方图更容易(从计算上讲)。找到最常见的 ID 后 - 您可以从映射中推断出它们引用的字符串。

于 2012-06-08T08:25:52.820 回答