Здесь есть два связанных (но четких технических вопроса); первый относится к выбору метода кластеризации для этих данных.
Второй вопрос с предикатом относится к модели данных - то есть для каждого предложения в необработанных данных, как преобразовать его в вектор данных, подходящий для ввода в алгоритм кластеризации.
кластеризации Техник
к-средства, вероятно, является наиболее популярным методом кластеризации, но есть много вышестоящих; рассмотрите, как работает k-kmeans: пользователь выбирает из числа данных небольшое количество точек данных (центры кластеров для начальной итерации в алгоритме k-средних, aka centroids). Затем определяется расстояние между каждой точкой данных и набором центроидов, и каждая точка данных, назначенная центроиду, закрывается; то новые центроиды определяются из среднего значения точек данных, присвоенных одному и тому же кластеру. Эти два этапа повторяются до тех пор, пока не будет достигнут какой-либо критерий конвергенции (например, между двумя последовательными итерациями, объединенное движение центроидов падает ниже некоторого порога).
Лучшие методы кластеризации сделать гораздо больше, чем просто переместить центры кластеров вокруг - например, спектральной кластеризация методы вращать и растяжение/сжать данные, чтобы найти одну ось максимальной дисперсии затем определить дополнительные оси ортогональны к оригиналу и друг к другу, т. е. к трансформированному пространству объектов. PCA (анализ главных компонент), LDA (линейный дискриминантный анализ), и kPCA все члены этого класса, определяющей характеристикой которого является то, что, что вычисление пар собственное/собственный вектор для каждой функции в исходные данные или в ковариационной матрице. Scikit-learn имеет модуль для PCA computation.
Модель данных
Как вы заметили, общая дилемма при построении модели данных из неструктурированных текстовых данных, включая функции для каждого слова в целом корпус (минус стоп-слова) часто приводит к очень высокая разреженность по набору данных (т. е. каждое предложение включает лишь небольшую часть общих слов во всех предложениях, поэтому каждый вектор данных является редким, а с другой стороны, если корпус обрезается так, что, например, только верхние 10% слов используются в качестве признаков, то некоторые/многие предложения имеют полностью незаселенные векторы данных.
Вот одна общая последовательность методов, чтобы помочь решить эту проблему, которая может быть особенно эффективным учитывая ваши данные: Объединить связанные термины в единый термин с использованием общей последовательности обработки нормализующий, вытекающих и синонимизация.
Это интуитивно понятно: например,
Нормализовать: трансформировать все слова в нижний регистр (строки Python имеют более низкий метод, так
REquired.lower()
Очевидно, что это предотвращает Обязательно, , необходимые , и требуется из трех отдельных элементов в вашем векторе данных и вместо этого сворачивает их в один термин.
Стебель: После того, как вытекающие, требуется, требуют и требует, свернуты в один знак, Requir.
Два из наиболее распространенных стволовых клеток - это портер и стволовые ланкастеры (NLTK, обсуждаемый ниже, имеет оба).
подбирать синонимы: термины, как свободно, , способного и квалифицированных, может, в зависимости от контекста, все быть свернуты к одному члену, путем определения в общем списке синонимов.
Превосходная Python NLP библиотеки, NLTK имеет (по крайней мере) несколько отличных синонимы компиляций или цифровой тезаурус (тезаурусы?), Чтобы помочь вам сделать все три из них, программно.
Например, nltk.corpus.reader.lin это один (только один, есть по крайней мере несколько более синоним-искатели в NLTLK), и это простое в использовании - просто импортировать этот модуль и вызвать синоним, переходящий в перспективе.
Несколько стволовых клеток находятся в NLTK's stem package.
Какую цель ставите перед собой? Возможно, кластеризация - это не средство достижения этого. Для чего вы хотите сгруппировать документы? Другие простые методы: [Слайд 15] (http://www.slideshare.net/niccokunzmann/clustering-gruppieren-von-datenpunkten). – User