Word embeddings y skip-gram

En posts anteriores vimos que las representaciones distribuidas de las palabras permiten extraer mucha información y han mejorado el rendimiento de las aplicaciones de procesamiento de lenguaje natural.

Los Word embeddings son un claro ejemplo de la importancia y el potencial del aprendizaje no supervisado de representaciones. A partir de un cuerpo de texto de entrada producen un espacio vectorial, de cientos de dimensiones, asignando a cada palabra del corpus un elemento de este espacio.

Word2vec, creado en 2013 por Tomas Mikolov en Google, es uno de los modelos más usados. Se basa en el uso de redes neuronales de varias capas y tiene dos posibles arquitecturas: Skip-gram y CBOW.

En el caso del modelo skip-gram, usa la palabra actual para predecir las palabras vecinas (contexto) dentro de una ventana indicada. Este modelo da más importancia a las palabras más cercanas a la palabra objetivo que a las lejanas.

Es importante recalcar cómo una restricción a priori tan básica, como predecir las palabras contexto en función de la palabra central, puede proporcionar una representación de las palabras tan útil semántica y sintácticamente. Al contrario que en los modelos supervisados, donde es necesario etiquetar las entradas, en este tipo de modelos los condicionantes y las etiquetas para aprender se autogeneran a partir de la entrada.

Como se puede ver en la figura, una forma de implementar este modelo es generar pares de palabras objetivo-contexto que suelen aparecer juntas en el texto y pares de palabras que no aparecen juntas (generadas aleatoriamente). La red neuronal se entrena para predecir 1 o 0 dependiendo de si el par de palabras está vinculado o no.

Word2vec skip-gram

Por ejemplo si consideramos la siguiente frase:

“Me gusta ir a pasear por la montaña”.

Se generarían los siguientes pares de entradas positivas y negativas:

((gusta, me), 1), ((gusta, ir), 1), ((ir, gusta), 1), ((ir, a), 1), ((a, ir), 1), ((a, pasear), 1)…..

((gusta, coste), 0), ((gusta, elemento), 0), ((ir, abajo), 0), ((ir, pies), 0), ((a, cortado), 0), ((a, sábado), 0)…..

Una vez entrenada por descenso de gradiente, los parámetros de la capa de embedding (matriz de parámetros) serán los valores de los elementos del espacio de representaciones para cada palabra.

Como se puede ver, con una red neuronal de únicamente dos capas se pueden extraer representaciones de palabras muy útiles para realizar tareas de procesamiento de lenguaje natural como categorización, traducción, predicción, síntesis, etc.

El modelo visto de skip-gram se puede implementar fácilmente en Keras y con la librería Gensim.

Un ejemplo en Keras se puede encontrar en el siguiente repositorio de Github.

También es muy sencillo, como vimos en un post, usando la librería Gensim, creada y mantenida por Radim Řehůřek. A continuación se puede ver un ejemplo:


from gensim.models import Word2Vec

# definir los datos
sentences = [['la', 'banca', 'minorista', 'es', 'clave', 'para', 'el', 'funcionamiento', 'de', 'la', 'economia', 'domestica'],
['la', 'economia', 'domestica', 'depende', 'del', 'credito'],
['Hay', 'mucha', 'relacion', 'entre', 'la', 'economia', 'domestica', 'y', 'el', 'credito'],
['el', 'credito', 'de', 'la', 'banca', 'minorista', 'mejora', 'la', 'economia', 'domestica']]

# entrenar el modelo
model = Word2Vec(sentences, min_count=1)

# mostrar principales parámetros del modelo
print(model)

# mostrar las representaciones
X = model[model.wv.vocab]
words = list(model.wv.vocab)
print(X)

# mostrar las palabras más similares
print(model.most_similar('economia'))

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Orgullosamente ofrecido por WordPress | Tema: Baskerville 2 por Anders Noren.

Subir ↑

A %d blogueros les gusta esto: