21 votos

Clasificación de textos a gran escala

Quiero clasificar mis datos de texto. Dispongo de 300 classes 200 documentos de formación por clase (es decir 60000 documents in total ) y es probable que esto dé lugar a muy datos de alta dimensionalidad (podemos estar buscando en más de 1millón de dimensiones ).

Me gustaría realizar los siguientes pasos en la tubería (sólo para que se hagan una idea de cuáles son mis requisitos):

  1. Conversión de cada documento en vector de características ( tf-idf o vector space model )
  2. Feature selection ( Mutual Information o cualquier otro estándar)
  3. Entrenamiento del clasificador ( SVM , Naive Bayes , Logistic Regression o Random Forest )
  4. Predicción de datos no vistos basada en el modelo clasificador entrenado.

Así que la pregunta es ¿qué herramientas/marco utilizo para manejar datos de tan alta dimensión? Conozco los sospechosos habituales (R, WEKA...) pero hasta donde llegan mis conocimientos (puedo estar equivocado) posiblemente ninguno de ellos pueda manejar datos tan grandes. ¿Hay alguna otra herramienta disponible que pueda utilizar?

Si tengo que paralelizarlo, ¿debería considerar Apache Mahout ? Parece que todavía no ofrece la funcionalidad que necesito.

Gracias a todos de antemano.


Actualización: He echado un vistazo este sitio web R y de Internet en general. Me parece que los siguientes problemas podrían surgir en mi situación:

(1) Preprocesamiento de mis datos con R ( tm en particular) podría ser poco práctico ya que tm será prohibitivamente lento.

(2) Dado que tendré que utilizar un conjunto de paquetes de R (preprocesamiento, matrices dispersas, clasificadores, etc.), la interoperabilidad entre los paquetes podría convertirse en un problema, y podría incurrir en una sobrecarga adicional al convertir los datos de un formato a otro. Por ejemplo, si realizo el preprocesamiento con tm (o una herramienta externa como WEKA) Tendré que encontrar una manera de convertir estos datos en una forma que las bibliotecas HPC en R puedan leer. Y, de nuevo, no tengo claro si los paquetes clasificadores podrían tomar directamente los datos proporcionados por las bibliotecas HPC.

¿Voy por buen camino? Y lo que es más importante, ¿me explico?

13voto

On Freund Puntos 3479

Debería ser posible hacerlo funcionar siempre que los datos se representen como una estructura de datos dispersa como scipy.sparse.csr_matrix en Python. Escribí un tutorial para trabajar con datos de texto . Además, es posible reducir aún más el uso de memoria aprovechando el truco del hashing: adaptarlo para que utilice la función HashingVectorizer en lugar del CountingVectorizer o el TfidfVectorizer . Esto se explica en la sección de documentación extracción de características del texto .

Los bosques aleatorios son, en general, mucho más caros que los modelos lineales (como las máquinas lineales de vectores de soporte y la regresión logística) y que los Bayes ingenuos multinomiales o Bernoulli, y para la mayoría de los problemas de clasificación de textos no aportan una precisión predictiva significativamente mejor que los modelos más sencillos.

Si scikit-learn termina no siendo capaz de escalar a su problema, Vowpal Wabbit lo hará (y probablemente más rápido que sklearn) aunque no implemente todos los modelos de los que estás hablando.

Editado en abril de 2015 para reflejar el estado actual de la biblioteca scikit-learn y corregir enlaces rotos.

10voto

Sarah Jamie Lewis Puntos 3244

Gensim para Python es mágico. Y como está en Python, puedes usarlo junto con la sugerencia de @ogrisel.

3voto

Dori Puntos 1325

No es por alardear, pero hice una serie de vídeos bastante populares sobre análisis de texto con Rapidminer. Puedes verlo aquí:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Es probable que pueda evitar hacer la selección de características, sólo tiene que utilizar un clasificador que no crea un millón * millón de matriz en la memoria :)

La regresión logística se ahogará con tantas dimensiones. Naive Bayes asume dimensiones independientes, por lo que estará bien. SVM no depende del número de dimensiones (pero en el número de vectores de soporte) por lo que estará bien también.

Sin embargo, 300 son muchas clases. Yo empezaría con unas pocas e iría subiendo.

1voto

Patman Puntos 180

En primer lugar, basándome en sus comentarios, yo trataría esto como 300 problemas de clasificación binaria (sí/no). Hay muchos programas de código abierto fáciles de usar para aprender a clasificar binarios, y esto te permite intercambiar tiempo por memoria.

Las SVM y la regresión logística son probablemente los enfoques más populares para la clasificación de textos. Ambos pueden manejar fácilmente 1000000 dimensiones, ya que las implementaciones modernas utilizan estructuras de datos dispersas e incluyen ajustes de regularización que evitan el sobreajuste.

Varias suites de aprendizaje automático de código abierto, como WEKA y KNIME incluyen tanto SVM como regresión logística. Las implementaciones independientes de SVM incluyen libSVM y SVMlight . Para la regresión logística, introduciré BXRtrain y BXRclassify que desarrollé con Madigan, Genkin y otros. BXRclassify puede construir un índice en memoria de miles de modelos de regresión logística y aplicarlos simultáneamente.

En cuanto a la conversión de texto a atributos vectoriales, siempre acabo escribiendo un poco de Perl para hacerlo desde cero :-) Pero creo que las suites de aprendizaje automático que mencioné incluyen código de tokenización y vectorización. Otro camino sería ir con más de un conjunto de herramientas de lenguaje natural como LingPipe aunque eso puede ser excesivo para ti.

1voto

Yuval Filmus Puntos 123

Desde Sklearn 0.13 existe una implementación de la función HashingVectorizer .

EDITAR: He aquí una ejemplo completo de este tipo de aplicación de sklearn docs

Básicamente, este ejemplo demuestra que se puede clasificar texto sobre datos que no caben en la memoria principal del ordenador (sino en disco / red / ...).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X