Comment démarrer avec Word2Vec - puis comment le faire fonctionner

L'idée derrière Word2Vec est assez simple. Nous partons du principe que la signification d'un mot peut être déduite par l'entreprise qu'il conserve. Ceci est analogue au dicton: « montrez-moi vos amis et je vous dirai qui vous êtes. "

Si vous avez deux mots qui ont des voisins très similaires (signifiant: le contexte dans lequel il est utilisé est à peu près le même), alors ces mots ont probablement un sens assez similaire ou sont au moins liés. Par exemple, les mots choqué , consterné et étonné sont généralement utilisés dans un contexte similaire.

En utilisant cette hypothèse sous-jacente, vous pouvez utiliser Word2Vec pour faire apparaître des concepts similaires, rechercher des concepts non liés, calculer la similitude entre deux mots, et plus encore!

Aux affaires

Dans ce didacticiel, vous apprendrez à utiliser l'implémentation Gensim de Word2Vec et à la faire fonctionner. J'ai longtemps entendu des plaintes concernant de mauvaises performances en général, mais c'est vraiment une combinaison de deux choses: (1) vos données d'entrée et (2) vos réglages de paramètres .

Notez que les algorithmes de formation du package Gensim ont en fait été portés à partir de l'implémentation originale de Word2Vec par Google et étendus avec des fonctionnalités supplémentaires.

Importations et journalisation

Tout d'abord, nous commençons par nos importations et établissons la journalisation:

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

Base de données

Notre prochaine tâche est de trouver un très bon ensemble de données. Le secret pour que Word2Vec fonctionne vraiment pour vous est d'avoir beaucoup de données texte dans le domaine concerné. Par exemple, si votre objectif est de créer un lexique des sentiments, l'utilisation d'un ensemble de données du domaine médical ou même de Wikipedia peut ne pas être efficace. Alors, choisissez judicieusement votre ensemble de données.

Pour ce tutoriel, je vais utiliser les données de l'ensemble de données OpinRank de certains de mes travaux de doctorat. Cet ensemble de données contient des avis d'utilisateurs complets sur les voitures et les hôtels. J'ai spécifiquement rassemblé toutes les critiques de l'hôtel dans un seul gros fichier d'environ 97 Mo compressés et 229 Mo non compressés. Nous utiliserons le fichier compressé pour ce tutoriel. Chaque ligne de ce fichier représente une critique d'hôtel.

Maintenant, regardons de plus près ces données ci-dessous en imprimant la première ligne.

Vous devriez voir ce qui suit:

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"

Vous pouvez voir que c'est une très bonne critique complète avec beaucoup de mots et c'est ce que nous voulons. Cet ensemble de données contient environ 255 000 avis de ce type.

Pour éviter toute confusion, le didacticiel Word2Vec de Gensim indique que vous devez passer une séquence de phrases en entrée de Word2Vec. Cependant, vous pouvez en fait passer une critique entière sous forme de phrase (c'est-à-dire une taille de texte beaucoup plus grande) si vous avez beaucoup de données et que cela ne devrait pas faire beaucoup de différence. En fin de compte, tout ce que nous utilisons le jeu de données est d'obtenir tous les mots voisins pour un mot cible donné.

Lire des fichiers dans une liste

Maintenant que nous avons eu un aperçu de notre ensemble de données, nous pouvons le lire dans une liste afin que nous puissions le transmettre au modèle Word2Vec. Notez dans le code ci-dessous que je lis directement le fichier compressé. Je fais également un léger prétraitement des avis en utilisant gensim.utils.simple_preprocess (line). Cela effectue un prétraitement de base tel que la tokenisation, la mise en minuscules, etc. et renvoie une liste de jetons (mots). La documentation de cette méthode de prétraitement est disponible sur le site de documentation officiel de Gensim.

Formation du modèle Word2Vec

La formation du modèle est assez simple. Vous venez d'instancier Word2Vec et de transmettre les critiques que nous avons lues à l'étape précédente. Donc, nous transmettons essentiellement une liste de listes, où chaque liste dans la liste principale contient un ensemble de jetons provenant d'un avis d'utilisateur. Word2Vec utilise tous ces jetons pour créer un vocabulaire en interne. Et par vocabulaire, j'entends un ensemble de mots uniques.

Après avoir construit le vocabulaire, il suffit d'appeler train(...)pour commencer à entraîner le modèle Word2Vec. Dans les coulisses, nous formons en fait un simple réseau de neurones avec une seule couche cachée. Mais nous n'allons pas utiliser le réseau neuronal après l'entraînement. Au lieu de cela, l'objectif est d'apprendre les poids de la couche masquée. Ces poids sont essentiellement les vecteurs de mots que nous essayons d'apprendre.

La formation sur le jeu de données Word2Vec OpinRank dure environ 10 à 15 minutes. alors soyez patient lors de l'exécution de votre code sur cet ensemble de données

La partie amusante - quelques résultats!

Passons déjà aux choses amusantes! Puisque nous nous sommes entraînés aux avis des utilisateurs, ce serait bien de voir des similitudes sur certains adjectifs. Ce premier exemple montre une simple recherche de mots similaires au mot «sale». Tout ce que nous devons faire ici est d'appeler la most_similarfonction et de fournir le mot «sale» comme exemple positif. Cela renvoie les 10 premiers mots similaires.

Ooh, ça a l'air plutôt bien. Regardons plus.

Similaire à poli:

Similaire à la France:

Similaire à choqué:

Dans l'ensemble, les résultats ont du sens. Tous les mots associés ont tendance à être utilisés dans le même contexte pour le mot de requête donné.

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