问题:
假设我有一组大约1,000,000个简短文档D(每个文档不超过50个单词),并且我想让用户提供来自同一组D的文档,并从D中获取前K个相似的文档。
我的方法:
我的第一种方法是通过应用简单的tf-idf预处理D组,然后在每个文档都有非常稀疏的矢量之后,使用基于余弦相似度的简单最近邻算法。 然后,在查询时,仅使用我的静态最近邻居表,该表的大小为1,000,000 x K,而无需进行任何进一步的计算。
应用tf-idf之后,我得到了大小约为200,000的向量,这意味着我现在有了一个非常稀疏的表(可以使用稀疏向量将其有效地存储在内存中),大小为1,000,000 x 200,000。 但是,计算最近的邻居模型花了我超过一天的时间,但还没有完成。 我尝试通过使用利用hasing trick的HashingTF来降低向量维,因此我可以将维设置为常数(在我的情况下,我使用2 ^ 13表示不干扰的哈希),但我仍然表现一样差。
一些技术信息:
我使用Spark 2.0进行tf-idf计算,并对收集到的数据使用sklearn NearestNeighbours。
是实现目标的更有效的方法吗?
谢谢。
编辑:
我有一个想法尝试使用基于LSH的近似相似性算法,例如here中描述的在spark中实现的算法,但是找不到支持“余弦”相似性度量的算法。