asm*_*ier 11 algorithm cluster-analysis elasticsearch
我在弹性搜索索引中存储了来自不同来源的RSS提要的大量新闻文章.在我进行搜索查询的那一刻,它会为一个查询返回很多类似的新闻文章,因为许多RSS源都涵盖了相同的新闻主题.
相反,我想做的只是从同一主题的一组文章中返回一篇新闻文章.因此,我不知何故需要认识到,哪些文章是关于同一主题的,对这些文档进行聚类并仅从这样的集群中返回"最佳"文章.
解决这个问题最方便的方法是什么?我可以以某种方式使用elasticsearch更像这个API吗?或者https://github.com/carrot2/elasticsearch-carrot2插件是要走的路?或者根本没有方便的方法,我必须以某种方式实现我自己的http://en.wikipedia.org/wiki/K-means_clustering版本或http://en.wikipedia.org/wiki/Non-negative_matrix_factorization到集群我的文件?
ES对群集不是特别有用.大多数聚类算法需要成对距离计算,如果您可以将所有数据放入一个巨大的矩阵(然后将其考虑在内),这是最简单的.因此,在ES之外工作可能更容易(也更快)!
这些方法都没有宣传的好一半.参见例如"阅读茶叶".构建这样一个算法的每个人都乐于把任何东西拿出来,并且会调整和调整参数并重新运行,直到结果看起来很好.樱桃采摘技术术语.评估是非常草率的,如果你仔细观察结果,它们并不比选择随机关键词(比方说,汽车)和对其进行文本搜索更好.比主题模型发现的那些"主题"更有意义,没有人能在实践中破译.祝你好运......
Chang,J.,Gerrish,S.,Wang,C.,Boyd-graber,JL,&Blei,DM(2009).阅读茶叶:人类如何解读主题模型.在神经信息处理系统的进展中(第288-296页)
我认为您无法在 Elasticsearch 中充分地进行聚类。但是您绝对可以在 ES 查询中使用聚类结果。
如果我打算这样做,我会使用您拥有的数据作为聚类算法的输入,可能在 Apache Spark 中实现。我写了一些关于一起使用 ES 和 Spark 的博客文章(这里是一篇:http : //blog.qbox.io/deploy-elasticsearch-and-apache-spark-to-the-cloud)。究竟如何做到这一点可能超出了 StackOverflow 答案的范围,但有很多方法可以解决。当然,您当然不必使用 Spark(我只是喜欢它)。选择您最喜欢的编程范式来实现集群,甚至使用第三方库。那里有很多。
一旦我对集群结果感到满意,我会将集群元数据作为“父”数据集保存回 ES 。所以每篇文章都会有一个父文档,代表文章所属的集群。然后可以使用这种关系(可能带有顶级子查询,或者具有父查询或其他查询)来返回您想要的结果。