2015-02-06 75 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的「更像這個」可以作爲哈希的一種快速而又髒的替代方法,但可能需要一些後處理。

相關問題