Apache spark 高效地找到与给定向量相似的K余弦向量

Apache spark 高效地找到与给定向量相似的K余弦向量,apache-spark,scikit-learn,pyspark,Apache Spark,Scikit Learn,Pyspark,问题: 假设我有一组大约1000000个短文档D(每个不超过50个单词),我想让用户提供同一组D中的一个文档,并从D中获得前K个类似文档 我的方法: 我的第一种方法是通过应用简单的tf-idf对D组进行预处理,在为每个非常稀疏的文档生成向量后,使用基于余弦相似性的简单最近邻算法。 然后,在查询时,只使用我的静态最近邻表,它的大小是1000000 x K,没有任何进一步的计算 在应用tf idf之后,我得到了大小为200000的向量,这意味着现在我有一个非常稀疏的表(可以使用稀疏向量有效地存储在内

问题:

假设我有一组大约1000000个短文档D(每个不超过50个单词),我想让用户提供同一组D中的一个文档,并从D中获得前K个类似文档

我的方法:

我的第一种方法是通过应用简单的tf-idf对D组进行预处理,在为每个非常稀疏的文档生成向量后,使用基于余弦相似性的简单最近邻算法。 然后,在查询时,只使用我的静态最近邻表,它的大小是1000000 x K,没有任何进一步的计算

在应用tf idf之后,我得到了大小为200000的向量,这意味着现在我有一个非常稀疏的表(可以使用稀疏向量有效地存储在内存中),大小为1000000 x 200000。 然而,计算最近邻模型花了我一天多的时间,而且还没有完成。 我试图通过应用HashingTF来降低向量维度,它利用了,因此我可以将维度设置为常量(在我的例子中,我使用2^13进行未指定的散列),但仍然得到了同样糟糕的性能

一些技术信息:

我使用Spark 2.0进行tf idf计算,并在收集的数据上学习最近邻居

有没有更有效的方法来实现这个目标

提前谢谢

编辑:


我想尝试一种基于近似的相似性算法,如spark中所述,但找不到一种支持“余弦”相似性度量的算法。

该算法对训练实例和向量维度之间的关系有一些要求,但您可以尝试


你可以找到文件。

你可以考虑对文档进行标签,也可以标记你想研究的相似性文档,并检查同一子集的文档的余弦距离。除非您以某种方式减少搜索空间,否则您仍然必须为存储的1000000个文档中的每个文档计算余弦距离,这是无法避免的。计算此距离的不同算法可能会稍微提高总体速度,但您仍需要传递集合中的所有向量。您不需要说明应用程序域是什么,但可能需要使用类似的方法检索类似的文档,它使用的方法与您正在使用的方法类似,但经过了大量优化以有效处理大量文档。如果您使用sklearn NearestNeights,则仍然使用欧几里德度量。如果您觉得没问题,请在sklearn中使用@mayankagrawal nearestneights,因为它有一个选择公制的选项(例如“余弦”)。查看我的编辑近似算法,谢谢。谢谢你的回答-我也查看了DIMSUM,但它不符合我的需要:DIMSUM假设特征(向量)维度远大于向量数(我的例子中的文档),这不是我的情况。很抱歉听到这个消息。一般来说,我认为你可能利用的另一个主要因素是,你的高维向量是稀疏的,我猜这意味着,很多相似性都是0,没有共同的特征。您可以尝试迭代不同的功能,只计算具有相同功能的用户的相似性。那些没有出现在结果中的,根据定义相似性为0,因为它们没有共同的特征维度>0。为了让这种方法加快计算速度,我想这些特性必须非常稀疏。而且,我想你只对非琐碎和有意义的单词感兴趣。因此,您可以尝试删除高df单词,以增加语义和稀疏性。