Clasificación de texto a gran escala

18

Estoy buscando hacer una clasificación en mis datos de texto. Tengo 300 classes200 documentos de capacitación por clase (más o menos 60000 documents in total) y es probable que esto genere datos dimensionales muy altos (es posible que estemos buscando más de 1 millón de dimensiones ).

Me gustaría realizar los siguientes pasos en la tubería (solo para darle una idea de cuáles son mis requisitos):

  1. Convertir cada documento en un vector de características ( tf-idfo vector space model)
  2. Feature selection( Mutual Informationbasado preferiblemente, o cualquier otro estándar)
  3. El entrenamiento del clasificador ( SVM, Naive Bayes, Logistic Regressiono Random Forest)
  4. Predicción de datos no vistos basados ​​en el modelo de clasificador entrenado.

Entonces, la pregunta es ¿qué herramientas / marco utilizo para manejar datos tan dimensionales? Soy consciente de los sospechosos habituales (R, WEKA ...) pero hasta donde yo sé (puedo estar equivocado) posiblemente ninguno de ellos pueda manejar datos tan grandes. ¿Hay alguna otra herramienta lista para usar que pueda mirar?

Si tengo que paralelizarlo, ¿debería estar mirando Apache Mahout ? Parece que aún no puede proporcionar la funcionalidad que necesito.

Gracias a todos de antemano.


Actualización: busqué en este sitio web , en la lista de correo de R y en Internet en general. Me parece que los siguientes problemas podrían surgir en mi situación:

(1) El preprocesamiento de mis datos utilizando R ( paquete tm en particular) podría no ser práctico , ya tmque será prohibitivamente lento.

(2) Dado que necesitaré usar un conjunto de paquetes 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 datos de un formato a otro . Por ejemplo, si realizo mi preprocesamiento utilizando tm(o una herramienta externa como WEKA), tendré que encontrar una manera de convertir estos datos en un formulario que las bibliotecas de HPC en R puedan leer. Y de nuevo, no me queda claro si los paquetes de clasificadores tomarían directamente los datos proporcionados por las bibliotecas de HPC.

¿Estoy en el camino correcto? Y lo más importante, ¿tengo sentido?

usuario721975
fuente
R puede manejar conjuntos de datos mucho más grandes que esto, solo necesita hacer un buen uso de las herramientas disponibles. No hay diferencia entre lo que se puede lograr en cualquier idioma o entorno principal, aunque Weka y Mahout se retrasan en términos de lo que está disponible. FWIW, este es un tamaño de muestra bastante pequeño, y las dimensiones de 1M no son grandes, pero también es excesivamente estadístico. Mis recomendaciones son R o Python, ya que son gratuitas y fáciles para principiantes. Matlab no es gratis, pero también es bueno. También incurre en un gran impuesto cuando usas muchas computadoras.
Iterator
1
Un punto mucho más destacado es que tiene más clases que ejemplos por clase y lo está incrustando en un espacio dimensional muy alto. No estoy seguro de que va a obtener una muy buena separación de clases aquí. ¿Tienes algunas relaciones estructurales para tus clases? Si es así, algunos de estos métodos pueden funcionar mal sin esa idea.
Iterator
1
Puede usar el foreachcódigo paralelo de escritura de la biblioteca en R. Esto funciona especialmente bien en combinación con bosques aleatorios, que son inherentemente fáciles de paralelizar.
Zach
2
Algunas preguntas: 1) ¿Está interesado en comparar todos los diferentes tipos de enfoques de aprendizaje que menciona, o simplemente necesita uno para hacer un trabajo? 2) ¿Cada documento pertenece a 1, 1 o más, o 0 o más de las clases? 3) ¿ Desea utilizar específicamente la selección de funciones por algún motivo, o simplemente pensó que era necesario? Estoy de acuerdo con los otros comentarios de que este es un problema modesto para los estándares actuales, y que la reducción de la dimensionalidad no es necesaria.
DavidDLewis
1
Estoy trabajando en la clasificación de texto que involucra casi 10,000 temas (por ejemplo, clases o categorías o cualquier término que prefiera). Actualmente estoy trabajando en ajustar este sistema de clasificación de texto a esta escala. No puedo compartir mis propias técnicas, ya que son patentadas, pero tengo un pequeño consejo: tenga mucho cuidado al suponer que algunas técnicas sugeridas escalan a menos que ya se haya demostrado que lo hace. En mi experiencia, muy pocos lo hacen.

Respuestas:

13

Esto debería ser posible para que funcione siempre y cuando los datos se representen como una estructura de datos dispersa, como la scipy.sparse.csr_matrixinstancia en Python. Escribí un tutorial para trabajar en datos de texto . Es posible reducir aún más el uso de la memoria aprovechando el truco de hash: adaptarlo para usar el en HashingVectorizerlugar del CountingVectorizero el TfidfVectorizer. Esto se explica en la sección de documentación extracción de características de texto .

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

Si scikit-learn no puede adaptarse 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á hablando.

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

ogrisel
fuente
Bueno, el problema con el uso de cualquier técnica de reducción de dimensiones "no estándar" es que es probable que tenga problemas cuando intente publicar su trabajo. Al menos en el campo de clasificación de texto, sé con certeza que a los revisores les gusta ver las técnicas de uso común (también facilita la comparación con las técnicas de clasificación existentes).
user721975
No se preocupe: @ogrisel no mencionó nada no estándar, al menos no en lo que respecta a la clasificación de texto de vanguardia, aunque todavía no he leído sus tutoriales.
Iterator
+1 Creo que Python es probablemente una forma divertida de hacerlo. Hay algunos paquetes muy recientes en R para la minería de texto, pero si uno tiene más experiencia e intereses computacionales que estadísticos, Python sería mi recomendación.
Iterador
@ogrisel: Felicitaciones por las contribuciones que usted y otros han hecho para aprender. Se lo he recomendado a muchos que trabajan en Python: todo el diseño es ejemplar.
Iterator
En cuanto a la reducción de dimensiones "no estándar" (usando proyecciones aleatorias) y el hashing de características, verifique el truco de hashing de John Langford y esta discusión sobre metaoptimize .
Ogrisel
10

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

Jeff
fuente
1

No para sonar mi propia bocina, pero hice una serie de videos bastante popular sobre análisis de texto con Rapidminer. Puedes verlo aqui:

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

Es probable que pueda evitar la selección de funciones, solo use un clasificador que no cree una matriz de millones * millones en la memoria :)

La regresión logística se ahogará en tantas dimensiones. Naive Bayes asume dimensiones independientes, por lo que estará bien. SVM no depende de la cantidad de dimensiones (sino de la cantidad de vectores de soporte), por lo que también estará bien.

Sin embargo, 300 son muchas clases. Comenzaría con solo unos pocos y avanzaría.

Neil McGuigan
fuente
Gran puntero y consejos. Gracias. ¿Puedes por favor elaborar lo que quieres decir con "comenzar con solo unos pocos y progresar"?
user721975
bueno, en lugar de 300 clases (como "violín, viola, violonchelo, trompeta ..."), podría reclasificarlas a un número menor como "cuerda, metal".
Neil McGuigan
OK, lo entiendo ahora.
user721975
1

Primero, según sus comentarios, trataría esto como 300 problemas de clasificación binarios (sí / no). Hay muchos aprendices de clasificadores binarios de código abierto fáciles de usar, y esto le permite cambiar el tiempo por la memoria.

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

Varios paquetes de aprendizaje automático de código abierto, incluidos WEKA y KNIME , incluyen SVM y regresión logística. Las implementaciones independientes de SVM incluyen libSVM y SVMlight . Para la regresión logística, conectaré 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 forma de vector de atributo, de alguna manera siempre termino escribiendo un poco de Perl para hacerlo desde cero. :-) Pero creo que las suites de aprendizaje automático que mencioné incluyen tokenización y código de vectorización. Otra ruta sería ir con más herramientas de lenguaje natural como LingPipe , aunque eso puede ser excesivo para usted.

DavidDLewis
fuente
+1 Buenos comentarios. Si tuviera que hacer 300 clasificaciones sí / no, ¿cómo elegiría los datos de entrenamiento negativos para una clase? Los datos positivos obviamente son los documentos que pertenecen a la clase.
user721975
Otro comentario SVM / Logistic reg puede manejar con seguridad un millón de dimensiones, pero ¿cómo podría ejecutar experimentos para elegir parámetros para estos clasificadores? Por ejemplo, en un conjunto de datos pequeño, podría ejecutar una validación cruzada 10 veces para decidir los parámetros, pero ¿qué enfoque toma uno para datos tan grandes para que el algoritmo termine de ejecutarse en un tiempo razonable?
user721975
@ user721975: Para una discriminación particular, los documentos positivos son aquellos con la etiqueta X, y los documentos negativos son el resto de los documentos.
DavidDLewis
@ user721975: Es difícil dar consejos generales sobre el tiempo de ejecución, ya que los detalles varían mucho entre algoritmos e implementaciones. La validación cruzada 10 veces puede no ser poco práctica para su conjunto de datos: 60000 ejemplos no son importantes.
DavidDLewis
1
Los conjuntos de entrenamiento desequilibrados no son necesariamente un problema. Pero en realidad me doy cuenta de que hay algo de lo que estoy confundido: dado que los documentos pueden pertenecer a 0, 1 o varias clases, ¿qué quiere decir con tener 200 documentos de capacitación por clase? ¿Hiciste algo para eliminar documentos con 0 clases o 2+ clases? En general, ¿cómo generó este conjunto de 60000 documentos?
DavidDLewis
1

Desde Sklearn 0.13 existe una implementación del HashingVectorizer .

EDITAR: Aquí hay un ejemplo completo de dicha aplicación de sklearn docs

Básicamente, este ejemplo demuestra que puede clasificar el texto en datos que no pueden caber en la memoria principal de la computadora (sino en el disco / red / ...).

oDDsKooL
fuente