使用elasticsearch进行文档聚类的简便方法是什么?

时间:2015-02-06 17:44:06

标签: algorithm elasticsearch cluster-analysis

我在弹性搜索索引中存储了来自不同来源的RSS源的大量新闻文章。在我进行搜索查询时,它会为一个查询返回很多类似的新闻文章,因为许多RSS源都会涵盖相同的新闻主题。

相反,我想做的只是从同一主题的一组文章中返回一篇新闻文章。因此,我不知何故需要认识到,哪些文章是关于同一主题的,对这些文档进行聚类并仅返回" best"文章出自这样一个集群。

解决这个问题最方便的方法是什么? 我可以以某种方式使用elasticsearch更像这个API吗?或者https://github.com/carrot2/elasticsearch-carrot2插件是要走的路?或者,根本没有方便的方法,我必须以某种方式实现我自己的http://en.wikipedia.org/wiki/K-means_clusteringhttp://en.wikipedia.org/wiki/Non-negative_matrix_factorization版本来集中我的文档?

3 个答案:

答案 0 :(得分:6)

  1. ES对群集不是特别有用。大多数聚类算法都需要成对距离计算,如果您可以将所有数据放入一个巨大的矩阵(然后将其考虑在内),这是最简单的 因此,在ES之外工作可能更容易(也更快)!

  2. 这些方法的效果都不如宣传的那么好。参见例如“读茶叶”。构建这样一个算法的每个人都乐于把任何东西拿出来,并且会调整和调整参数并重新运行,直到结果看起来很好。樱桃采摘技术术语。评估是非常草率的,如果你仔细观察结果,它们并不比选择一个随机关键词(比方说,汽车)并对其进行文本搜索更好。比主题模型发现的那些“主题”更有意义,没有人能在实践中破译。祝你好运......

  3.   

    Chang,J.,Gerrish,S.,Wang,C.,Boyd-graber,J.L。& Blei,D。M.(2009)。阅读茶叶:人类如何解读主题模型。在神经信息处理系统的进展中(第288-296页)

答案 1 :(得分:4)

我认为你无法从Elasticsearch中充分地进行聚类。但您绝对可以在ES查询中使用聚类结果。

如果我要这样做,我会使用您拥有的数据作为聚类算法的输入,可能在Apache Spark中实现。我写了一些关于一起使用ES和Spark的博客文章(这里是一个:http://blog.qbox.io/deploy-elasticsearch-and-apache-spark-to-the-cloud)。究竟如何做到这一点可能超出了StackOverflow答案的范围,但有很多方法可以解决它。你当然不必使用Spark(我只是喜欢它)。选择您喜欢的编程范例来实现集群,甚至使用第三方库。那里有很多。

一旦我对群集结果感到满意,我就会将群集元数据作为"parent"数据集保存回ES。因此,每篇文章都会有一个父文档,代表该文章所属的集群。然后可以使用此关系(可能使用top child查询,或has parent或其他)来返回您想要的结果。

答案 2 :(得分:3)

胡萝卜(如问题中所述)非常适合聚类查询结果 - 它只能扩展到100或1000个文档但这可能就足够了。如果您需要更大的比例,那么像局部敏感哈希这样的方法可以避免计算所有成对距离的需要。使用ES"更喜欢这个"可以作为散列的快速替代方法,但可能需要一些后期处理。