Contenu du cours
Introduction au NLP
Introduction au NLP
Implémentation de Word2Vec
Ayant compris comment fonctionne Word2Vec, passons à son implémentation en utilisant Python. La bibliothèque Gensim, un outil open-source robuste pour le traitement du langage naturel, offre une implémentation simple via sa classe Word2Vec
dans gensim.models
.
Préparation des données
Word2Vec nécessite que les données textuelles soient tokenisées, c'est-à-dire décomposées en une liste de listes où chaque liste interne contient des mots d'une phrase spécifique. Pour cet exemple, nous utiliserons le roman Emma de l'auteur anglais Jane Austen comme notre corpus. Nous chargerons un fichier CSV contenant des phrases prétraitées, puis nous diviserons chaque phrase en mots :
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') # Split each sentence into words sentences = emma_df['Sentence'].str.split() # Print the fourth sentence (list of words) print(sentences[3])
Cette ligne emma_df['Sentence'].str.split()
applique la méthode .split()
à chaque phrase dans la colonne 'Sentence'
, résultant en une liste de mots pour chaque phrase. Étant donné que les phrases ont déjà été prétraitées, avec des mots séparés par des espaces, la méthode .split()
est suffisante pour cette tokenisation.
Entraînement du Modèle Word2Vec
Concentrons-nous maintenant sur l'entraînement du modèle Word2Vec en utilisant les données tokenisées. En fait, la classe Word2Vec
offre une variété de paramètres pour la personnalisation ; cependant, vous traiterez le plus souvent les paramètres suivants :
vector_size
(100 par défaut) : la dimensionnalité ou taille des embeddings de mots ;window
(5 par défaut) : la taille de la fenêtre de contexte ;min_count
(5 par défaut) : les mots apparaissant moins que ce nombre seront ignorés ;sg
(0 par défaut) : l'architecture du modèle à utiliser (1
pour Skip-Gram,0
pour CBOW).
En parlant des architectures de modèle, CBoW est adapté pour les ensembles de données plus grands et les scénarios où l'efficacité computationnelle est cruciale. Skip-gram, en revanche, est préférable pour les tâches nécessitant une compréhension détaillée des contextes de mots, particulièrement efficace dans les ensembles de données plus petits ou lorsqu'il s'agit de mots rares.
Voyons maintenant un exemple :
from 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)
Ici, nous définissons la taille des embeddings à 200, la taille de la fenêtre de contexte à 5 et incluons tous les mots en définissant min_count=1
. En définissant sg=0
, nous avons choisi d'utiliser le modèle CBoW.
Trouver des mots similaires
Ayant chaque mot représenté comme un vecteur, nous pouvons maintenant calculer la similarité de deux mots comme une similarité de deux vecteurs. Comment pouvons-nous la mesurer ? Eh bien, nous pourrions calculer la distance entre ces vecteurs, cependant, il y a quelques inconvénients.
Lorsque deux vecteurs de mots pointent dans la même direction, même si l'un est plus long (indiquant peut-être plus d'occurrences dans les données d'entraînement), ils peuvent toujours représenter des mots avec des significations similaires, donc ce que nous faisons est de considérer l'angle entre les vecteurs. C'est crucial car dans de nombreuses tâches de NLP, en particulier impliquant des embeddings de mots, la direction des vecteurs—indiquant l'orientation des mots dans l'espace vectoriel—porte plus de signification sémantique que la magnitude.
En pratique, cependant, utiliser un angle comme métrique de similarité directement n'est pas si pratique, donc le cosinus de l'angle est utilisé, qui varie de -1 à 1. C'est ce qu'on appelle la similarité cosinus. Voici une illustration :

Plus la similarité cosinus est élevée, plus les deux vecteurs sont similaires, et vice versa. Par exemple, si deux vecteurs de mots ont une similarité cosinus proche de 1 (l'angle proche de 0 degrés), cela indique qu'ils sont étroitement liés ou similaires dans le contexte au sein de l'espace vectoriel.
Trouvons maintenant les 5 mots les plus similaires au mot "man" en utilisant la similarité cosinus :
from 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
accède aux vecteurs de mots du modèle entraîné, tandis que la méthode .most_similar()
trouve les mots dont les embeddings sont les plus proches de l'embedding du mot spécifié, basé sur la similarité cosinus. Le paramètre topn
détermine le nombre de mots top-N similaires à retourner.
Merci pour vos commentaires !