Clasificación de texto utilizando redes neuronales

neuralnetwork

En esta serie de artículos abordaremos algunas de las técnicas que utilizamos para realizar el tratamiento de información tanto estructurada como no estructurada.

En este artículo, revisamos un ejemplo de procesamiento de texto, para clasificación en base a la semántica del mismo, usando redes neuronales. Su aplicación puede ser en varios temas, como por ejemplo, clasificación de usuarios en base a sus temáticas, chatbots, entre otros.

Usaremos 2 capas de neuronas (1 capa oculta) y un enfoque de “bolsa de palabras” para organizar nuestros datos de entrenamiento. La clasificación del texto viene en 3 sabores: patrones, algoritmos, redes neurales. Mientras que el enfoque algorítmico que utiliza Multinomial Naive Bayes es sorprendentemente eficaz, sufre de 3 defectos fundamentales:

  1. El algoritmo produce una puntuación en lugar de una probabilidad. Queremos una probabilidad de ignorar las predicciones por debajo de cierto umbral. Esto se asemeja a un ‘squelch’ dial en un radio VHF.
  2. El algoritmo “aprende” a partir de ejemplos de lo que está en una clase, pero no lo que no lo es. Este aprendizaje de los patrones de lo que no pertenece a una clase es a menudo muy importante.
  3. Las clases con conjuntos de entrenamiento desproporcionadamente grandes pueden crear puntuaciones de clasificación distorsionadas, obligando al algoritmo a ajustar las puntuaciones en relación con el tamaño de la clase. Esto no es ideal.

Al igual que con su homólogo “Naive”, este clasificador no está intentando entender el significado de una sentencia, sino que trata de clasificarlo. De hecho, los llamados “robots de chat de AI” no entienden el lenguaje, pero esa es otra historia.
Examinemos nuestro clasificador de texto una sección a la vez. Tomaremos los siguientes pasos:

  1. Consulte las bibliotecas que necesitamos
  2. Proporcionar datos de entrenamiento
  3. Organizar nuestros datos
  4. Iterar: codificar + probar los resultados + afinar el modelo
  5. abstraer

El código está aquí, estamos usando notebooks de iPython que es una manera súper productiva de trabajar en proyectos de data science. La sintaxis de código es Python.
Comenzamos por importar nuestro juego de herramientas de lenguaje natural. Necesitamos una forma de cifrar de forma fiable las oraciones en palabras y una manera de contener las palabras.

Y nuestros datos de entrenamiento, 12 sentencias que pertenecen a 3 clases distintas (‘intents’).

12 sentencias en los datos de entrenamiento

Podemos organizar ahora nuestras estructuras de datos para documentos, clases y palabras.

12 documents

3 classes [‘greeting’, ‘goodbye’, ‘sandwich’]

26 unique stemmed words [‘sandwich’, ‘hav’, ‘a’, ‘how’, ‘for’, ‘ar’, ‘good’, ‘mak’, ‘me’, ‘it’, ‘day’, ‘soon’, ‘nic’, ‘lat’, ‘going’, ‘you’, ‘today’, ‘can’, ‘lunch’, ‘is’, “‘s”, ‘see’, ‘to’, ‘talk’, ‘yo’, ‘what’]

Observe que cada palabra es derivada y en minúsculas. El stemming ayuda a la máquina a igualar palabras como “tener” y “tenerlo”. No nos importa si es mayúscula o minúscula. Nuestros datos de entrenamiento se transforman en “bolsa de palabras” para cada oración.

[‘how’, ‘ar’, ‘you’, ‘?’]
[0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0]

El paso anterior es un clásico en la clasificación de texto: cada frase de entrenamiento se reduce a una matriz de 0 y 1 contra la matriz de palabras únicas en el corpus.

[‘how’, ‘are’, ‘you’, ‘?’]

Se deriva (stemming):

[‘how’, ‘ar’, ‘you’, ‘?’]

Luego se transforma en entrada: un 1 para cada palabra en la bolsa (se ignora el ?),

[0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

y la salida: la primera clase

[1, 0, 0]

Tenga en cuenta que una oración podría darse varias clases, o ninguna.
Asegúrese de que lo anterior tenga sentido y juegue con el código.
Su primer paso en el aprendizaje automático es tener datos limpios.

A continuación tenemos nuestras funciones básicas para nuestra red neuronal de 2 capas. Usamos numpy porque queremos que nuestra multiplicación matricial sea rápida.

Utilizamos una función sigmoide para normalizar valores y su derivada para medir la tasa de error. Iterar y ajustar hasta que nuestra tasa de error sea aceptablemente baja. También a continuación implementamos nuestra función de bolsa de palabras, transformando una frase de entrada en una matriz de 0 y 1. Esto coincide exactamente con nuestra transformación para los datos de entrenamiento, siempre es crucial para conseguir esto correcto.

Y ahora codificamos nuestra función de entrenamiento de red neuronal para crear pesos sinápticos. No se emocione demasiado, esto es principalmente la multiplicación matricial – de la clase de matemáticas de la escuela.

Ahora estamos listos para construir nuestro modelo de red neuronal, lo guardaremos como una estructura json para representar nuestros pesos sinápticos. Debe experimentar con diferentes ‘alfa’ (parámetro de descenso de gradiente) y ver cómo afecta a la tasa de error. Este parámetro ayuda a nuestro ajuste de error a encontrar la tasa de error más baja:

synapse_0 += alpha * synapse_0_weight_update

gradient

Usamos 20 neuronas en nuestra capa oculta, puedes ajustar esto fácilmente. Estos parámetros variarán dependiendo de las dimensiones y la forma de los datos de entrenamiento, ajustarlos a ~ 10 ^ -3 como una tasa de error razonable.

Training with 20 neurons, alpha:0.1, dropout:False 
Input matrix: 12x26    Output matrix: 1x3
delta after 10000 iterations:0.0062613597435
delta after 20000 iterations:0.00428296074919
delta after 30000 iterations:0.00343930779307
delta after 40000 iterations:0.00294648034566
delta after 50000 iterations:0.00261467859609
delta after 60000 iterations:0.00237219554105
delta after 70000 iterations:0.00218521899378
delta after 80000 iterations:0.00203547284581
delta after 90000 iterations:0.00191211022401
delta after 100000 iterations:0.00180823798397
saved synapses to: synapses.json
processing time: 6.501226902008057 seconds

 

El archivo synapse.json contiene todos los pesos sinápticos, esto es nuestro modelo. Esta función classify () es todo lo que se necesita para la clasificación una vez que se han calculado los pesos de sinapsis: ~ 15 líneas de código. La captura: si hay un cambio en los datos de entrenamiento, nuestro modelo tendrá que ser re-calculado. Para un conjunto de datos muy grande esto podría tomar una cantidad de tiempo no insignificante. Ahora podemos generar la probabilidad de una oración perteneciente a una (o más) de nuestras clases. Esto es super rápido porque es un cálculo de punto-producto en nuestra función think () previamente definida.

sudo make me a sandwich
[[‘sandwich’, 0.99917711814437993]]
how are you today?
[[‘greeting’, 0.99864563257858363]]
talk to you tomorrow
[[‘goodbye’, 0.95647479275905511]]
who are you?
[[‘greeting’, 0.8964283843977312]]
make me some lunch
[[‘sandwich’, 0.95371924052636048]]
how was your lunch today?
[[‘greeting’, 0.99120883810944971], [‘sandwich’, 0.31626066870883057]]

Experimente con otras oraciones y diferentes probabilidades, a continuación, puede agregar datos de entrenamiento y mejorar / ampliar el modelo. Observe las sólidas predicciones con pocos datos de entrenamiento.
Algunas oraciones producirán predicciones múltiples (por encima de un umbral). Deberá establecer el umbral correcto para su aplicación. No todos los escenarios de clasificación de texto son los mismos: algunas situaciones predictivas requieren más confianza que otras.
La última clasificación muestra algunos detalles internos:

found in bag: good
found in bag: day
sentence: good day
bow: [0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
good day
[[‘greeting’, 0.99664077655648697]]

Observe la bolsa de palabras (bow) para la oración, 2 palabras coincidentes con nuestro corpus. La red neuronal también aprende de los 0, las palabras no coincidentes.
Una clasificación de baja probabilidad se muestra fácilmente proporcionando una oración donde ‘a’ (palabra común) es la única coincidencia, por ejemplo:

found in bag: a
sentence: a burrito!
bow: [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
a burrito!
[[‘sandwich’, 0.61776860634647834]]

Aquí usted tiene una pieza fundamental de la maquinaria para construir un chat-bot, capaz de manejar un gran número de clases (‘intenciones’) y apto para clases con datos de entrenamiento limitados o extensos (‘patrones’). Agregar una o más respuestas a una intención es trivial.

Fuente: https://machinelearnings.co/text-classification-using-neural-networks-f5cd7b8765c6

admin


This entry has 0 replies

Comments open

Leave a reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>