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

时间:2015-07-17 16:54:16

标签: scala apache-spark nlp data-mining

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

  

帮助安装[x product]

  

[x product]帮助安装

为摘要/报告提供相同的查询。

我已经修剪了所有常用单词和其他JSON包装等的数据。

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

我理解为这样的高级问题提供代码是不可能的,但我希望能指出正确的方向 - 如果只是在Google中搜索关键词来开始搜索/理解这个问题问题空间,或一些解决我所遇问题的研究论文或博客文章。

1 个答案:

答案 0 :(得分:2)

你手上肯定有一个有趣的问题。我会抛出一些(希望)有用的工具让你投入其中。

您可能要做的第一件事是应用Levenshtein Distance算法来纠正查询中可能出现的拼写错误。这是您在主算法完成之前要做的数据清理过程的一部分。

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

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

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

现在,您可以针对每个查询寻找“更像这样”的方法来查找与其类似的其他查询,然后将它们一起批处理。那么“更像这样”是如何运作的?

它涉及三个组成部分:TF,IDF和字段长度。 TF是术语频率 - 每个术语在当前查询中的频率(提高其得分)。 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库中完成。使用Lucene,您可以将每个查询编入索引作为文档。在为索引编制索引时,Lucene会自动为您应用词干。此外,Lucene还有一个“更像这样”的算法,可以为您使用TF / IDF。最后,Lucene也可以使用Levenshtein距离计算器为每个查询应用模糊匹配。真棒!如果你发现使用Lucene与“裸机”有点太接近,你也可以使用Elasticsearch这是Lucene的高级高级包装器。它确实踢了屁股。

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

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