algorithm - varias - unir pdf
¿Cuál es una forma conveniente de agrupar documentos con elasticsearch? (3)
ES no es particularmente útil para la agrupación. La mayoría de los algoritmos de agrupamiento requieren cálculos de distancia por pares, lo cual es más fácil si puede ajustar todos sus datos en una matriz enorme (y luego factorizarla). Así que puede ser más fácil (y más rápido) trabajar fuera de ES.
Ninguno de los enfoques funciona la mitad de lo que se anuncia. Ver, por ejemplo, "leer hojas de té". Todo el mundo que construye dicho algoritmo está feliz de sacar algo, y sintonizará y cambiará parámetros y volverá a ejecutar hasta que el resultado se vea bien. El término técnico es cherry picking. La evaluación es increíblemente descuidada, y si observa los resultados de cerca, no son mejores que elegir una palabra clave al azar (por ejemplo, automóvil) y hacer una búsqueda de texto sobre eso. Mucho más significativo que esos "temas" descubiertos por modelos de tema que nadie puede descifrar en la práctica. Buena suerte...
Chang, J., Gerrish, S., Wang, C., Boyd-Graber, JL, y Blei, DM (2009). Lectura de hojas de té: cómo los humanos interpretan los modelos de temas. En Avances en sistemas de procesamiento de información neuronal (pp. 288-296)
He almacenado una gran cantidad de artículos de noticias de fuentes RSS de diferentes fuentes en un índice elasticsearch. En el momento en que realizo una consulta de búsqueda, me devolverá muchas noticias similares para una consulta, porque las mismas fuentes de noticias cubren los mismos temas de noticias.
En cambio, lo que me gustaría hacer es devolver solo un artículo de noticias de un grupo de artículos para el mismo tema. Así que de alguna manera necesito reconocer qué artículos tratan sobre el mismo tema, agrupar estos documentos y devolver solo el "mejor" artículo de dicho clúster.
¿Cuál sería la forma más conveniente de abordar ese problema? ¿Puedo de alguna manera hacer uso de la API elasticsearch more-like-this? ¿O el plugin https://github.com/carrot2/elasticsearch-carrot2 es el camino a seguir? ¿O simplemente no hay una manera conveniente y tengo que implementar de alguna manera mi propia versión de http://en.wikipedia.org/wiki/K-means_clustering o http://en.wikipedia.org/wiki/Non-negative_matrix_factorization para agruparlos? ¿mis documentos?
No creo que puedas hacer la agrupación de manera adecuada desde dentro de Elasticsearch. Pero definitivamente puede usar los resultados de la agrupación en su consulta de ES.
Si fuera a hacerlo, usaría los datos que tiene como entrada para un algoritmo de agrupamiento, probablemente implementado en Apache Spark. He escrito algunas publicaciones en el blog sobre el uso de ES y Spark juntos (aquí hay uno: http://blog.qbox.io/deploy-elasticsearch-and-apache-spark-to-the-cloud ). Exactamente cómo hacer eso probablemente esté fuera del alcance de una respuesta de , pero hay muchas maneras de hacerlo. Ciertamente no tienes que usar Spark, por supuesto (me gusta). Elija su paradigma de programación favorito para implementar clustering, o incluso use una biblioteca de terceros. Hay mucho ahí afuera.
Una vez que estuve satisfecho con mis resultados de clúster, guardaría los metadatos del clúster nuevamente en ES como un conjunto de datos "principal" . De modo que cada artículo tendría un documento principal que representara el clúster al que pertenecía el artículo. Esta relación podría utilizarse (tal vez con una consulta secundaria superior , o tiene padre o algo así) para devolver los resultados que usted desea.
Zanahoria (como se menciona en la pregunta) es muy útil para agrupar los resultados de una consulta: solo escala hasta 100 o 1000 de documentos, pero eso puede ser suficiente. Si necesita escalas más grandes, los métodos como el hash sensible a las localidades evitan la necesidad de calcular todas las distancias por pares. Usar el "más-como-esto" de ES podría funcionar como una alternativa rápida y sucia al hash, pero probablemente necesitaría un poco de procesamiento posterior.