En un post anterior vimos la importancia de las representaciones distribuidas en machine learning y cómo permiten captar la estructura estadística y los factores que explican la variación de los datos.
En el procesamiento del lenguaje natural también es muy importante cómo representemos el texto ya que nos condicionará el proceso de aprendizaje. La representación que hagamos de los elementos del lenguaje (sean fonemas, sílabas, letras, palabras, …) se utilizará en las siguientes fases del procesamiento para realizar las tareas concretas (predicción, clasificación, traducción, extracción de significado, etc.)
La representación puede verse como una aplicación que mapea los elementos del lenguaje a vectores de números reales.
Una manera natural de representar un vocabulario de N palabras es utilizar vectores de longitud N donde cada digito n indica la presencia de la palabra n del vocabulario. Por ejemplo si el vocabulario fuera [la, casa, verde, bonita, …], el mensaje “la casa bonita” se representaría con los vectores […0001], […0010], […1000].
Pero este tipo de representación local “one-hot” tiene varios problemas:
- El número de dimensiones crece con el tamaño del vocabulario llegando incluso a tener representaciones de millones de dimensiones.
- Las representaciones no capturan la similitud entre las diferentes palabras.
En los años 2000 Yoshua Bengio y sus colaboradores propusieron el uso de representaciones distribuidas. Para ello el modelo usaba la proximidad semántica de las palabras asignando una alta probabilidad a secuencias de palabras que eran similares a palabras que ya habían sido vistas en secuencias anteriores.
De hecho, representar las palabras usando las palabras próximas se considera una de las ideas más relevantes del procesamiento estadístico de lenguaje natural.
En estas representaciones distribuidas se mapean las palabras en vectores de cientos de dimensiones donde cada dimensión representa un aspecto de similitud. De esta forma, palabras cuyos vectores de representación estén próximos entre sí serán palabras relacionadas.
Por ejemplo podríamos representar las siguientes palabras:
- Titulizaciones: (0.3, 0.4, 0,7, …)
- Bancos: (0.2, 0.4, 0.1, …)
- Empresas: (0.8, 0.7, 0.1, …)
- Clientes: (0.7, 0.8, 0.1, …)
Vemos que las palabras titulizaciones y bancos están próximas en determinados aspectos mientras que bancos, empresas y clientes están próximas en otros aspectos de similitud.
Estas representaciones nos permitirán verificar aspectos de similitud simplemente mediante una sustracción de vectores en el nuevo espacio vectorial creado.
Por ejemplo, desde el punto de vista sintáctico la diferencia entre gato y gatos es la misma que entre perro y perros y coche y coches: Xgato – Xgatos ≈ Xperro – Xperros ≈ Xcoche -Xcoches. En este caso la sustracción capta una relación singular-plural.
También, desde el punto de vista semántico la diferencia entre volante y coche sería similar a la relación entre procesador y ordenador: Xvolante – Xcoche ≈ Xprocesador – Xordenador. En este caso la sustracción capta una relación de pertenencia.
Un avance importante fue el desarrollo por parte de Tomas Mikolov de word2vec, modelos que usan redes neuronales para obtener representaciones distribuidas de palabras. Este modelo, que funciona mucho más rápido que los anteriores, toma como entrada un cuerpo de texto y produce un espacio vectorial de varios cientos de dimensiones asignando a cada palabra del cuerpo un vector en el espacio.
En Python es muy intuitivo trabajar con representaciones de palabras usando la librería Gensim, que permite obtener representaciones word2vec y visualizarlas.
Por lo tanto, hemos visto como el uso de representaciones distribuidas en procesamiento de lenguaje natural permite extraer muchas más información y realizar un procesado más eficiente que las representaciones locales.
Muy buen aporte. Gracias por compartirlo.