【问题标题】:What is a convenient way to do document clustering with elasticsearch?使用 elasticsearch 进行文档聚类的便捷方法是什么?
【发布时间】:2015-04-06 22:38:35
【问题描述】:

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

相反,我想做的是仅将一组文章中的一篇新闻文章返回到同一主题。所以我需要以某种方式识别哪些文章是关于同一主题的,对这些文档进行聚类并仅返回此类聚类中“最佳”的文章。

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

【问题讨论】:

    标签: algorithm elasticsearch cluster-analysis


    【解决方案1】:

    我认为您无法在 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】:
      1. ES 对于集群并不是特别有用。大多数聚类算法需要成对距离计算,如果您可以将所有数据放入一个巨大的矩阵中(然后将其分解),这是最简单的 所以在 ES 之外工作可能更容易(也更快)!

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

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

      【讨论】:

      【解决方案3】:

      Carrot(如问题中所述)非常适合对查询结果进行聚类 - 它只能扩展到 100 或 1000 个文档,但这可能就足够了。如果您需要更大的尺度,那么像局部敏感散列这样的方法可以避免计算所有成对距离。使用 ES 的“更像这样”可以作为散列的快速而肮脏的替代方案,但可能需要一些后期处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 2018-02-21
        • 2011-07-03
        • 2015-11-22
        • 2012-07-03
        • 1970-01-01
        • 2014-08-08
        相关资源
        最近更新 更多