2015-02-06 40 views
10

我已经在elasticsearch索引中存储了来自不同来源的RSS源的大量新闻文章。在我执行搜索查询时,它会为我返回一个查询的很多类似的新闻文章,因为同一个新闻主题被许多RSS源所覆盖。什么是使用elasticsearch做文档聚类的便捷方式?

相反,我想这样做是出一组文章中只返回一个新闻文章同一主题。因此,我不知何故需要认识到,哪些文章是关于同一主题的,将这些文档聚集在一起,并仅从这样的群集中返回“最好”的文章。

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

+0

我不明白这是如此复杂。您需要定义自己的规则来决定哪个文章比其他文章更好。为此,您可以相应地评分您的比赛(如果在X场中找到了某个单词,或者该单词和该单词已找到等),并返回最佳比分的比赛。这是Elasticsearch的全部目的:文本搜索。它给了你很多工具来查询,评分,操纵分数,调整等,以便最终得到你所需要的。但是你需要为“匹配”“最佳”文章定义规则。 – 2015-02-06 20:27:49

回答

4

我不认为你能够从Elasticsearch中充分地进行聚类。但是你绝对可以在ES查询中使用集群结果。

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

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

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

  2. 的方法都没有工作,一半好为标榜。见例如“读茶叶”。构建这种算法的每个人都乐于获取任何东西,并且会调整和调整参数并重新运行,直到结果看起来不错。技术术语是樱桃采摘。评估是令人难以置信的马虎,如果你仔细观察结果,他们不会比选择一个随机关键词(比如说汽车)并对其进行文本搜索更好。比主题模型发现的那些在实践中没有人能够解读的“主题”更有意义。那么好的运气...

昌,J.,格里什,S.,王,C,博伊德 - 格雷伯,J. L.,& Blei,D. M.(2009)。阅读茶叶:人类如何解释主题模型。在神经信息处理系统的进步(第288-296)

+0

但是你会说Google新闻中的聚类算法在选择随机关键词方面效果不佳吗? (另见http://www.quora.com/How-does-Google-News-cluster-stories,http://stackoverflow.com/questions/784602/news-clustering,http://stackoverflow.com/questions/3770865/do-anyone-know-what-google-news-uses-for-clustersing-algorithm)。 – asmaier 2015-02-07 21:41:05

+0

它比一个聚类更接近*重复检测*。特别是,您不会注意到错误,例如缺少文档。 – 2015-02-07 22:41:10

3

胡萝卜(如问题提到的)是汇聚查询的结果非常好 - 它只是扩展到100的文件名或1000年代,但这可能够了。如果您需要更大的比例尺,那么像局部敏感哈希法这样的方法可以避免计算所有成对距离的需要。使用ES的“更像这个”可以作为哈希的一种快速而又脏的替代方法,但可能需要一些后处理。

相关问题