Cómo entrenar el modelo word2vec usando la biblioteca gensim

¿Qué es la incrustación de palabras?

La incrustación de palabras es un proceso de comprensión del texto mediante algoritmos de aprendizaje automático, también decimos que la incrustación de palabras es una representación aprendida para el texto donde se captura el contexto de la palabra en un documento, la similitud semántica y sintáctica, así como la relación entre otras palabras en el corpus.

Este enfoque es la clave para resolver los problemas de procesamiento del lenguaje natural utilizando el aprendizaje automático y el algoritmo de aprendizaje profundo. Básicamente, la incrustación de palabras es una representación vectorial de palabras. Calculando la distancia o la posición de las palabras, representa el significado de las palabras, las frases, los párrafos o los documentos.

Hay varias técnicas de incrustación de palabras que se han introducido hasta ahora. En general, decimos que hay dos tipos de incrustación de palabras –

  • Incorporación de palabras estáticas
  • Incorporación de palabras contextuales

1. Incrustación de palabras estáticas: Los métodos tradicionales como Skip-Gram y Continuous Bag-of-Words aprenden la incrustación estática entrenando tablas de búsqueda que traducen las palabras en vectores densos. La incrustación estática es directamente útil para resolver la tarea de semántica léxica.

Problema: no se pueden resolver las ambigüedades de las palabras polisémicas. Por ejemplo, cuando una palabra representa un significado múltiple en dos frases diferentes, los métodos Skip-Gram o BOW fallan.

2. Incrustación de palabras contextuales: La incrustación de palabras contextualizadas tiene como objetivo capturar la semántica de la palabra en diferentes contextos para abordar el problema de la polisemia y la naturaleza dependiente del contexto de las palabras. Los modelos LSTM, LSTM bidireccional, etc., ayudan a obtener la forma vectorial de las palabras.

Modelo Word2Vec: Word2Vec es un método para construir tal incrustación estática de palabras. Se ha conseguido utilizando dos métodos Skip Gram y Common Bag of Words (CBOW) con ayuda de redes neuronales. Fue desarrollado por Tomas Mikolov en 2013 en Google.

¿Por qué los necesitamos?

Digamos que tenemos las siguientes frases.

«Me encanta codificar en Jupyter.» y «Disfruto codificando en Pycharm».

Ambas frases son muy cercanas entre sí. Si construimos un vocabulario exhaustivo (llamémoslo V), tendrá V = {I, love, enjoy, coding, in, Jupyter, Pycharm}. Si vamos con una codificación caliente. No vamos a ser capaces de obtener el significado exacto como el amor, disfrutar, la codificación de cada palabra están siendo tratados como el mismo, mientras que el amor y disfrutar y muy cerca uno del otro.

Nuestro motivo es tener palabras con contexto similar será muy cerca de la posición espacial. Matemáticamente, la distancia coseno identificará lo cerca que están dos palabras. La distancia coseno de la palabra más cercana o coseno del ángel será cercana a 0 y para la más lejana será cercana a 1.

¿Cómo funciona Word2Vec?

El modelo Word2Vec puede funcionar con dos algoritmos –

  • Skip-gram
  • CBOW (Continuous Bag of Words)

Modelo CBOW: Este método toma el contexto de cada palabra como entrada e intenta predecir la palabra correspondiente al contexto. En el proceso de predicción de la palabra objetivo, aprendemos la representación vectorial de la palabra objetivo. Como entrada habrá múltiples palabras según el tamaño de la ventana (5 palabras), pero devolverá una palabra como salida.

Veamos la arquitectura en profundidad:

Modelo de recorte de trama: Este es otro algoritmo para Word2Vec. Es justo lo contrario del modelo CBOW. El modelo tomará una palabra como entrada, pero devolverá múltiples palabras según el tamaño de la ventana.

Implementación del modelo Word2Vec con Gensim:

Aquí, explicaré paso a paso cómo entrenar el modelo word2vec usando Gensim. Conjunto de datos, he recogido de la plataforma Kaggle. Este conjunto de datos en de Myers-Briggs Type Indicator datos públicos. Contiene dos columnas «type» y «post». «type» define 16 tipos de personalidad y «post «define el comentario de esos 16 tipos de individuo personalizado.

1. Carga de datos y descripción de datos

# Carga del conjunto de datos
data_df = pd.read_csv(«data/mbti_1.csv»)
data_df.head()

2. Limpieza y preprocesamiento de datos

Después de cargar los datos, es necesario encontrar si los datos contienen valor NA, si el valor NA dentro del conjunto de datos, lo eliminaremos.

# Eliminar los valores na del marco de datos
def data_na_value_cleaning(data):
print(«\nAntes de la limpieza, Forma de los datos : «, data.shape)
print(«Antes de eliminar los valores nulos: – – – – – -«)
print(data.isna().sum())
data.dropna(inplace=True)
data.reset_index(inplace=True,drop=True)
print(«Después de eliminar los valores nulos: – – – – – -«)
print(data.isna().sum())
print(«Después de la limpieza, Forma de los datos : «, data.shape)
return data

Como nuestros datos en no tienen ningún valor NA. Por lo tanto, no se ha eliminado ninguna fila. Ahora, comprobamos si hay valores duplicados en el Dataset.

# Eliminación de valores duplicados
def duplicate_content_removal(data, col, ini_row):
print(«\nAntes de eliminar los duplicados, el número de datos era : «, ini_row)
duplicate_count = data.duplicados().sum()
print(«\NNNúmero de duplicados: «, duplicate_count)

description_data = data.drop_duplicates()
cleaned_row = len(description_data)
if (ini_row – cleaned_row) > 0:
print(«\nReducción total de datos : «, (ini_row – cleaned_row))
print(«\nDespués de eliminar los duplicados, el número de datos es :», cleaned_row)
else:
print(«\nEl conjunto de datos no contiene ningún dato duplicado.»)
return list(description_data)

posts = duplicate_content_removal(data_df, ‘posts’, data_df.shape)

Ahora como parte del proceso de limpieza eliminaremos los enlaces y la puntuación. Además, para mejorar la formación, sólo tendremos en cuenta las palabras, no los números ni las palabras alfanuméricas. Eliminaremos las palabras de parada para una mejor comprensión y precisión del modelo.

def remove_link_punc(string):
# removing links
temp_string = re.sub(‘http?://(?:||(?:%))+’, ‘ ‘, cadena)

# eliminando todo excepto las letras inglesas a-z
regex = re.compile(»)
temp_string = regex.sub(‘ ‘, temp_string)

# eliminando los espacios extra
clean_string = re.¡sub(‘ +’, ‘ ‘, temp_string).lower()

return clean_string

Siguiente método data_cleaning

def data_cleaning(content):
sentences =
for idx in tqdm(range(len(content)):
if content !¡=»»:
# Tokenización de frases mediante la biblioteca NLTK
for each_sent in sent_tokenize(str(content)):
if each_sent != «»:
temp_sent =
# Eliminar el enlace y la puntuación
each_sent = remove_link_punc(each_sent.lower())

# Eliminar las palabras de parada y aplicar la lematización
for each_word in each_sent.split():
si cada_palabra no está en stop_words y len(cada_palabra)>= 3:
temp_sent.append(lemmatizer.lemmatize(cada_palabra))

# Sólo si la longitud de la lista de palabras es mayor que igual a 5
si len(temp_sent) >= 5:
sentences.append(temp_sent)
return sentences

sent_corpus = data_cleaning(posts)

Tratando de obtener cada palabra de una frase.

# Palabras de la oración stats
len_count =
for l in sent_corpus:
len_count.append(len(l))

print(«Número total de oraciones : «, len(len_count))
palabra_enviada_df = pd.DataFrame(sorted(Counter(len_count).items()), columns=)
palabra_enviada_df.head(10)

Después de la limpieza y el preprocesamiento de datos, los datos se parecen a cada palabra de una pelusa. Cada lista es la representación de una frase. Genism word2vec requiere un formato de ‘lista de listas’ para el entrenamiento donde cada documento está contenido en una lista y cada lista contiene listas de tokens de ese documento.

3. Entrenamiento del modelo

Ahora entrenaremos el modelo word2vec utilizando la librería Gensim con nuestro propio conjunto de datos.

modelo = Word2Vec(sentences=sent_corpus, size=200, window=4, min_count=1, workers=4)

sentences : donde podemos pasar nuestro dataset preparado que es sent_corpus

size : Dimensión de la forma vectorial generada de cada palabra, por defecto el tamaño es 100.

window : Distancia máxima entre la palabra actual y la predicha dentro de una frase, el valor por defecto es 5

min_count : Ignora todas las palabras en las que la frecuencia de cada palabra es menor que min_count, el valor por defecto es 5. Como queríamos añadir todas las palabras del corpus, el valor que proporcionamos es 1.

workers : Utiliza esos muchos hilos para entrenar el modelo. El valor por defecto es 3

sg : Se utiliza para elegir el algoritmo de entrenamiento: 1 para skip-gram; 0 para CBOW. Por defecto se utiliza CBOW para el entrenamiento.

En mi sistema tardó unos 38 segundos 395702 frases. El tiempo de entrenamiento depende de los requisitos del sistema.

4. Forma vectorial de la palabra

Después de completar el entrenamiento del modelo. Podemos ir a obtener la forma vectorizada de cada palabra. Hay dos métodos para obtener la forma vectorial. La forma del vector será 200 según el tamaño dado.

# Obtener la forma vectorial de la palabra rey
model.wv.get_vector(‘rey’)

O

# Otra forma de obtener la forma vectorial de la palabra2vec
model.wv.word_vec(‘rey’)

5. Similitud y distancia entre dos palabras

Proporcionaremos dos listas de palabras ‘rey’,’hombre’ en una lista y ‘reina’,’mujer’ en otra lista. Intentaremos averiguar el grado de similitud de esas dos palabras de la lista.

# Lista de similitud de palabras
model.wv.n_similarity(,)

Aquí buscaremos, cuál es la distancia entre dos palabras.Los tipos de palabras similares tendrán menos distancia.

# Distancia entre dos palabras
model.wv.distance(‘king’,’queen’)

Si queremos obtener similares entonces podemos usar el siguiente código.

# Similar word for king
model.wv.similar_por_palabra(‘rey’)

6. Otras técnicas usando word2Vec

# Extraer una de la lista de palabras
model.wv.doesnt_match()

Esto nos ayudará a encontrar las palabras impares presentes en una lista.

# evaluación de pares de palabras
model.wv.evaluate_word_pairs(‘data/SimLex-999/SimLex-999_2.txt’,)

Esto nos ayudará a evaluar el par de palabras

# Analogía de palabras de la lista de palabras
model.wv.evaluate_word_analogies(‘data/questions-words.txt’)

Esto será útil para la analogía de palabras

7. Cargar el modelo entrenado

Si necesitamos usar el modelo entrenado, lo cual se puede lograr usando el siguiente código.

# Cargar el modelo preentrenado de google
from gensim import models

models.KeyedVectors.load_word2vec_format(‘data/GoogleNews-vectors-negative300.bin’, binary=True)

Aquí he intentado cargar el modelo preentrenado de google. Podemos descargar desde el enlace. Este modelo también es muy potente y entrenado en enorme conjunto de datos.

Para más detalles sobre la implementación, puede echar un vistazo a mi código en github.

Gracias por leer, por favor hágame si la pregunta o duda está allí. Estaré encantado de responder a sus preguntas.

Leave a Reply