Tokenizing и stemming - очевидные вещи, которые нужно сделать. Затем вы можете легко превратить эти векторы в разреженные векторные данные TF-IDF. Сканирование реальных веб-страниц для получения дополнительных токенов - это, вероятно, слишком много работы?
После этого вы сможете использовать любой гибкий алгоритм кластеризации для набора данных. Под «гибким» я имею в виду, что вы должны иметь возможность использовать, например, косинусное расстояние, а не евклидово расстояние (которое плохо работает с разреженными векторами). Например, k-means в GNU R поддерживает только евклидово расстояние и плотные векторы, к сожалению. В идеале выбирайте фреймворк, который будет очень гибким, но при этом хорошо оптимизируется. Если вы хотите попробовать k-средних, так как это простой (и, следовательно, быстрый) и хорошо зарекомендовавший себя алгоритм, я верю, что есть вариант, называемый "выпуклым k-средним", который может быть применим для косинусного расстояния и разреженных векторов tf-idf. .
Классическая «иерархическая кластеризация» (не считая устаревшей и не очень хорошо работающей) обычно является проблемой из-за сложности O(n^3)
большинства алгоритмов и реализаций. В некоторых специализированных случаях известен алгоритм O(n^2)
(SLINK, CLINK), но часто наборы инструментов предлагают только простую реализацию кубического времени (включая GNU R, Matlab, sciPy, из того, что я только что погуглил). Кроме того, они часто имеют ограниченный выбор доступных функций расстояния, возможно, не включая косинус.
Однако методы зачастую достаточно просты для реализации самим, оптимизированным для вашего реального случая использования.