Ejercicio de aplicación con Word2Vec

Autor: | Última modificación: 12 de abril de 2024 | Tiempo de Lectura: 3 minutos
Temas en este post: , ,

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este post veremos un ejercicio de aplicación con Word2Vec, una de las técnicas más populares para aprender word embeddings usando redes neuronales superficiales.

Uno de los conceptos que tiene Word2Vec es que nos puede ser útil para obtener cuáles son las palabras más similares, dado un vocabulario. Además, nos sirve para la parte previa de un entrenamiento de redes, para hacer una representación vectorial de las palabras.

Ejercicio de aplicación con Word2Vec

Este ejercicio de aplicación con Word2Vec nos permitirá, una vez tengamos nuestro modelo entrenado, pasarle una palabra para que, después, él sea capaz de decirnos cuál es la palabra más similar, con base en el espacio vectorial en el que esté.

Entonces, veamos qué necesitamos para resolver este ejercicio de aplicación con Word2Vec.

Importamos las librerías

Para usar Word2Vec utilizaremos Gensim y empleamos la función de LineSentence para hacer el parseo del dataset:

#Ejercicio de aplicación con Word2Vec
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
#Ejercicio de aplicación con Word2Vec
! wget https://transfer.sh/KWNxRn/datasets.zip
! wget https://transfer.sh/XoRKUW/utils.py

Vamos a descomprimir los datos:

#Ejercicio de aplicación con Word2Vec
! unzip datasets.zip

Ahora vamos a hacer el parseo del dataset para obtener el corpus, línea a línea, de nuestro documento. Vamos a limitar un poco el tamaño a 1000, porque si no nos quedaríamos fácilmente sin memoria RAM y el proceso tardaría muchísimo.

#Ejercicio de aplicación con Word2Vec
corpus = LineSentence ('./datasets/ spanish_news_ corpus_doc.txt', limit = 1000)

Cuando vayamos a ejecutar el modelo es muy importante limitar el tamaño en el «limit», ya que podría causar conflictos de procesamiento.

Hiperparámetros

Ahora estableceremos los parámetros. Vamos a entrenar dos modelos de Word2Vec, uno con sg params y otro con cbow params, para ver un poco las diferencias entre ellos.

Les vamos a poner a los modelos un tamaño de 200 del vector, es decir, para cada palabra de nuestro vocabulario nos va a generar un vector de un tamaño de 200. También pondremos una ventana de 10, esto quiere decir que va a utilizar, para cada palabra, las 10 palabras anteriores y las 10 palabras siguientes que tenga en el texto. Asimismo, se considerarán solo las palabras que tengan un mínimo de 5 apariciones; las que tengan menos no se tendrán en cuenta.

Por último, le diremos al algoritmo que es negative sampling, es decir, que solo nos actualiza los pesos de la red cada 20 iteraciones:

#Ejercicio de aplicación con Word2Vec
sg_params = {
          'size' : 20,
          'window' : 10,
          'min_count' : 5,
          'sg' : 1,
          'hs' : 0,
          'negative' : 20,
}

cbow_params = {
          'size' : 20,
          'window' : 10,
          'min_count' : 5,
          'sg' : 0,
          'hs' : 0,
          'negative' : 20,
}

Inicializamos los objetos Word2Vec

Ahora hacemos los dos modelos y le pasamos los parámetros:

#Ejercicio de aplicación con Word2Vec
#Skip Gram
w2v_sg = Word2Vec (** sg_params)

#CBOW
w2v_cbow = Word2Vec (** cbow_params)

Construimos el vocabulario

Lo primero que haremos en este proceso es generar el vocabulario. Word2Vec tiene una opción que nos hace la separación de las frases en tokens:

#Ejercicio de aplicación con Word2Vec
#Skip Gram
w2v_sg. build_vocab (corpus)

#CBOW
w2v_cbow. build_vocab (corpus)

Vemos cuántas palabras tiene el vocabulario:

#Ejercicio de aplicación con Word2Vec
print ('Vocabulario compuesto por {} palabras'.format (len (w2v_sg.wv.vocab)))

Vocabulario compuesto por 8606 palabras.

#Ejercicio de aplicación con Word2Vec
print ('Vocabulario compuesto por {} palabras'.format (len (w2v_cbow.wv.vocab)))

Vocabulario compuesto por 8606 palabras.

Entrenamos los pesos de los embeddings

El siguiente paso es entrenar nuestros modelos, el de skip y el de cbow:

#Ejercicio de aplicación con Word2Vec
#Skip Gram
w2v_sg.train (sentences = corpus, total_examples = w2v_sg. corpus_count, epochs = 10)

(2979128, 4792830)

#Ejercicio de aplicación con Word2Vec
#CBOW
w2v_cbow.train (sentences = corpus, total_examples = w2v_cbow. corpus_count, epochs = 10)

(2978250, 4792830)

Internamente, el Word2Vec es un componente que tiene los tamaños del size (en este caso son 200 neuronas).

Guardamos los modelos

#Ejercicio de aplicación con Word2Vec
w2v_sg.save ('./w2v_sg_ d300_mc5_ w10.pkl')
w2v_cbow.save ('./w2v_sg_ d300_mc5_ w10.pkl')

Algunos resultados

#Ejercicio de aplicación con Word2Vec
print_sim_words ('elecciones', w2v_cbow, w2v_sg)
print_sim_words ('botín', w2v_cbow, w2v_sg)
print_sim_words ('sánchez', w2v_cbow, w2v_sg)
print_sim_words ('impeachment', w2v_cbow, w2v_sg)
Ejercicio de aplicación con Word2Vec
Ejercicio de aplicación con Word2Vec
Ejercicio de aplicación con Word2Vec

¿Quieres seguir avanzando?

Ahora que hemos visto cómo se elabora y desarrolla un ejercicio de aplicación con Word2Vec, podemos dar el siguiente paso en nuestro proceso formativo. Para acceder a las opciones laborales del Big Data, una de las áreas en el mundo de la industria tech mejor pagadas y más demansadas, tenemos para ti el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Con esta formación de alta calidad adquirirás los conocimientos imprescindibles para conseguir el trabajo de tus sueños en pocos meses. ¡No esperes más para impulsar tu futuro y solicita información ahora!

Artículos ms leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado