Что такое удобный способ кластеризации документов с помощью elasticsearch?

Я сохранил много новостей из RSS-каналов из разных источников в индексе elasticsearch. В тот момент, когда я выполняю поисковый запрос, он вернет мне много похожих новостных статей для одного запроса, потому что одни и те же темы новостей охвачены многими источниками RSS.

Вместо того, что я хотел бы сделать, это вернуть только одну новостную статью из группы статей в ту же тему. Поэтому мне почему-то нужно распознать, какие статьи касаются одной и той же темы, сгруппировать эти документы и вернуть только "лучшую" статью из такого кластера.

Каким будет наиболее удобный способ решения этой проблемы? Могу ли я каким-то образом использовать elasticsearch более похожим на этот API? Или это https://github.com/carrot2/elasticsearch-carrot2 плагин, куда идти? Или просто нет удобного способа, и я должен каким-то образом реализовать свою собственную версию http://en.wikipedia.org/wiki/K-means_clustering или http://en.wikipedia.org/wiki/Non-negative_matrix_factorization, чтобы скопировать мои документы?

Ответ 1

  • ES не особенно полезен для кластеризации. Для большинства алгоритмов кластеризации требуются вычисления с парным расстоянием, что проще всего, если вы можете поместить все свои данные в огромную матрицу (а затем ее коэффициент) Таким образом, может быть проще (и быстрее) работать за пределами ES!

  • Ни один из подходов не работает так же хорошо, как рекламируется. См. "чтение чайных листьев". Каждый, кто строит такой алгоритм, рад получить что-то, и будет настраивать и скриптировать параметры и повторять, пока результат не будет выглядеть красиво. Технический термин - выбор вишни. Оценка невероятно неряшлива, и если вы внимательно посмотрите на результаты, они не лучше, чем выбор случайного ключевого слова (скажем, автомобиль) и выполнение текстового поиска. Гораздо более значимым, чем те "темы", которые были обнаружены в тематических моделях, которые никто не может расшифровать на практике. Так что удачи...

Chang, J., Gerrish, S., Wang, C., Boyd-graber, J. L. and Blei, D. M. (2009). Чтение чайных листьев: как люди интерпретируют тематические модели. В Advances в системах обработки нейронной информации (стр. 288-296)

Ответ 2

Я не думаю, что вы сможете сделать кластеризацию изнутри Elasticsearch. Но вы можете определенно использовать результаты кластеризации в своем ES-запросе.

Если бы я собирался это сделать, я бы использовал данные, которые у вас есть для ввода для алгоритма кластеризации, возможно, реализованного в Apache Spark. Я написал несколько сообщений в блоге об использовании ES и Spark вместе (здесь один: http://blog.qbox.io/deploy-elasticsearch-and-apache-spark-to-the-cloud). Точно как это сделать, вероятно, выходит за рамки ответа StackOverflow, но есть много способов сделать это. Конечно, вам не обязательно использовать Spark, конечно (мне это нравится). Выберите свою любимую парадигму программирования для реализации кластеризации или даже используйте стороннюю библиотеку. Там много.

Как только я был доволен результатами кластеризации, я сохранил метаданные кластера в ES как "parent" dataset. Поэтому каждая статья будет иметь родительский документ, представляющий кластер, к которому принадлежала статья. Затем эту связь можно было бы использовать (возможно, с верхним дочерним, или имеет родительский или что-то еще), чтобы вернуть желаемые результаты.

Ответ 3

Морковь (как упоминалось в вопросе) очень хороша для кластеризации результатов запроса - она ​​масштабирует только до 100 или 1000 документов, но этого может быть достаточно. Если вам нужны более крупные масштабы, тогда методы, такие как чувствительность к местоположению, позволяют избежать вычисления всех парных расстояний. Использование ES "больше похоже на это" может работать как быстрая и грязная альтернатива хешированию, но, вероятно, потребуется некоторая пост-обработка.