Cómo empezar con Word2Vec y luego cómo hacer que funcione

La idea detrás de Word2Vec es bastante simple. Estamos asumiendo que el significado de una palabra puede ser inferido por la compañía que mantiene. Esto es análogo al dicho: “ muéstrame a tus amigos y te diré quién eres. "

Si tiene dos palabras que tienen vecinos muy similares (es decir, el contexto en el que se usa es aproximadamente el mismo), entonces estas palabras probablemente tengan un significado bastante similar o al menos estén relacionadas. Por ejemplo, las palabras conmocionado , consternado y asombrado generalmente se usan en un contexto similar.

Usando esta suposición subyacente, puede usar Word2Vec para mostrar conceptos similares, encontrar conceptos no relacionados, calcular la similitud entre dos palabras y más.

A los negocios

En este tutorial, aprenderá cómo usar la implementación de Gensim de Word2Vec y cómo hacer que funcione. Durante mucho tiempo he escuchado quejas sobre el bajo rendimiento en general, pero en realidad es una combinación de dos cosas: (1) sus datos de entrada y (2) la configuración de sus parámetros .

Tenga en cuenta que los algoritmos de entrenamiento en el paquete Gensim en realidad fueron portados de la implementación original de Word2Vec por Google y se extendieron con funcionalidad adicional.

Importaciones y tala

Primero, comenzamos con nuestras importaciones y establecemos el registro:

# imports needed and loggingimport gzipimport gensim import logging
logging.basicConfig(format=’%(asctime)s : %(levelname)s : %(message)s’, level=logging.INFO)

Conjunto de datos

Nuestra próxima tarea es encontrar un conjunto de datos realmente bueno. El secreto para que Word2Vec funcione realmente para usted es tener una gran cantidad de datos de texto en el dominio relevante. Por ejemplo, si su objetivo es crear un léxico de sentimientos, entonces el uso de un conjunto de datos del dominio médico o incluso de Wikipedia puede no ser efectivo. Por lo tanto, elija sabiamente su conjunto de datos.

Para este tutorial, voy a usar datos del conjunto de datos de OpinRank de algunos de mis trabajos de doctorado. Este conjunto de datos tiene reseñas completas de usuarios de automóviles y hoteles. He reunido específicamente todas las reseñas de hoteles en un archivo grande que tiene aproximadamente 97 MB comprimidos y 229 MB sin comprimir. Usaremos el archivo comprimido para este tutorial. Cada línea de este archivo representa una reseña de un hotel.

Ahora, echemos un vistazo más de cerca a estos datos a continuación imprimiendo la primera línea.

Debería ver lo siguiente:

b"Oct 12 2009 \tNice trendy hotel location not too bad.\tI stayed in this hotel for one night. As this is a fairly new place some of the taxi drivers did not know where it was and/or did not want to drive there. Once I have eventually arrived at the hotel, I was very pleasantly surprised with the decor of the lobby/ground floor area. It was very stylish and modern. I found the reception's staff geeting me with 'Aloha' a bit out of place, but I guess they are briefed to say that to keep up the coroporate image.As I have a Starwood Preferred Guest member, I was given a small gift upon-check in. It was only a couple of fridge magnets in a gift box, but nevertheless a nice gesture.My room was nice and roomy, there are tea and coffee facilities in each room and you get two complimentary bottles of water plus some toiletries by 'bliss'.The location is not great. It is at the last metro stop and you then need to take a taxi, but if you are not planning on going to see the historic sites in Beijing, then you will be ok.I chose to have some breakfast in the hotel, which was really tasty and there was a good selection of dishes. There are a couple of computers to use in the communal area, as well as a pool table. There is also a small swimming pool and a gym area.I would definitely stay in this hotel again, but only if I did not plan to travel to central Beijing, as it can take a long time. The location is ok if you plan to do a lot of shopping, as there is a big shopping centre just few minutes away from the hotel and there are plenty of eating options around, including restaurants that serve a dog meat!\t\r\n"

Puedes ver que esta es una revisión completa bastante buena con muchas palabras y eso es lo que queremos. Tenemos aproximadamente 255.000 de este tipo de revisiones en este conjunto de datos.

Para evitar confusiones, el tutorial Word2Vec de Gensim dice que debe pasar una secuencia de oraciones como entrada a Word2Vec. Sin embargo, puede pasar una reseña completa como una oración (es decir, un tamaño de texto mucho más grande) si tiene muchos datos y no debería hacer mucha diferencia. Al final, todo lo que usamos el conjunto de datos es para obtener todas las palabras vecinas para una palabra objetivo determinada.

Leer archivos en una lista

Ahora que hemos tenido un adelanto de nuestro conjunto de datos, podemos leerlo en una lista para que podamos pasarlo al modelo de Word2Vec. Observe en el código a continuación que estoy leyendo directamente el archivo comprimido. También estoy haciendo un preprocesamiento leve de las revisiones usando gensim.utils.simple_preprocess (line). Esto realiza un preprocesamiento básico como tokenización, minúsculas, etc. y devuelve una lista de tokens (palabras). La documentación de este método de procesamiento previo se puede encontrar en el sitio de documentación oficial de Gensim.

Entrenamiento del modelo Word2Vec

Entrenar el modelo es bastante sencillo. Simplemente crea una instancia de Word2Vec y pasa las revisiones que leímos en el paso anterior. Entonces, esencialmente estamos pasando una lista de listas, donde cada lista dentro de la lista principal contiene un conjunto de tokens de una revisión de usuario. Word2Vec usa todos estos tokens para crear internamente un vocabulario. Y por vocabulario me refiero a un conjunto de palabras únicas.

Después de construir el vocabulario, solo necesitamos llamar train(...)para comenzar a entrenar el modelo Word2Vec. Detrás de escena, en realidad estamos entrenando una red neuronal simple con una sola capa oculta. Pero en realidad no vamos a utilizar la red neuronal después del entrenamiento. En cambio, el objetivo es aprender los pesos de la capa oculta. Estos pesos son esencialmente los vectores de palabras que estamos tratando de aprender.

La capacitación sobre el conjunto de datos de OpinRank de Word2Vec demora entre 10 y 15 minutos. así que tenga paciencia mientras ejecuta su código en este conjunto de datos

La parte divertida: ¡algunos resultados!

¡Vayamos a lo divertido ya! Dado que nos capacitamos en las reseñas de los usuarios, sería bueno ver similitudes en algunos adjetivos. Este primer ejemplo muestra una simple búsqueda de palabras similares a la palabra "sucio". Todo lo que tenemos que hacer aquí es llamar a la most_similarfunción y proporcionar la palabra 'sucio' como ejemplo positivo. Esto devuelve el top 10 de palabras similares.

Oh, eso se ve bastante bien. Veamos más.

Similar a cortés:

Similar a francia:

Similar a sorprendido:

En general, los resultados tienen sentido. Todas las palabras relacionadas tienden a usarse en el mismo contexto para la palabra de consulta dada.

Now you could even use Word2Vec to compute similarity between two words in the vocabulary by invoking the similarity(...) function and passing in the relevant words.

Under the hood, the above three snippets compute the cosine similarity between the two specified words using word vectors of each. From the scores above, it makes sense that dirty is highly similar to smelly but dirty is dissimilar to clean. If you do a similarity between two identical words, the score will be 1.0 as the range of the cosine similarity score will always be between [0.0-1.0]. You can read more about cosine similarity scoring here.

You will find more examples of how you could use Word2Vec in my Jupyter Notebook.

A closer look at the parameter settings

To train the model earlier, we had to set some parameters. Now, let’s try to understand what some of them mean. For reference, this is the command that we used to train the model.

model = gensim.models.Word2Vec (documents, size=150, window=10, min_count=2, workers=10)

size

The size of the dense vector that is to represent each token or word. If you have very limited data, then size should be a much smaller value. If you have lots of data, its good to experiment with various sizes. A value of 100–150 has worked well for me for similarity lookups.

window

The maximum distance between the target word and its neighboring word. If your neighbor’s position is greater than the maximum window width to the left or the right, then some neighbors are not considered as being related to the target word. In theory, a smaller window should give you terms that are more related. If you have lots of data, then the window size should not matter too much, as long as its not overly narrow or overly broad. If you are not too sure about this, just use the default value.

min_count

Minimium frequency count of words. The model would ignore words that do not statisfy the min_count. Extremely infrequent words are usually unimportant, so its best to get rid of those. Unless your dataset is really tiny, this does not really affect the model.

workers

How many threads to use behind the scenes?

When should you use Word2Vec?

There are many application scenarios for Word2Vec. Imagine if you need to build a sentiment lexicon. Training a Word2Vec model on large amounts of user reviews helps you achieve that. You have a lexicon for not just sentiment, but for most words in the vocabulary.

Beyond raw unstructured text data, you could also use Word2Vec for more structured data. For example, if you had tags for a million StackOverflow questions and answers, you could find related tags and recommend those for exploration. You can do this by treating each set of co-occuring tags as a “sentence” and train a Word2Vec model on this data. Granted, you still need a large number of examples to make it work.

Source code

To use this tutorial’s Jupyter Notebook, you can go to my GitHub repo and follow the instructions on how to get the notebook running locally. I plan to upload the pre-trained vectors which could be used for your own work.

To follow Kavita’s article via email, please subscribe to her blog.

This article was originally published at kavita-ganesan.com