2015-02-06 14 views
10

Ho memorizzato molti articoli di notizie da feed RSS da diverse fonti in un indice di elasticsearch. Nel momento in cui faccio una query di ricerca, mi verrà restituito un sacco di articoli di notizie simili per una query, perché gli stessi argomenti di notizie vengono coperti da molte fonti RSS.Qual è un modo conveniente per raggruppare i documenti con elasticsearch?

Invece quello che mi piacerebbe fare è restituire solo un articolo di notizie da un gruppo di articoli allo stesso argomento. Quindi, in qualche modo, devo riconoscere, quali articoli riguardano lo stesso argomento, raggruppare questi documenti e restituire solo l'articolo "migliore" da un tale cluster.

Quale sarebbe il modo più conveniente per affrontare questo problema? Posso in qualche modo utilizzare l'API di elasticsearch come questa? Oppure il plug-in https://github.com/carrot2/elasticsearch-carrot2 è la strada da percorrere? O semplicemente non esiste un modo conveniente e devo implementare in qualche modo la mia versione di http://en.wikipedia.org/wiki/K-means_clustering o http://en.wikipedia.org/wiki/Non-negative_matrix_factorization per raggruppare i miei documenti?

+0

Non capisco cosa sia così complicato. Devi definire le tue regole per decidere quale articolo è migliore dell'altro. Per questo, si assegnano le partite di conseguenza (se si trova una determinata parola nei campi X o se questa parola e quella parola sono trovate ecc.) E si restituisce la partita con il miglior punteggio. Questo è l'intero scopo di Elasticsearch: ricerca di testo. E ti offre molti strumenti per interrogare, valutare, manipolare il punteggio, sintonizzarlo ecc. In modo che alla fine tu ottenga ciò di cui hai bisogno. Ma è necessario definire le regole per "abbinare" l'articolo "migliore". –

risposta

4

Non penso che sarete in grado di eseguire il clustering adeguatamente da Elasticsearch. Ma puoi sicuramente usare i risultati del clustering nella tua query ES.

Se avessi intenzione di farlo, userei i dati che hai come input per un algoritmo di clustering, probabilmente implementato in Apache Spark. Ho scritto alcuni post del blog sull'utilizzo di ES e Spark insieme (uno: http://blog.qbox.io/deploy-elasticsearch-and-apache-spark-to-the-cloud). Esattamente come farlo è probabilmente al di fuori della portata di una risposta StackOverflow, ma ci sono molti modi per farlo. Certamente non devi usare Spark, ovviamente (mi piace). Scegli il tuo paradigma di programmazione preferito per implementare il clustering o persino utilizzare una libreria di terze parti. Ce ne sono molti in circolazione.

Una volta soddisfatti dei risultati del clustering, salvavo i metadati del cluster in ES come set di dati "parent". Quindi ogni articolo avrebbe un documento genitore che rappresenta il cluster a cui apparteneva l'articolo. Questa relazione potrebbe quindi essere utilizzata (magari con una query top child o has parent o qualcosa del genere) per restituire i risultati desiderati.

6
  1. ES non è particolarmente utile per il clustering. La maggior parte degli algoritmi di clustering richiede calcoli a distanza a coppie, il che è più semplice se si possono adattare tutti i dati in una matrice enorme (e quindi fattore) Quindi potrebbe essere più facile (e più veloce) lavorare fuori da ES!

  2. Nessuno degli approcci funziona a metà della pubblicità. Vedi per es. "Leggere le foglie di tè". Chiunque costruisca un tale algoritmo è felice di ottenere qualcosa, e sintonizzerà e armerà i parametri ed eseguirà nuovamente il risultato fino a quando il risultato non apparirà piacevole. Il termine tecnico è cherry picking. La valutazione è incredibilmente sciatta e, se si osservano da vicino i risultati, non sono migliori della scelta di una parola chiave casuale (ad esempio, auto) e di una ricerca di testo su tale argomento. Molto più significativo di quegli "argomenti" scoperti da modelli tematici che nessuno può decifrare in pratica. Quindi buona fortuna ...

Chang, J., Gerrish, S., Wang, C., Boyd-Graber, J. L., & Blei, D. M. (2009). Leggere le foglie di tè: come gli esseri umani interpretano i modelli tematici. In I progressi nei sistemi di elaborazione delle informazioni neurali (pp. 288-296)

+0

Ma diresti che anche gli algoritmi per il clustering in Google News non funzionano meglio della scelta di una parola chiave casuale? (vedi anche http://www.quora.com/How-does-Google-News-cluster-stories, http://stackoverflow.com/questions/784602/news-clustering, http://stackoverflow.com/questions/3770865/does-any-know-how-google-news-usa-per-loro-algoritmo di clustering). – asmaier

+0

È più un * rilevamento quasi duplicato * di un clustering. In particolare, non si noteranno errori, come documenti mancanti. –

3

Carota (come indicato nella domanda) è molto buono per il clustering dei risultati di una query - è in scala solo fino a 100 o 1000 di documenti, ma potrebbe essere sufficiente. Se hai bisogno di scale più grandi, metodi come l'hashing sensibile alle località evita il bisogno di calcolare tutte le distanze a coppie.Usando il "più-simile-questo" potrebbe funzionare come un'alternativa rapida e sporca all'hashing, ma probabilmente avrebbe bisogno di un po 'di post-elaborazione.