Implementación de Word2Vec
Después de comprender cómo funciona Word2Vec, procedamos a implementarlo utilizando Python. La biblioteca Gensim, una herramienta de código abierto robusta para el procesamiento de lenguaje natural, proporciona una implementación sencilla a través de su clase Word2Vec
en gensim.models
.
Preparación de los datos
Word2Vec requiere que los datos de texto estén tokenizados, es decir, divididos en una lista de listas donde cada lista interna contiene las palabras de una oración específica. Para este ejemplo, utilizaremos la novela Emma de la autora inglesa Jane Austen como nuestro corpus. Cargaremos un archivo CSV que contiene oraciones preprocesadas y luego dividiremos cada oración en palabras:
12345678import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') # Split each sentence into words sentences = emma_df['Sentence'].str.split() # Print the fourth sentence (list of words) print(sentences[3])
emma_df['Sentence'].str.split()
aplica el método .split()
a cada oración en la columna 'Sentence'
, resultando en una lista de palabras para cada oración. Dado que las oraciones ya fueron preprocesadas, con palabras separadas por espacios en blanco, el método .split()
es suficiente para esta tokenización.
Entrenamiento del modelo Word2Vec
Ahora, el enfoque está en entrenar el modelo Word2Vec utilizando los datos tokenizados. La clase Word2Vec
ofrece una variedad de parámetros para personalización. Sin embargo, los parámetros más comunes son los siguientes:
vector_size
(100 por defecto): la dimensionalidad o tamaño de los embeddings de palabras;window
(5 por defecto): el tamaño de la ventana de contexto;min_count
(5 por defecto): las palabras que aparecen menos veces que este valor serán ignoradas;sg
(0 por defecto): la arquitectura del modelo a utilizar (1 para Skip-gram, 0 para CBoW).cbow_mean
(1 por defecto): especifica si el contexto de entrada de CBoW se suma (0) o se promedia (1)
En cuanto a las arquitecturas del modelo, CBoW es adecuado para conjuntos de datos grandes y escenarios donde la eficiencia computacional es crucial. Por otro lado, Skip-gram es preferible para tareas que requieren una comprensión detallada de los contextos de palabras, siendo particularmente efectivo en conjuntos de datos pequeños o al tratar con palabras poco frecuentes.
12345678from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() # Initialize the model model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0)
Aquí, establecemos el tamaño de la incrustación en 200, el tamaño de la ventana de contexto en 5, e incluimos todas las palabras configurando min_count=1
. Al establecer sg=0
, elegimos utilizar el modelo CBoW.
La elección del tamaño de la incrustación y la ventana de contexto implica compensaciones. Incrustaciones más grandes capturan más significado pero aumentan el costo computacional y el riesgo de sobreajuste. Ventanas de contexto más pequeñas capturan mejor la sintaxis, mientras que las más grandes capturan mejor la semántica.
Encontrar palabras similares
Una vez que las palabras se representan como vectores, podemos compararlas para medir su similitud. Aunque usar la distancia es una opción, la dirección de un vector suele tener más significado semántico que su magnitud, especialmente en las incrustaciones de palabras.
Sin embargo, usar directamente el ángulo como métrica de similitud no es tan conveniente. En su lugar, podemos utilizar el coseno del ángulo entre dos vectores, también conocido como similitud coseno. Su rango va de -1 a 1, donde valores más altos indican mayor similitud. Este enfoque se centra en cuán alineados están los vectores, independientemente de su longitud, lo que lo hace ideal para comparar significados de palabras. Aquí hay una ilustración:

Cuanto mayor sea la similitud del coseno, más similares serán los dos vectores, y viceversa. Por ejemplo, si dos vectores de palabras tienen una similitud del coseno cercana a 1 (el ángulo cercano a 0 grados), indica que están estrechamente relacionados o son similares en contexto dentro del espacio vectorial.
Ahora, busquemos las 5 palabras más similares a la palabra "man" utilizando la similitud del coseno:
12345678910from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0) # Retrieve the top-5 most similar words to 'man' similar_words = model.wv.most_similar('man', topn=5) print(similar_words)
model.wv
accede a los vectores de palabras del modelo entrenado, mientras que el método .most_similar()
encuentra las palabras cuyas incrustaciones están más cercanas a la incrustación de la palabra especificada, basándose en la similitud del coseno. El parámetro topn
determina el número de palabras top-N más similares a devolver.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 3.45
Implementación de Word2Vec
Desliza para mostrar el menú
Después de comprender cómo funciona Word2Vec, procedamos a implementarlo utilizando Python. La biblioteca Gensim, una herramienta de código abierto robusta para el procesamiento de lenguaje natural, proporciona una implementación sencilla a través de su clase Word2Vec
en gensim.models
.
Preparación de los datos
Word2Vec requiere que los datos de texto estén tokenizados, es decir, divididos en una lista de listas donde cada lista interna contiene las palabras de una oración específica. Para este ejemplo, utilizaremos la novela Emma de la autora inglesa Jane Austen como nuestro corpus. Cargaremos un archivo CSV que contiene oraciones preprocesadas y luego dividiremos cada oración en palabras:
12345678import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') # Split each sentence into words sentences = emma_df['Sentence'].str.split() # Print the fourth sentence (list of words) print(sentences[3])
emma_df['Sentence'].str.split()
aplica el método .split()
a cada oración en la columna 'Sentence'
, resultando en una lista de palabras para cada oración. Dado que las oraciones ya fueron preprocesadas, con palabras separadas por espacios en blanco, el método .split()
es suficiente para esta tokenización.
Entrenamiento del modelo Word2Vec
Ahora, el enfoque está en entrenar el modelo Word2Vec utilizando los datos tokenizados. La clase Word2Vec
ofrece una variedad de parámetros para personalización. Sin embargo, los parámetros más comunes son los siguientes:
vector_size
(100 por defecto): la dimensionalidad o tamaño de los embeddings de palabras;window
(5 por defecto): el tamaño de la ventana de contexto;min_count
(5 por defecto): las palabras que aparecen menos veces que este valor serán ignoradas;sg
(0 por defecto): la arquitectura del modelo a utilizar (1 para Skip-gram, 0 para CBoW).cbow_mean
(1 por defecto): especifica si el contexto de entrada de CBoW se suma (0) o se promedia (1)
En cuanto a las arquitecturas del modelo, CBoW es adecuado para conjuntos de datos grandes y escenarios donde la eficiencia computacional es crucial. Por otro lado, Skip-gram es preferible para tareas que requieren una comprensión detallada de los contextos de palabras, siendo particularmente efectivo en conjuntos de datos pequeños o al tratar con palabras poco frecuentes.
12345678from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() # Initialize the model model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0)
Aquí, establecemos el tamaño de la incrustación en 200, el tamaño de la ventana de contexto en 5, e incluimos todas las palabras configurando min_count=1
. Al establecer sg=0
, elegimos utilizar el modelo CBoW.
La elección del tamaño de la incrustación y la ventana de contexto implica compensaciones. Incrustaciones más grandes capturan más significado pero aumentan el costo computacional y el riesgo de sobreajuste. Ventanas de contexto más pequeñas capturan mejor la sintaxis, mientras que las más grandes capturan mejor la semántica.
Encontrar palabras similares
Una vez que las palabras se representan como vectores, podemos compararlas para medir su similitud. Aunque usar la distancia es una opción, la dirección de un vector suele tener más significado semántico que su magnitud, especialmente en las incrustaciones de palabras.
Sin embargo, usar directamente el ángulo como métrica de similitud no es tan conveniente. En su lugar, podemos utilizar el coseno del ángulo entre dos vectores, también conocido como similitud coseno. Su rango va de -1 a 1, donde valores más altos indican mayor similitud. Este enfoque se centra en cuán alineados están los vectores, independientemente de su longitud, lo que lo hace ideal para comparar significados de palabras. Aquí hay una ilustración:

Cuanto mayor sea la similitud del coseno, más similares serán los dos vectores, y viceversa. Por ejemplo, si dos vectores de palabras tienen una similitud del coseno cercana a 1 (el ángulo cercano a 0 grados), indica que están estrechamente relacionados o son similares en contexto dentro del espacio vectorial.
Ahora, busquemos las 5 palabras más similares a la palabra "man" utilizando la similitud del coseno:
12345678910from gensim.models import Word2Vec import pandas as pd emma_df = pd.read_csv( 'https://staging-content-media-cdn.codefinity.com/courses/c68c1f2e-2c90-4d5d-8db9-1e97ca89d15e/section_4/chapter_3/emma.csv') sentences = emma_df['Sentence'].str.split() model = Word2Vec(sentences, vector_size=200, window=5, min_count=1, sg=0) # Retrieve the top-5 most similar words to 'man' similar_words = model.wv.most_similar('man', topn=5) print(similar_words)
model.wv
accede a los vectores de palabras del modelo entrenado, mientras que el método .most_similar()
encuentra las palabras cuyas incrustaciones están más cercanas a la incrustación de la palabra especificada, basándose en la similitud del coseno. El parámetro topn
determina el número de palabras top-N más similares a devolver.
¡Gracias por tus comentarios!