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

Scala 给定大量数据,查找最常见的查询,scala,apache-spark,nlp,data-mining,Scala,Apache Spark,Nlp,Data Mining,问题:我有一个包含数列和数千万行的大型CSV。其中一列有一个存储纯文本的查询变量。我需要在数据中找到最常见的查询,但是因为这些是用户生成的查询,所以我需要像这样的查询 帮助安装[x产品] 及 [x产品]帮助安装 出于汇总/报告的目的,参与同一查询 我已经删减了所有常用词和其他JSON包装等的数据 您可以假设每行的值只包含用户所做查询的重要单词,并且我需要检索最常见的查询 我知道不可能为这样的高级问题提供代码,但我希望能被指向正确的方向——只要在谷歌搜索关键词,开始我对这个问题空间的搜索/理解,或

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

帮助安装[x产品]

[x产品]帮助安装

出于汇总/报告的目的,参与同一查询

我已经删减了所有常用词和其他JSON包装等的数据

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


我知道不可能为这样的高级问题提供代码,但我希望能被指向正确的方向——只要在谷歌搜索关键词,开始我对这个问题空间的搜索/理解,或者一些研究论文或博客文章来解决我的问题。

你手头上肯定有一个有趣的问题。我将抛出一些(希望)有用的工具,供您使用

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

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

jumping  -> jump
jumps    -> jump
jumper   -> jump
通过这种方式,您可以规范化查询中的所有重要关键字

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

它包括三个部分:TF、IDF和场长。TF是术语频率-每个术语在当前查询中的频率(这会提高其分数)。IDF是反向文档频率-一个术语在所有查询中的频率(这会降低其分数)。字段长度就是查询字段的长度(越短,分数越高)。让我来展开一点:

您想将
帮助安装[product x]
与其他记录进行比较

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

help installing [product x]
接下来,停止查询:

help install [product x]
接下来,您将选择一个查询并开始将其与所有其他查询进行比较(或者至少与您已处理的其他查询类似,将尚未匹配在一起的所有其他查询进行比较)。我们将从上面的查询开始

让我们创建一个术语向量

每个术语只出现一次。这是当前查询的术语频率。让我们比较一下这些术语的IDF。结果显示,
帮助
在所有查询中出现15000次,
安装
出现
2000次
次,
[product x]
出现
500次。这意味着
帮助
最不相关,因为它经常出现,而
[product x]
最相关,因为它很少出现。明白了吗

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

现在,您可以了解有关如何找到一个好的实现的更多信息

但我有一些好消息要告诉你。所有这些工作都是在图书馆为你做的。使用Lucene,您可以将每个查询作为文档进行索引。Lucene将在索引时自动为您应用词干。此外,Lucene有一个“更像这样”的算法,它为您使用TF/IDF。最后,Lucene还可以使用Levenshtein距离计算器为每个查询应用模糊匹配。令人惊叹的!!如果您发现使用Lucene有点过于接近“裸机”,您还可以使用它,它是Lucene的高级包装器。这真是太棒了

请注意,我不是这方面的专家。不过,我希望这能提供一些想法。干杯


太棒了,非常感谢。总而言之,我还需要做更多的预处理(拼写错误、词干/柠檬化),然后我应该研究TF-IDF以创建“更像”的东西和其他分组算法。在更多的研究过程中,我还发现了n-gram,我认为这对于实现这一目的也是非常有用的。我将使用Spark库,虽然它没有NLP集成,但它确实做了很多TF-IDF的东西和其他特征提取。
help (1)
install (1)
[x] (1)