scikit-learn: кластеризация текстовых документов с использованием DBSCAN
Я пытаюсь использовать Scikit-Learn для кластеризации текстовых документов. В целом я нахожу свой путь, но у меня есть проблемы с конкретными вопросами. Большинство примеров, которые я нашел, иллюстрируют кластеризацию с использованием scikit-learn с k-means в качестве алгоритма кластеризации. Принятие этих примеров с помощью k-means для моей настройки работает в принципе. Однако k-means не подходит, так как я не знаю количество кластеров. Из того, что я читал до сих пор - пожалуйста, исправьте меня здесь, если необходимо - DBSCAN или MeanShift кажутся более подходящими в моем случае. Сайт scikit-learn предоставляет примеры для каждого алгоритма кластера. Проблема в том, что и с DBSCAN, и с MeanShift я получаю ошибки, которые не могу понять, не говоря уже о том, чтобы их решить.
Мой минимальный код выглядит следующим образом:
docs = []
for item in [database]:
docs.append(item)
vectorizer = TfidfVectorizer(min_df=1)
X = vectorizer.fit_transform(docs)
X = X.todense() # <-- This line was needed to resolve the isse
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
...
(Мои документы уже обработаны, т. Е. Стоп-слова были удалены и применен Porter Stemmer.)
Когда я запускаю этот код, я получаю следующую ошибку при установке DBSCAN и вызове fit()
:
...
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 248, in fit
clust = dbscan(X, **self.get_params())
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/dbscan_.py", line 86, in dbscan
n = X.shape[0]
IndexError: tuple index out of range
Нажав на строку в dbscan_.py
который выдает ошибку, я заметил следующую строку
...
X = np.asarray(X)
n = X.shape[0]
...
Когда я использую их для строк непосредственно в моем коде для тестирования, я получаю ту же ошибку. Я не знаю что np.asarray(X)
здесь делают, но после команды X.shape = ()
, следовательно X.shape[0]
бомбы - раньше, X.shape[0]
правильно относится к количеству документов. Из любопытства я убрал X = np.asarray(X)
от dbscan_.py
, Когда я делаю это, что-то сильно загружается. Но через несколько секунд я получаю еще одну ошибку:
...
File "/usr/lib/python2.7/dist-packages/scipy/sparse/csr.py", line 214, in extractor
(min_indx,max_indx) = check_bounds(indices,N)
File "/usr/lib/python2.7/dist-packages/scipy/sparse/csr.py", line 198, in check_bounds
max_indx = indices.max()
File "/usr/lib/python2.7/dist-packages/numpy/core/_methods.py", line 17, in _amax
out=out, keepdims=keepdims)
ValueError: zero-size array to reduction operation maximum which has no identity
Короче говоря, я не имею ни малейшего понятия, как заставить работать DBSCAN или что я мог вообще упустить.
2 ответа
Реализация в sklearn, кажется, предполагает, что вы имеете дело с конечным векторным пространством и хотите найти размерность вашего набора данных. Текстовые данные обычно представлены в виде разреженных векторов, но теперь с одинаковой размерностью.
Ваши входные данные, вероятно, не являются матрицей данных, но реализациям sklearn нужно, чтобы они были едины.
Вам нужно будет найти другую реализацию. Возможно, попробуйте реализацию в ELKI, которая очень быстра, и не должна иметь этого ограничения.
Сначала вам нужно потратить некоторое время на понимание сходства. Для DBSCAN вы должны выбрать epsilon
таким образом, что имеет смысл для ваших данных. Эмпирического правила не существует; это зависит от домена. Поэтому сначала необходимо выяснить, какой порог сходства означает, что два документа похожи.
Среднему сдвигу может потребоваться, чтобы ваши данные были векторным пространством фиксированной размерности.
Похоже, что разреженные представления для DBSCAN поддерживаются по состоянию на январь 2015 года.
Я обновил sklearn до 0.16.1, и он работал для меня над текстом.