Clasificación de texto no estructurado


12

Voy a clasificar documentos de texto no estructurados, es decir, sitios web de estructura desconocida. El número de clases a las que estoy clasificando es limitado (en este momento, creo que no hay más de tres). ¿Alguien tiene una sugerencia de cómo podría comenzar?

¿Es factible aquí el enfoque de "bolsa de palabras"? Más tarde, podría agregar otra etapa de clasificación basada en la estructura del documento (quizás árboles de decisión).

Estoy un poco familiarizado con Mahout y Hadoop, por lo que prefiero las soluciones basadas en Java. Si es necesario, puedo cambiar al motor Scala y / o Spark (la biblioteca ML).

Respuestas:


14

Vamos a resolverlo desde cero. La clasificación (también conocida como categorización) es un ejemplo de aprendizaje supervisado . En el aprendizaje supervisado tienes:

  • modelo : algo que se aproxima a la estructura interna de sus datos, lo que le permite razonar al respecto y hacer predicciones útiles (por ejemplo, predecir la clase de un objeto); normalmente el modelo tiene parámetros que desea "aprender"
  • conjuntos de datos de entrenamiento y prueba : conjuntos de objetos que usa para entrenar su modelo (encontrar buenos valores para los parámetros) y evaluar más
  • algoritmos de entrenamiento y clasificación : primero describe cómo aprender el modelo del conjunto de datos de entrenamiento, segundo muestra cómo derivar la clase de un nuevo objeto dado el modelo entrenado

Ahora tomemos un caso simple de clasificación de spam. Su conjunto de datos de entrenamiento es un corpus de correos electrónicos + etiquetas correspondientes: "spam" o "no spam". El conjunto de datos de prueba tiene la misma estructura, pero está hecho de algunos correos electrónicos independientes (normalmente uno simplemente divide su conjunto de datos y hace, por ejemplo, que 9/10 se utilicen para capacitación y 1/10 para pruebas). Una forma de modelar correos electrónicos es representar cada uno de ellos como un conjunto (bolsa) de palabras. Si suponemos que las palabras son independientes entre sí, podemos usar el clasificador Naive Bayes , es decir, calcular las probabilidades previas para cada palabra y cada clase (algoritmo de entrenamiento) y luego aplicar el teorema de Bayes para encontrar la probabilidad posterior de que un nuevo documento pertenezca clase particular

Entonces, básicamente tenemos:

raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label

Ahora tenga en cuenta que representamos nuestros objetos (documentos) como una bolsa de palabras. Pero es la única manera? De hecho, podemos extraer mucho más del texto sin formato. Por ejemplo, en lugar de palabras tal como están, podemos usar sus tallos o lemas , tirar palabras de parada ruidosas , agregar etiquetas POS de palabras, extraer entidades con nombre o incluso explorar la estructura HTML del documento. De hecho, una representación más general de un documento (y, en general, cualquier objeto) es un vector de características . Por ejemplo, para el texto:

actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
    0,        0,   1,    1, ...,    5,    7,   2, ...,       2, ... | not spam
    0,        1,   0,    0, ...,    3,   12,  10, ...,       0, ... | spam

Aquí la primera fila es una lista de características posibles y las filas posteriores muestran cuántas veces se produce esa característica en un documento. Por ejemplo, en el primer documento no hay palabras "actor", 1 palabra "quemar", 5 sustantivos, 2 adjetivos y 2 textos en negrita. La última columna corresponde a una etiqueta de clase resultante.

Usando el vector de características puede incorporar cualquier propiedad de sus textos. Aunque encontrar un buen conjunto de características puede llevar algo de tiempo.

¿Y qué hay del modelo y los algoritmos? ¿Estamos atados a los ingenuos Bayes? De ningún modo. regresión logística , SVM , árboles de decisión , solo por mencionar algunos clasificadores populares. (Tenga en cuenta que, en la mayoría de los casos, decimos "clasificador" nos referimos a modelos + algoritmos correspondientes para entrenamiento y clasificación).

En cuanto a la implementación, puede dividir la tarea en 2 partes:

  1. Extracción de características: transformación de textos sin formato en vectores de características.
  2. Clasificación de objetos: construcción y aplicación del modelo.

El primer punto está bien resuelto en muchas bibliotecas de PNL . El segundo es sobre el aprendizaje automático, por lo que, dependiendo de su conjunto de datos, puede usar Weka o MLlib .


El póster original usaba la palabra "clasificar", pero "conglomerado" es una descripción más precisa de su problema porque no tiene definiciones a priori de categorías. Por lo tanto, esto no es necesariamente un problema de aprendizaje supervisado.
MrMeritology

@MrMeritology: hmm, desde el contexto, diría que el autor simplemente no está seguro acerca de las clases concretas que va a usar, pero aún quiere clasificación, no agrupación. De todos modos, él es la única persona que sabe la verdad :)
amigo

Tal vez no estaba claro en este punto. Las categorías se seleccionarán en el asesoramiento, por lo que es más bien una clasificación que un problema de agrupamiento. La idea de crear un vector de características complejas parece ser bastante razonable, especialmente porque hay algunas etiquetas particulares, que probablemente clasifiquen rápidamente algunas de las muestras. No estoy seguro de si SVM encajará en el problema, ya que predigo altas no linealidades, pero los árboles de decisión y Bayes parecen ser aplicables. También estoy empezando a pensar en la aplicación de un algoritmo híbrido (árboles de decisión basados ​​en SVM).
Grzegorz E.

@GrzegorzE. - Si sus categorías se definen de antemano, enumere estas tres categorías en su pregunta. En mi opinión, estás demasiado concentrado en los algoritmos de ML y no lo suficiente en la naturaleza de tu problema y la naturaleza de tus datos. Por ejemplo, predice "no lineales" en funciones para sitios web de estructura desconocida. ¿Por qué? Además, está mezclando etiquetas con el texto de la página web con quién sabe qué más, y tienen un significado semántico diferente.
MrMeritology

@GrzegorzE. - Sugiero encarecidamente que su método de clasificación se base principalmente en la naturaleza de sus categorías a priori y la naturaleza de los datos. Hay infinitas formas de clasificar los sitios web arbitrarios en 3 categorías. Cada forma de categorizar sugerirá características sobresalientes en los datos o patrones sobresalientes. No hay sustituto para el análisis manual de elementos de datos individuales (páginas web) y su contexto.
MrMeritology

5

El modelado de temas sería un método muy apropiado para su problema. Los modelos de temas son una forma de aprendizaje / descubrimiento no supervisado, donde un número específico (o descubierto) de temas se define mediante una lista de palabras que tienen una alta probabilidad de aparecer juntas. En un paso separado, puede etiquetar cada tema utilizando expertos en la materia, pero para sus propósitos esto no es necesario ya que solo está interesado en llegar a tres grupos.

Trata cada documento como una bolsa de palabras y procesa previamente para eliminar palabras de detención, etc. Con los métodos más simples, especifica previamente el número de temas. En su caso, puede especificar "3", que es su límite fijo en las categorías, o elegir una mayor cantidad de temas (entre 10 y 100), y luego, en un paso separado, formar tres grupos para documentos con énfasis común en temas Se podrían usar medios K u otros métodos de agrupamiento. (Recomiendo el último enfoque)

No necesita codificar software de modelado de temas desde cero. Aquí hay una página web con muchos recursos, que incluyen bibliotecas / paquetes de software .

Ninguno está en Java, pero hay formas de ejecutar C ++ y Python en Java.


4

Aquí hay un par de paquetes de software de código abierto realmente geniales para la clasificación de texto que deberían ayudarlo a comenzar:

  • MALLET es un kit de herramientas de aprendizaje automático basado en Java con licencia CPL creado por UMass para trabajar con datos de texto. Incluye implementaciones de varios algoritmos de clasificación (p. Ej., Bayes ingenuos, entropía máxima, árboles de decisión).
  • El Stanford Classifier del Stanford NLP Group es una implementación Java con licencia GPL de un clasificador de entropía máxima diseñado para trabajar con datos de texto.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.