Implémentation de Word2Vec avec la bibliothèque Gensim en Python

Introduction

Les humains ont une capacité naturelle à comprendre ce que les autres personnes disent et ce qu’il faut dire en réponse. Cette capacité est développée par une interaction constante avec d’autres personnes et la société pendant de nombreuses années. La langue joue un rôle très important dans la façon dont les humains interagissent. Les langues que les humains utilisent pour interagir sont appelées langues naturelles.

Les règles des diverses langues naturelles sont différentes. Cependant, il y a une chose en commun dans les langues naturelles : la flexibilité et l’évolution.

Les langues naturelles sont très très flexibles. Supposons que vous êtes au volant d’une voiture et que votre ami prononce l’une de ces trois phrases : « Range-toi », « Arrête la voiture », « Halte ». Vous comprenez immédiatement qu’il vous demande d’arrêter la voiture. C’est parce que les langues naturelles sont extrêmement flexibles. Il existe de multiples façons de dire une chose.

Un autre aspect important des langues naturelles est le fait qu’elles évoluent constamment. Par exemple, il y a quelques années, il n’existait pas de terme tel que « Google it », qui fait référence à la recherche de quelque chose sur le moteur de recherche Google. Les langages naturels sont toujours en évolution.

Au contraire, les langages informatiques suivent une syntaxe stricte. Si vous voulez dire à un ordinateur d’imprimer quelque chose sur l’écran, il existe une commande spéciale pour cela. La tâche du traitement du langage naturel est de faire en sorte que les ordinateurs comprennent et génèrent le langage humain d’une manière similaire à celle des humains.

C’est une tâche énorme et il y a de nombreux obstacles à surmonter. Cette conférence vidéo de l’Université du Michigan contient une très bonne explication des raisons pour lesquelles le NLP est si difficile.

Dans cet article, nous allons mettre en œuvre la technique d’incorporation de mots Word2Vec utilisée pour créer des vecteurs de mots avec la bibliothèque Gensim de Python. Cependant, avant de sauter directement à la section de codage, nous allons d’abord passer brièvement en revue certaines des techniques d’incorporation de mots les plus couramment utilisées, ainsi que leurs avantages et inconvénients.

Approches d’incorporation de mots

L’une des raisons pour lesquelles le traitement du langage naturel est un problème difficile à résoudre est le fait que, contrairement aux êtres humains, les ordinateurs ne peuvent comprendre que des nombres. Nous devons représenter les mots dans un format numérique compréhensible par les ordinateurs. L’incorporation de mots fait référence aux représentations numériques des mots.

Plusieurs approches d’incorporation de mots existent actuellement et toutes ont leurs avantages et leurs inconvénients. Nous en aborderons trois ici :

  1. Sac de mots
  2. Schéma TF-IDF
  3. Word2Vec

Sac de mots

L’approche du sac de mots est l’une des approches d’incorporation de mots les plus simples. Voici les étapes pour générer des enchâssements de mots en utilisant l’approche du sac de mots.

Nous allons voir les enchâssements de mots générés par l’approche du sac de mots à l’aide d’un exemple. Supposons que vous avez un corpus avec trois phrases.

  • S1 = J’aime la pluie
  • S2 = pluie pluie aller loin
  • S3 = Je suis loin

Pour convertir les phrases ci-dessus dans leurs représentations d’enchâssement de mots correspondants en utilisant l’approche du sac de mots, nous devons effectuer les étapes suivantes :

Notez que pour S2 nous avons ajouté 2 à la place de « pluie » dans le dictionnaire ; ceci parce que S2 contient « pluie » deux fois.

Avantages et inconvénients du sac de mots

L’approche du sac de mots présente des avantages et des inconvénients. Le principal avantage de l’approche du sac de mots est que vous n’avez pas besoin d’un corpus très énorme de mots pour obtenir de bons résultats. Vous pouvez voir que nous construisons un modèle de sac de mots très basique avec trois phrases. Calculatoirement, un modèle de sac de mots n’est pas très complexe.

Un inconvénient majeur de l’approche du sac de mots est le fait que nous devons créer d’énormes vecteurs avec des espaces vides afin de représenter un nombre (matrice clairsemée) ce qui consomme de la mémoire et de l’espace. Dans l’exemple précédent, nous n’avions que 3 phrases. Pourtant, vous pouvez voir trois zéros dans chaque vecteur.

Imaginez un corpus avec des milliers d’articles. Dans un tel cas, le nombre de mots uniques dans un dictionnaire peut être de plusieurs milliers. Si un document contient 10% des mots uniques, le vecteur d’incorporation correspondant contiendra encore 90% de zéros.

Un autre problème majeur avec l’approche du sac de mots est le fait qu’elle ne maintient aucune information contextuelle. Elle ne se soucie pas de l’ordre dans lequel les mots apparaissent dans une phrase. Par exemple, elle traite de la même manière les phrases « La bouteille est dans la voiture » et « La voiture est dans la bouteille », qui sont des phrases totalement différentes.

Un type d’approche de sac de mots, connu sous le nom de n-grammes, peut aider à maintenir la relation entre les mots. Un n-gramme fait référence à une séquence contiguë de n mots. Par exemple, les 2-grammes pour la phrase « Vous n’êtes pas heureux », sont « Vous êtes », « n’êtes pas » et « pas heureux ». Bien que l’approche des n-grammes soit capable de capturer les relations entre les mots, la taille de l’ensemble de caractéristiques croît exponentiellement avec un trop grand nombre de n-grammes.

Schéma TF-IDF

Le schéma TF-IDF est un type d’approche de mots en sac où, au lieu d’ajouter des zéros et des uns dans le vecteur d’intégration, vous ajoutez des nombres flottants qui contiennent plus d’informations utiles par rapport aux zéros et aux uns. L’idée derrière le schéma TF-IDF est le fait que les mots ayant une fréquence d’occurrence élevée dans un document, et une fréquence d’occurrence moindre dans tous les autres documents, sont plus cruciaux pour la classification.

TF-IDF est un produit de deux valeurs : La fréquence des termes (TF) et la fréquence inverse des documents (IDF).

La fréquence des termes fait référence au nombre de fois qu’un mot apparaît dans le document et peut être calculée comme:

Term frequence = (Number of Occurences of a word)/(Total words in the document)

Par exemple, si nous regardons la phrase S1 de la section précédente c’est-à-dire « j’aime la pluie », chaque mot de la phrase apparaît une fois et a donc une fréquence de 1. Au contraire, pour S2 c’est-à-dire. « pluie pluie va-t’en », la fréquence de « pluie » est de deux alors que pour le reste des mots, elle est de 1.

L’IDF fait référence au logarithme du nombre total de documents divisé par le nombre de documents dans lesquels le mot existe, et peut être calculé comme:

IDF(word) = Log((Total number of documents)/(Number of documents containing the word))

Par exemple, la valeur de l’IDF pour le mot « pluie » est de 0,1760, puisque le nombre total de documents est de 3 et que la pluie apparaît dans 2 d’entre eux, donc log(3/2) est de 0,1760. D’autre part, si vous regardez le mot « amour » dans la première phrase, il apparaît dans l’un des trois documents et donc sa valeur IDF est log(3), ce qui est 0,4771.

Pros et contre de TF-IDF

Bien que TF-IDF soit une amélioration par rapport à l’approche du simple sac de mots et donne de meilleurs résultats pour les tâches courantes de NLP, les pour et les contre globaux restent les mêmes. Nous devons toujours créer une énorme matrice clairsemée, ce qui prend également beaucoup plus de calculs que l’approche simple du sac de mots.

Word2Vec

La <a target= »_blank rel= »nofollow » » href= »https://en.wikipedia.org/wiki/Word2vec »>L’approche d’intégration Word2Vec, développée par Tomas Mikolov, est considérée comme l’état de l’art. L’approche Word2Vec utilise des techniques basées sur l’apprentissage profond et les réseaux neuronaux pour convertir les mots en vecteurs correspondants de telle sorte que les vecteurs sémantiquement similaires soient proches les uns des autres dans un espace à N dimensions, où N désigne les dimensions du vecteur.

Word2Vec renvoie des résultats étonnants. La capacité de Word2Vec à maintenir la relation sémantique est reflétée par un exemple classique où si vous avez un vecteur pour le mot « Roi » et que vous retirez le vecteur représenté par le mot « Homme » du « Roi » et que vous y ajoutez « Femmes », vous obtenez un vecteur qui est proche du vecteur « Reine ». Cette relation est couramment représentée par :

King - Man + Women = Queen

Le modèle Word2Vec existe en deux versions : Le modèle Skip Gram et le modèle Continuous Bag of Words (CBOW).

Dans le modèle Skip Gram, les mots du contexte sont prédits en utilisant le mot de base. Par exemple, étant donné une phrase « J’aime danser sous la pluie », le modèle skip gram prédit « amour » et « danse » étant donné le mot « à » en entrée.

Au contraire, le modèle CBOW prédit « à », si les mots contextuels « amour » et « danse » sont alimentés en entrée du modèle. Le modèle apprend ces relations en utilisant des réseaux neuronaux profonds.

Pros et Cons de Word2Vec

Word2Vec présente plusieurs avantages par rapport au sac de mots et au schéma IF-IDF. Word2Vec conserve le sens sémantique des différents mots d’un document. Les informations de contexte ne sont pas perdues. Un autre grand avantage de l’approche Word2Vec est que la taille du vecteur d’intégration est très petite. Chaque dimension du vecteur d’intégration contient des informations sur un aspect du mot. Nous n’avons pas besoin d’énormes vecteurs épars, contrairement au sac de mots et aux approches TF-IDF.

Note : Les détails mathématiques du fonctionnement de Word2Vec impliquent une explication des réseaux neuronaux et de la probabilité softmax, ce qui dépasse le cadre de cet article. Si vous voulez comprendre les fondements mathématiques de Word2Vec, veuillez lire cet article : https://arxiv.org/abs/1301.3781

Word2Vec en Python avec la bibliothèque Gensim

Dans cette section, nous allons mettre en œuvre le modèle Word2Vec avec l’aide de la bibliothèque Gensim de Python. Suivez les étapes suivantes :

Création du corpus

Nous avons discuté précédemment que pour créer un modèle Word2Vec, nous avons besoin d’un corpus. Dans les applications réelles, les modèles Word2Vec sont créés en utilisant des milliards de documents. Par exemple, le modèle Word2Vec de Google est formé à partir de 3 millions de mots et de phrases. Cependant, pour des raisons de simplicité, nous allons créer un modèle Word2Vec à partir d’un seul article de Wikipedia. Notre modèle ne sera pas aussi bon que celui de Google. Bien que, il est assez bon pour expliquer comment le modèle Word2Vec peut être mis en œuvre en utilisant la bibliothèque Gensim.

Avant de pouvoir résumer les articles de Wikipedia, nous devons les récupérer. Pour ce faire, nous allons utiliser quelques bibliothèques. La première bibliothèque que nous devons télécharger est la bibliothèque Beautiful Soup, qui est un utilitaire Python très utile pour le scraping web. Exécutez la commande suivante à l’invite de commande pour télécharger l’utilitaire Beautiful Soup.

$ pip install beautifulsoup4

Une autre bibliothèque importante dont nous avons besoin pour analyser le XML et le HTML est la bibliothèque lxml. Exécutez la commande suivante à l’invite de commande pour télécharger lxml:

$ pip install lxml

L’article que nous allons scrapper est l’article de Wikipédia sur l’intelligence artificielle. Écrivons un script Python pour scraper l’article de Wikipédia:

Dans le script ci-dessus, nous téléchargeons d’abord l’article Wikipédia en utilisant la méthode urlopen de la classe request de la bibliothèque urllib. Nous lisons ensuite le contenu de l’article et l’analysons en utilisant un objet de la classe BeautifulSoup. Wikipédia stocke le contenu textuel de l’article à l’intérieur des balises p. Nous utilisons la fonction find_all de l’objet BeautifulSoup pour récupérer tout le contenu des balises de paragraphe de l’article.

Enfin, nous réunissons tous les paragraphes et stockons l’article scrappé dans la variable article_text pour une utilisation ultérieure.

Prétraitement

À ce stade, nous avons maintenant importé l’article. L’étape suivante consiste à prétraiter le contenu pour le modèle Word2Vec. Le script suivant pré-traite le texte :

Dans le script ci-dessus, nous convertissons tout le texte en minuscules, puis nous supprimons tous les chiffres, les caractères spéciaux et les espaces supplémentaires du texte. Après le prétraitement, il ne nous reste que les mots.

Le modèle Word2Vec est entraîné sur une collection de mots. Tout d’abord, nous devons convertir notre article en phrases. Nous utilisons l’utilitaire nltk.sent_tokenize pour convertir notre article en phrases. Pour convertir les phrases en mots, nous utilisons l’utilitaire nltk.word_tokenize. Comme dernière étape de prétraitement, nous supprimons tous les mots d’arrêt du texte.

Après que le script ait terminé son exécution, l’objet all_words contient la liste de tous les mots de l’article. Nous allons utiliser cette liste pour créer notre modèle Word2Vec avec la bibliothèque Gensim.

Création du modèle Word2Vec

Avec Gensim, il est extrêmement simple de créer le modèle Word2Vec. La liste de mots est passée à la classe Word2Vec du package gensim.models. Nous devons spécifier la valeur du paramètre min_count. Une valeur de 2 pour min_count spécifie d’inclure uniquement les mots dans le modèle Word2Vec qui apparaissent au moins deux fois dans le corpus. Le script suivant crée le modèle Word2Vec en utilisant l’article Wikipedia que nous avons gratté.

from gensim.models import Word2Vecword2vec = Word2Vec(all_words, min_count=2)

Pour voir le dictionnaire des mots uniques qui existent au moins deux fois dans le corpus, exécutez le script suivant:

vocabulary = word2vec.wv.vocabprint(vocabulary)

Lorsque le script ci-dessus est exécuté, vous verrez une liste de tous les mots uniques apparaissant au moins deux fois.

Analyse du modèle

Nous avons créé avec succès notre modèle Word2Vec dans la dernière section. Il est maintenant temps d’explorer ce que nous avons créé.

Trouver les vecteurs pour un mot

Nous savons que le modèle Word2Vec convertit les mots en leurs vecteurs correspondants. Voyons comment nous pouvons visualiser la représentation vectorielle d’un mot particulier.

v1 = word2vec.wv

Le vecteur v1 contient la représentation vectorielle pour le mot « artificiel ». Par défaut, un vecteur à cent dimensions est créé par Gensim Word2Vec. C’est un vecteur beaucoup, beaucoup plus petit par rapport à ce qui aurait été produit par le sac de mots. Si nous utilisons l’approche du sac de mots pour intégrer l’article, la longueur du vecteur pour chacun sera de 1206 puisqu’il y a 1206 mots uniques avec une fréquence minimale de 2. Si la fréquence minimale d’occurrence est fixée à 1, la taille du vecteur du sac de mots augmentera encore. D’autre part, les vecteurs générés par Word2Vec ne sont pas affectés par la taille du vocabulaire.

Finding Similar Words

Nous avons dit précédemment que l’information contextuelle des mots n’est pas perdue en utilisant l’approche Word2Vec. Nous pouvons vérifier cela en trouvant tous les mots similaires au mot « intelligence ».

Regardez le script suivant:

sim_words = word2vec.wv.most_similar('intelligence')

Si vous imprimez la variable sim_words à la console, vous verrez les mots les plus similaires à « intelligence » comme indiqué ci-dessous:

À partir de la sortie, vous pouvez voir les mots similaires à « intelligence » ainsi que leur indice de similarité. Le mot « ai » est le mot le plus similaire à « intelligence » selon le modèle, ce qui est logique. De même, des mots tels que « humain » et « artificiel » coexistent souvent avec le mot « intelligence ». Notre modèle a réussi à capturer ces relations en utilisant un seul article de Wikipedia.

Conclusion

Dans cet article, nous avons implémenté un modèle d’incorporation de mots Word2Vec avec la bibliothèque Gensim de Python. Pour ce faire, nous avons raclé un article de Wikipédia et construit notre modèle Word2Vec en utilisant l’article comme corpus. Nous avons également brièvement passé en revue les approches d’incorporation de mots les plus couramment utilisées ainsi que leurs avantages et inconvénients en comparaison avec Word2Vec.

Je vous suggère de créer votre propre modèle Word2Vec à l’aide de n’importe quel corpus de texte et de voir si vous pouvez obtenir de meilleurs résultats par rapport à l’approche du sac de mots.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.