30 votos

¿Cómo se adapta R a las tareas de clasificación de textos?

Estoy tratando de ponerme al día con R. Eventualmente quiero usar las bibliotecas de R para hacer la clasificación de textos. Me preguntaba cuáles son las experiencias de la gente con respecto a la escalabilidad de R cuando se trata de hacer la clasificación de texto.

Es probable que me encuentre con datos de alta dimensión (~300k dimensiones). Estoy estudiando el uso de SVM y Random Forest en particular como algoritmos de clasificación.

¿Las bibliotecas R se adaptarían al tamaño de mi problema?

Gracias.

EDIT 1: Sólo para aclarar, mi conjunto de datos es probable que tenga 1000-3000 filas (tal vez un poco más) y 10 clases.

EDIT 2: Dado que soy muy nuevo en R, pediré a los carteles que sean más específicos cuando sea posible. Por ejemplo, si sugieren un flujo de trabajo o una línea de trabajo, por favor, asegúrense de mencionar las bibliotecas de R involucradas en cada paso, si es posible. Algunas indicaciones adicionales (ejemplos, código de muestra, etc.) serían la guinda del pastel.

EDITAR 3: En primer lugar, gracias a todos por vuestros comentarios. Y en segundo lugar, pido disculpas, tal vez debería haber dado más contexto para el problema. Soy nuevo en R pero no tanto en la clasificación de textos. Ya he hecho un preprocesamiento (stemming, eliminación de palabras clave, conversión tf-idf, etc.) en una parte de mis datos utilizando tm tm era tan lento incluso con 200 documentos que me preocupaba la escalabilidad. Entonces empecé a jugar con FSelector e incluso eso era realmente lento. Y ese es el punto en el que hice mi OP.

EDIT 4: Se me acaba de ocurrir que tengo 10 clases y unos ~300 documentos de entrenamiento por clase, y que de hecho estoy construyendo la matriz términoXdoc a partir de todo el conjunto de entrenamiento, lo que resulta en una dimensionalidad muy alta. Pero, ¿qué tal si reducimos cada problema de clasificación de 1 de k a una serie de problemas de clasificación binaria? Eso reduciría drásticamente el número de documentos de entrenamiento (y por tanto la dimensionalidad) en cada uno de los k-1 pasos de forma considerable, ¿no es así? Entonces, ¿es bueno este enfoque? ¿Cómo se compara en términos de precisión con la implementación habitual de varias clases?

17voto

Nikos Alexandris Puntos 764

Tal y como se pedía en un comentario, he aquí algunas indicaciones sobre los pasos del proceso. Se pueden encontrar varias herramientas en el Vista de tareas de CRAN para el procesamiento del lenguaje natural . También es posible que desee consultar este documento sobre la tm (minería de textos) para R .

  1. Antes del procesamiento, considere la normalización de los tokens de palabras. openNLP (para el que existe un paquete R) es una vía.
  2. Para el tratamiento de textos, un paso común de preprocesamiento es normalizar los datos mediante tf.idf -- frecuencia de términos * frecuencia inversa de documentos - ver la entrada de Wikipedia para más detalles. Hay otras normalizaciones más recientes, pero este es un método de pan y mantequilla, por lo que es importante conocerlo. Puede implementarlo fácilmente en R: simplemente almacene (docID, wordID, freq1, freq2) donde freq1 es el recuento de veces que la palabra indexada por wordID ha aparecido en el documento dado y freq2 es el # de documentos en los que aparece. No es necesario almacenar este vector para las palabras que no aparecen en un documento determinado. Entonces, simplemente tome freq1 / freq2 y tendrá su valor tf.idf.
  3. Después de calcular los valores de tf.idf, puede trabajar con toda la dimensionalidad de sus datos o filtrar aquellas palabras que son esencialmente poco informativas. Por ejemplo, cualquier palabra que aparezca en un solo documento no va a dar mucha información. Esto puede reducir sustancialmente la dimensionalidad. Dado el pequeño número de documentos que se examinan, es posible que la reducción a sólo 1K dimensiones sea apropiada.
  4. Yo no volvería a centrar los datos (por ejemplo, para PCA), pero puede almacenar los datos ahora en una matriz de términos (donde las entradas son ahora los valores de tf.idf) con facilidad, utilizando las matrices dispersas, como se admite en el Matrix paquete.

Llegados a este punto, se tiene un conjunto de datos bien preprocesado. Yo recomendaría proceder con las herramientas citadas en la vista de tareas de CRAN o el paquete de minería de texto. La agrupación de los datos, por ejemplo, mediante la proyección en los primeros 4 o 6 componentes principales, podría ser muy interesante para su grupo cuando se grafiquen los datos.

Otra cosa: puede encontrar que la reducción de la dimensionalidad en la línea de PCA (*) puede ser útil cuando se utilizan varios métodos de clasificación, ya que está esencialmente agregando las palabras relacionadas. Los primeros 10-50 componentes principales pueden ser todo lo que necesita para la clasificación de documentos, dado el tamaño de su muestra.

(*) Nota: El PCA es sólo un primer paso. Puede ser muy interesante para alguien que acaba de empezar con la minería de textos y el PCA, pero con el tiempo puede encontrar que es un poco molesto para los conjuntos de datos dispersos. Como primer paso, sin embargo, eche un vistazo, especialmente a través de la prcomp y princomp funciones.

Actualización: No he indicado una preferencia en esta respuesta - recomiendo prcomp en lugar de princomp .

5voto

Nikos Alexandris Puntos 764

Primero, ¡bienvenido! El procesamiento de textos es muy divertido, y hacerlo en R es cada vez más fácil.

La respuesta corta: sí - las herramientas en R son ahora bastante buenas para tratar con este tipo de datos. De hecho, no hay nada especial en R, C++, Groovy, Scala o cualquier otro lenguaje cuando se trata de almacenar datos en la RAM: todos los lenguajes almacenan un doble flotante de 8 bytes en... espere... espere... ¡8 bytes!

Los algoritmos y su implementación sí importan, especialmente si se implementan muy mal en cuanto a estructuras de datos y complejidad computacional. Si estás implementando tus propios algoritmos, ten cuidado. Si utilizas otro código, se aplica el caveat emptor, como ocurre en cualquier entorno.

En el caso de R, tendrá que tener en cuenta:

  1. Su representación de los datos (mire las matrices dispersas, especialmente en el Matrix paquete)
  2. Almacenamiento de datos (quizás mapeado en memoria, utilizando bigmemory o ff ; o distribuido, utilizando Hadoop)
  3. Su partición de datos (la cantidad de datos que puede caber en la RAM depende de la cantidad de RAM que tenga)

El último punto está realmente bajo tu control.

Cuando se trata de esta dimensionalidad, ya no es particularmente grande. El número de observaciones tendrá un mayor impacto, pero puedes dividir tus datos para ajustar el uso de la RAM, así que no hay mucho de qué preocuparse.

3voto

Estoy de acuerdo con crayola en que el número de filas es crucial aquí. Para la RF necesitarás al menos 3 veces más RAM que los pesos de tu conjunto de datos y probablemente mucho tiempo (tal número de atributos suele requerir muchos árboles en el bosque -- y ten en cuenta que no hay una implementación paralela de la RF en R).

Sobre el SVM, dudo que sea una buena idea luchar con 300k dimensiones mientras que probablemente puedas desarrollar una función de kernel que sea equivalente a tus descriptores de texto.

EDITAR: Una matriz de 3k x 30k (real) ocuparía algo así como 7Gb, así que todo lo que necesitas para hacer RF (usando randomForest) sobre estos datos es un ordenador con 16GB de RAM, algo de suerte y bastante tiempo o simplemente un ordenador con 24GB de RAM y bastante tiempo.

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