machine learning - spanish - scikit-learn: agrupación de documentos de texto utilizando DBSCAN
tfidfvectorizer (2)
La implementación en sklearn parece suponer que se trata de un espacio vectorial finito y desea encontrar la dimensionalidad de su conjunto de datos. Los datos de texto se representan comúnmente como vectores dispersos , pero ahora con la misma dimensionalidad.
Sus datos de entrada probablemente no sean una matriz de datos, pero las implementaciones de sklearn necesitan que sean una.
Tendrás que encontrar una implementación diferente. Tal vez intente la implementación en ELKI , que es muy rápida y no debería tener esta limitación.
Tendrá que pasar algún tiempo en comprender la similitud primero. Para DBSCAN, debe elegir epsilon
de una manera que tenga sentido para sus datos. No hay regla de oro; Esto es específico del dominio. Por lo tanto, primero debe determinar qué umbral de similitud significa que dos documentos son similares.
Media Shift puede necesitar que sus datos sean un espacio vectorial de dimensionalidad fija.
Estoy intentando usar scikit-learn para agrupar documentos de texto. En general, encuentro mi camino, pero tengo mis problemas con problemas específicos. La mayoría de los ejemplos que encontré ilustran el agrupamiento en clústeres utilizando scikit-learn con k-means como algoritmo de agrupamiento. Adoptar estos ejemplos con k-means a mi configuración funciona en principio. Sin embargo, k-means no es adecuado ya que no conozco la cantidad de clústeres. Por lo que leí hasta ahora, corríjame aquí si es necesario. DBSCAN o MeanShift parecen ser más apropiados en mi caso. El sitio web scikit-learn proporciona ejemplos para cada algoritmo de clúster. El problema ahora es que con DBSCAN y MeanShift obtengo errores que no puedo comprender, y mucho menos que resolver.
Mi código mínimo es el siguiente:
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)
...
(Mis documentos ya están procesados, es decir, se han eliminado las palabras clave y se ha aplicado un Porter Stemmer).
Cuando ejecuto este código, obtengo el siguiente error al introducir DBSCAN y al llamar a 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
Al hacer clic en la línea en dbscan_.py
que arroja el error, noté la siguiente línea
...
X = np.asarray(X)
n = X.shape[0]
...
Cuando uso estas líneas directamente en mi código para las pruebas, obtengo el mismo error. Realmente no sé qué está haciendo np.asarray(X)
aquí, pero después del comando X.shape = ()
. Por X.shape[0]
tanto, X.shape[0]
bombas: antes, X.shape[0]
se refiere correctamente al número de documentos. Por curiosidad, X = np.asarray(X)
de dbscan_.py
. Cuando hago esto, algo está computando pesadamente. Pero después de unos segundos, me sale otro error:
...
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
En resumen, no tengo ni idea de cómo hacer que DBSCAN funcione, o de lo que podría haberme perdido, en general.
Parece que las representaciones dispersas para DBSCAN son compatibles a partir de enero de 2015 .
Actualicé sklearn a 0.16.1 y funcionó para mí en el texto.