Кластеризация новостных статей
Мой сценарий довольно прост: у меня есть куча новостных статей (~1k на данный момент), для которых я знаю, что некоторые из них освещают одну и ту же историю / тему. Теперь я хотел бы сгруппировать эти статьи на основе общей истории / темы, то есть на основе их сходства.
То, что я до сих пор делал, - это применял базовые методы НЛП, в том числе удаление стоп-слов и остановку. Я также рассчитал вектор tf-idf для каждой статьи, и с его помощью можно также вычислить, например, косинусное сходство, основываясь на этих tf-idf-векторах. Но сейчас с группировкой статей я немного борюсь. Я вижу два основных способа - возможно, связанных - сделать это:
1) Машинное обучение / кластеризация: я уже немного поиграл с существующими библиотеками кластеризации, с большим или меньшим успехом; смотрите здесь. С одной стороны, алгоритмы типа k-средних требуют ввода количества кластеров, чего я не знаю. Другие алгоритмы требуют параметров, которые также не являются интуитивно понятными (для меня это так).
2) Алгоритмы графа: я могу представить свои данные в виде графа, где статьи являются узлами, а взвешенные числа представляют попарное (косинусное) сходство между статьями. При этом, например, я могу сначала удалить все ребра, которые падают ниже определенного порога, а затем может применить графовые алгоритмы для поиска сильно связанных подграфов.
Короче говоря, я не уверен, куда лучше идти отсюда - я все еще довольно новичок в этой области. Интересно, есть ли для этого лучшие практики или какие-то рекомендации, какие методы / алгоритмы могут (не) применяться в определенных сценариях.
(РЕДАКТИРОВАТЬ: забыл ссылку на мой связанный вопрос)
3 ответа
Попробуйте класс HAC- алгоритмов иерархической агломерационной кластеризации с одиночной и полной связью.
Этим алгоритмам не нужно количество кластеров в качестве входных данных.
Основной принцип аналогичен выращиванию минимального связующего дерева в заданном наборе точек данных, а затем остановке на основе пороговых критериев. Тесно связанным классом являются алгоритмы делительной кластеризации, которые сначала строят минимальное связующее дерево, а затем отбрасывают ветвь дерева на основе коэффициентов сходства между кластерами.
Поскольку вы можете смоделировать свой набор данных в виде графа, вы можете применить стохастическую кластеризацию на основе марковских моделей. Вот ссылка на ресурсы по алгоритму MCL:
Вы также можете попробовать вариацию навеса для k-средних, чтобы создать относительно быструю оценку количества кластеров (k).
http://en.wikipedia.org/wiki/Canopy_clustering_algorithm
Будете ли вы пересчитывать со временем или вам нужны только статичные новости? Я спрашиваю, потому что ваш к может со временем немного измениться.