问题:我有一个包含多列和数千万行的大型CSV。其中一列有一个存储明文的查询变量。我需要在数据中找到最常见的查询,但由于这些是用户生成的查询,我需要查询
帮助安装[x product]
和
[x product]帮助安装
为摘要/报告提供相同的查询。
我已经修剪了所有常用单词和其他JSON包装等的数据。
您可以假设每行的值仅包含用户查询的重要单词,并且我需要检索最常见的查询。
我理解为这样的高级问题提供代码是不可能的,但我希望能指出正确的方向 - 如果只是在Google中搜索关键词来开始搜索/理解这个问题问题空间,或一些解决我所遇问题的研究论文或博客文章。
答案 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