给定大量数据,找到最常见的查询

Given a large amount of data, find the most common queries

问题:我有一个包含几列和数千万行的大型 CSV。其中一列有一个存储明文的查询变量。我需要在数据中找到最常见的查询,但因为这些是用户生成的查询,所以我需要像

这样的查询

help with installing [x product]

[x product] help installing

出于 summary/reporting 的缘故,参与同一查询。

我已经对所有常用词和其他JSON换行等数据进行了修剪

您可以假设每行的值仅包含对用户查询的重要词,并且我需要检索最常见的查询。

我知道不可能为这样的高级问题提供代码,但我希望能指出正确的方向 - 如果只是在 Google 中搜索关键字以开始我的 search/understanding 这个问题 space,或者解决我遇到的问题的一些研究论文或博客 post。

您手上肯定有一个有趣的问题。我会抛出一些(希望如此)有用的工具供您使用。

您可能想要做的第一件事是应用 Levenshtein Distance 算法来更正查询中可能存在的拼写错误。这是数据清理过程的一部分,您需要在主要算法执行之前执行它。

您要做的第二件事是对每个查询应用词干提取算法。词干提取涉及简单地返回单词的 root。一些例子:

jumping  -> jump
jumps    -> jump
jumper   -> jump

通过这种方式,您可以规范化查询中的所有重要关键字。

现在您可以对每个查询采用 "more like this" 方法来查找与其相似的其他查询,然后将它们批处理在一起。那么 "more like this" 是如何工作的呢?

它涉及三个组成部分:TF、IDF和字段长度。 TF 是 Term Frequency - 每个词在当前查询中出现的频率(这会提高其分数)。 IDF 是 反向文档频率 - 一个术语在所有查询中出现的频率(降低其分数)。而字段长度就是查询字段的长度(越短对分数的提升越大)。让我扩展一下:

您想将 help instaling [product x] 与其他记录进行比较。

首要任务是纠正所有查询中的拼写错误:

help installing [product x]

接下来,阻止查询:

help install [product x]

接下来,您将选择一个查询并开始将其与所有其他查询(或至少与您已经处理过的其他查询相似但尚未匹配在一起的所有其他查询)进行比较。我们将从上面的查询开始。

让我们创建一个术语向量

help (1)
install (1)
[x] (1)

这些术语中的每一个只出现一次。这是当前查询的词频。让我们比较一下这些术语中每一个的 IDF。结果 help 在所有查询中出现了 15,000 次,install 出现了 2,000 次,[product x] 出现了 500 次。这意味着 help 是最不相关的,因为它经常出现,而 [product x] 是最相关的,因为它很少出现。明白了吗?

字段长度用于查找这样的分数:查询越长,分数越低。为什么?因为如果只有 20 个字符的查询与您的术语匹配,那么与 1,000 个字符的查询相比,它更可能是完全重复的,用户在其中漫无目的地谈论许多不同的主题。看到了吗?

现在您可以了解更多有关 TF/IDF 的信息,以找出一个好的实施方案。

但是我有一些好消息要告诉你。所有这些工作都已在 Lucene library. Using Lucene you can index each of your queries as a document. Lucene will apply the stemming automatically for you when indexing it. Furthermore, Lucene has a "more like this" algorithm that uses TF/IDF for you. And, finally, Lucene can apply fuzzy matching using the Levenshtein distance calculator for each of your queries, too. Awesome!! If you find working with Lucene to be a little too close to the "bare metal", you can also use Elasticsearch 中为您完成,它是 Lucene 的高级高级包装器。真的很牛逼。

请注意,我不是这些主题的专家。但是,我希望这能提供一些想法。干杯!

http://cephas.net/blog/2008/03/30/how-morelikethis-works-in-lucene/ https://en.wikipedia.org/wiki/Levenshtein_distance