Tutoriel Gensim – Un guide complet pour les débutants

Gensim est annoncé comme un package de traitement du langage naturel qui fait de la  » modélisation thématique pour les humains « . Mais il est pratiquement beaucoup plus que cela. C’est un paquet leader et de pointe pour le traitement des textes, le travail avec des modèles de vecteurs de mots (tels que Word2Vec, FastText etc) et pour la construction de modèles de sujets.

Tutoriel Gensim – Un guide complet pour les débutants. Photo par Jasmin Schreiber

Sommaire

1. Introduction
2. Qu’est-ce qu’un dictionnaire et un corpus ?
3. Comment créer un dictionnaire à partir d’une liste de phrases ?
4. Comment créer un dictionnaire à partir d’un ou plusieurs fichiers texte ?
5. Comment créer un corpus de sacs de mots dans gensim ?
6. Comment créer un corpus de sac de mots à partir d’un fichier texte externe ?
7. Comment sauvegarder un dictionnaire et un corpus gensim sur disque et les recharger ?
8. Comment créer la matrice TFIDF (corpus) dans gensim ?
9. Comment utiliser l’API de téléchargement de gensim pour charger des ensembles de données?
10. Comment créer des bigrammes et des trigrammes en utilisant des modèles Phraser?
11. Comment créer des modèles de sujets avec LDA?
12. Comment interpréter la sortie du modèle de sujet LDA?
13. Comment créer un modèle de sujet LSI en utilisant gensim?
14. Comment former le modèle Word2Vec en utilisant gensim?
15. Comment mettre à jour un modèle Word2Vec existant avec de nouvelles données?
16. Comment extraire des vecteurs de mots en utilisant des modèles Word2Vec et FastText pré-entraînés?
17. Comment créer des vecteurs de documents en utilisant Doc2Vec?
18. Comment calculer les métriques de similarité comme la similarité du cosinus et la similarité du cosinus doux?
19. Comment résumer des documents textuels?
20. Conclusion

Introduction

Qu’est-ce que gensim ?

Gensim est annoncé comme un package de traitement du langage naturel qui fait de la ‘Topic Modeling for Humans’. Mais son pratiquement beaucoup plus que cela.

Si vous n’êtes pas familier avec la modélisation des sujets, c’est une technique pour extraire les sujets sous-jacents de grands volumes de texte. Gensim fournit des algorithmes comme LDA et LSI (que nous verrons plus tard dans ce post) et la sophistication nécessaire pour construire des modèles de sujets de haute qualité.

Vous pouvez argumenter que les modèles de sujets et l’intégration des mots sont disponibles dans d’autres paquets comme scikit, R etc. Mais la largeur et la portée des installations pour construire et évaluer les modèles de sujets sont inégalées dans gensim, plus beaucoup d’autres installations pratiques pour le traitement des textes.

C’est un grand paquet pour le traitement des textes, le travail avec des modèles de vecteurs de mots (tels que Word2Vec, FastText etc) et pour la construction de modèles de sujets.

Aussi, un autre avantage significatif avec gensim est : il vous permet de traiter de grands fichiers texte sans avoir à charger le fichier entier en mémoire.

Ce post a l’intention de donner un aperçu pratique de la presque toutes les fonctionnalités majeures, expliquées d’une manière simple et facile à comprendre.

À la fin de ce tutoriel, vous sauriez :

  • Quels sont les concepts de base dans gensim ?
  • Qu’est-ce qu’un dictionnaire et un corpus, pourquoi ils sont importants et où les utiliser ?
  • Comment créer et travailler avec un dictionnaire et un corpus ?
  • Comment charger et travailler avec des données textuelles à partir de plusieurs fichiers texte de manière efficace en mémoire
  • Créer des modèles de sujets avec LDA et interpréter les sorties
  • Créer un modèle TFIDF, bigrammes, trigrammes, modèle Word2Vec, modèle Doc2Vec
  • Calculer des métriques de similarité
  • Et bien plus encore..

Commençons.

Qu’est-ce qu’un dictionnaire et un corpus ?

Pour travailler sur des documents texte, Gensim nécessite que les mots (alias tokens) soient convertis en ids uniques. Afin de réaliser cela, Gensim vous permet de créer un objet Dictionary qui fait correspondre chaque mot à un id unique.

Nous verrons comment le faire réellement dans la section suivante.

Mais pourquoi l’objet dictionnaire est-il nécessaire et où peut-il être utilisé ?

L’objet dictionnaire est typiquement utilisé pour créer un Corpus ‘sac de mots’. C’est ce dictionnaire et le sac de mots (Corpus) qui sont utilisés comme entrées pour la modélisation des sujets et d’autres modèles dans lesquels Gensim se spécialise.

D’accord, quel type d’entrées textuelles gensim peut-il traiter ? Le texte d’entrée se présente généralement sous 3 formes différentes :

  1. Comme des phrases stockées dans l’objet liste natif de python
  2. Comme un seul fichier texte, petit ou grand.
  3. Dans plusieurs fichiers texte.

Maintenant, lorsque votre entrée de texte est grande, vous devez être capable de créer l’objet dictionnaire sans avoir à charger le fichier texte entier.

La bonne nouvelle est que Gensim vous permet de lire le texte et de mettre à jour le dictionnaire, une ligne à la fois, sans charger le fichier texte entier dans la mémoire système. Voyons comment faire cela dans les 2 sections suivantes.

Mais, avant d’entrer dans le vif du sujet, comprenons un peu de jargon PNL.

Un ‘jeton’ signifie généralement un ‘mot’. Un « document » peut généralement faire référence à une « phrase » ou à un « paragraphe » et un « corpus » est généralement une « collection de documents comme un sac de mots ». Autrement dit, pour chaque document, un corpus contient l’identifiant de chaque mot et sa fréquence dans ce document. Par conséquent, l’information de l’ordre des mots est perdue.

Si tout est clair jusqu’ici, mettons les mains dans le cambouis et voyons comment créer le dictionnaire à partir d’une liste de phrases.

Comment créer un dictionnaire à partir d’une liste de phrases ?

Dans gensim, le dictionnaire contient une carte de tous les mots (tokens) à son id unique.

Vous pouvez créer un dictionnaire à partir d’un paragraphe de phrases, d’un fichier texte qui contient plusieurs lignes de texte et de plusieurs fichiers texte de ce type contenus dans un répertoire. Pour les deuxième et troisième cas, nous le ferons sans charger le fichier entier en mémoire afin que le dictionnaire soit mis à jour au fur et à mesure que vous lisez le texte ligne par ligne.

Débutons avec l’entrée ‘Liste de phrases’.

Lorsque vous avez plusieurs phrases, vous devez convertir chaque phrase en une liste de mots. Les compréhensions de liste sont un moyen commun de le faire.

Comme il est dit le dictionnaire a 34 jetons uniques (ou mots). Voyons les ids uniques pour chacun de ces tokens.

Nous avons créé avec succès un objet Dictionary. Gensim utilisera ce dictionnaire pour créer un corpus de sac de mots où les mots dans les documents sont remplacés par son id respectif fourni par ce dictionnaire.

Si vous obtenez de nouveaux documents dans le futur, il est également possible de mettre à jour un dictionnaire existant pour inclure les nouveaux mots.

Comment créer un dictionnaire à partir d’un ou plusieurs fichiers texte?

Vous pouvez également créer un dictionnaire à partir d’un fichier texte ou d’un répertoire de fichiers texte.

L’exemple ci-dessous lit un fichier ligne par ligne et utilise simple_preprocess de gensim pour traiter une ligne du fichier à la fois.

L’avantage ici est qu’il vous permet de lire un fichier texte entier sans charger le fichier en mémoire en une seule fois.

Utilisons un fichier sample.txt pour le démontrer.

Nous avons créé un dictionnaire à partir d’un seul fichier texte. Joli !

Maintenant, comment lire une ligne à la fois à partir de plusieurs fichiers ?

En supposant que vous avez tous les fichiers texte dans le même répertoire, vous devez définir une classe avec une méthode __iter__. La méthode __iter__() doit itérer à travers tous les fichiers d’un répertoire donné et donner la liste traitée des mots-clés.

Définissons une telle classe par le nom ReadTxtFiles, qui prend dans le chemin du répertoire contenant les fichiers texte. J’utilise ce répertoire de docs sur l’alimentation sportive comme entrée.

Ce billet de blog donne un bel aperçu pour comprendre le concept d’itérateurs et de générateurs.

Comment créer un corpus de sacs de mots dans gensim ?

Vous savez maintenant comment créer un dictionnaire à partir d’une liste et d’un fichier texte.

Le prochain objet important avec lequel vous devez vous familiariser pour travailler dans gensim est le Corpus (un sac de mots). C’est-à-dire que c’est un objet corpus qui contient l’id du mot et sa fréquence dans chaque document. Vous pouvez le considérer comme l’équivalent pour gensim d’une matrice Document-Terme.

Une fois que vous avez le dictionnaire mis à jour, tout ce que vous devez faire pour créer un corpus de sac de mots est de passer la liste de mots tokenisés à la Dictionary.doc2bow()

Créons s Corpus pour une liste simple (my_docs) contenant 2 phrases.

Comment interpréter le corpus ci-dessus ?

Le (0, 1) de la ligne 1 signifie, le mot avec id=0 apparaît une fois dans le 1er document.
De même, le (4, 4) du deuxième élément de la liste signifie, le mot avec id 4 apparaît 4 fois dans le deuxième document. Et ainsi de suite.

Bien, ceci n’est pas lisible par l’homme. Pour convertir les id en mots, vous aurez besoin du dictionnaire pour faire la conversion.

Voyons comment récupérer les textes originaux.

word_counts = , count) for id, count in line] for line in mycorpus]pprint(word_counts)#> , ]

Notez, l’ordre des mots est perdu. Seul le mot et son information de fréquence sont conservés.

6. Comment créer un corpus de sac de mots à partir d’un fichier texte ?

Lire des mots à partir d’une liste python est assez simple car le texte entier était déjà en mémoire.
Cependant, vous pouvez avoir un grand fichier que vous ne voulez pas charger entièrement en mémoire.

Vous pouvez importer de tels fichiers une ligne à la fois en définissant une classe et la fonction __iter__ qui lit itérativement le fichier une ligne à la fois et donne un objet corpus. Mais comment créer l’objet corpus ?

La __iter__() de BoWCorpus lit une ligne du fichier, la traite en une liste de mots en utilisant simple_preprocess() et passe cela à la dictionary.doc2bow(). Pouvez-vous relier comment cela est similaire et différent de la classe ReadTxtFiles que nous avons créée plus tôt ?

En outre, remarquez que j’utilise le paquet smart_open() de smart_open car, il vous permet d’ouvrir et de lire de grands fichiers ligne par ligne à partir d’une variété de sources telles que S3, HDFS, WebHDFS, HTTP, ou des fichiers locaux et compressés. C’est assez génial d’ailleurs !

Cependant, si vous aviez utilisé open() pour un fichier dans votre système, il fonctionnera parfaitement fichier aussi.

Comment enregistrer un dictionnaire et un corpus gensim sur le disque et les recharger ?

C’est assez simple. Voir les exemples ci-dessous.

Nous avons sauvegardé les objets dictionnaire et corpus. Chargeons-les à nouveau.

Comment créer la matrice TFIDF (corpus) dans gensim?

La fréquence des termes – fréquence inverse des documents(TF-IDF) est également un modèle de sac de mots, mais contrairement au corpus régulier, TFIDF pondère vers le bas les tokens (mots) qui apparaissent fréquemment à travers les documents.

Comment est calculée TFIDF ?

TfIDF est calculé en multipliant une composante locale comme la fréquence des termes (TF) avec une composante globale, c’est-à-dire la fréquence inverse des documents (IDF) et en normalisant éventuellement le résultat à une longueur unitaire.

En conséquence, les mots qui apparaissent fréquemment à travers les documents seront sous-pondérés.

Il existe de multiples variations de formules pour TF et IDF. Gensim utilise le système de recherche d’information SMART qui peut être utilisé pour mettre en œuvre ces variations. Vous pouvez spécifier quelle formule utiliser en spécifiant le paramètre smartirs dans le TfidfModel. Voir help(models.TfidfModel) pour plus de détails.

Alors, comment obtenir les poids TFIDF ?

En formant le corpus avec models.TfidfModel(). Ensuite, appliquer le corpus dans les crochets du modèle tfidf formé. Voir l’exemple ci-dessous.

Notez la différence de poids des mots entre le corpus original et le corpus pondéré par le tfidf.

Les mots ‘is’ et ‘the’ apparaissent dans deux documents et ont été pondérés. Le mot ‘this’ apparaissant dans les trois documents a été totalement supprimé. En termes simples, les mots qui apparaissent plus fréquemment à travers les documents obtiennent des pondérations plus petites.

Comment utiliser l’API de téléchargement de gensim pour charger des ensembles de données ?

Gensim fournit une API intégrée pour télécharger des ensembles de données textuelles populaires et des modèles d’intégration de mots.

Une liste complète des jeux de données et des modèles disponibles est maintenue ici.

L’utilisation de l’API pour télécharger le jeu de données est aussi simple que l’appel de la méthode api.load() avec le bon nom de données ou de modèle.

L’exemple ci-dessous montre comment télécharger le modèle ‘glove-wiki-gigaword-50’.

Comment créer des bigrammes et des trigrammes en utilisant des modèles Phraser?

Vous savez maintenant comment télécharger des jeux de données et des modèles pré-entraînés avec gensim.

Téléchargeons le jeu de données text8, qui n’est rien d’autre que les « 100 000 000 premiers octets de texte brut de Wikipedia ». Puis, à partir de celui-ci, nous allons générer des bigrammes et des trigrammes.

Mais que sont les bigrammes et les trigrammes ? et pourquoi sont-ils importants ?

Dans les paragraphes, certains mots ont toujours tendance à apparaître par paires (bigramme) ou par groupes de trois (trigramme). Parce que les deux mots combinés ensemble forment l’entité réelle. Par exemple : Le mot « français » désigne la langue ou la région et le mot « révolution » peut faire référence à la révolution planétaire. Mais en les combinant, ‘Révolution française’, on fait référence à quelque chose de complètement différent.

Il est assez important de former des bigrammes et des trigrammes à partir de phrases, surtout lorsqu’on travaille avec des modèles de sacs de mots.

Alors comment créer les bigrammes ?

C’est assez facile et efficace avec le modèle Phrases de gensim. Le modèle Phrases créé permet l’indexation, donc, il suffit de passer le texte original (liste) au modèle Phrases construit pour former les bigrammes. Un exemple est montré ci-dessous:

Les bigrammes sont prêts. Pouvez-vous deviner comment créer un trigramme ?

Eh bien, il suffit de rincer et de répéter la même procédure à la sortie du modèle de bigramme. Une fois que vous avez généré les bigrammes, vous pouvez passer la sortie pour former un nouveau modèle Phrases. Ensuite, appliquez le corpus bigramme sur le modèle trigramme formé. Vous êtes confus ? Voyez l’exemple ci-dessous.

Comment créer des modèles thématiques avec LDA?

L’objectif des modèles thématiques est d’extraire les sujets sous-jacents d’une collection donnée de documents textuels. Chaque document du texte est considéré comme une combinaison de sujets et chaque sujet est considéré comme une combinaison de mots liés.

La modélisation des sujets peut être effectuée par des algorithmes comme l’allocation de Dirichlet latente (LDA) et l’indexation sémantique latente (LSI).

Dans les deux cas, vous devez fournir le nombre de sujets en entrée. Le modèle de sujet, à son tour, fournira les mots-clés de sujet pour chaque sujet et le pourcentage de contribution des sujets dans chaque document.

La qualité des sujets dépend fortement de la qualité du traitement du texte et du nombre de sujets que vous fournissez à l’algorithme. Le post précédent sur la façon de construire les meilleurs modèles de sujets explique la procédure plus en détail. Cependant, je recommande de comprendre les étapes de base et l’interprétation dans l’exemple ci-dessous.

Etape 0 : Charger les paquets nécessaires et importer les mots d’arrêt.

Etape 1 : Importer le jeu de données. Je vais utiliser le jeu de données text8 qui peut être téléchargé en utilisant l’API de téléchargement de gensim.

# Step 1: Import the dataset and get the text and real topic of each news articledataset = api.load("text8")data = 

Etape 2 : Préparer les données téléchargées en supprimant les mots d’arrêt et les lemmatiser. Pour la lemmatisation, gensim a besoin du paquet pattern. Donc, assurez-vous de faire pip install pattern dans votre terminal ou prompt avant d’exécuter ceci. J’ai configuré la lemmatisation de sorte que seuls les noms (NN), les adjectifs (JJ) et les pronoms (RB) soient retenus. Parce que je préfère que seuls de tels mots aillent comme mots-clés du sujet. C’est un choix personnel.

Le data_processed est maintenant traité comme une liste de liste de mots. Vous pouvez maintenant l’utiliser pour créer les Dictionary et Corpus, qui seront ensuite utilisés comme entrées du modèle LDA.

Nous avons le dictionnaire et le corpus créés. Construisons un modèle thématique LDA avec 7 sujets, en utilisant LdaMulticore(). 7 sujets est un choix arbitraire pour l’instant.

La lda_model.print_topics montre quels mots ont contribué à quel sujet parmi les 7 sujets, ainsi que le poids de la contribution du mot à ce sujet.

Vous pouvez voir les mots comme ‘aussi’, ‘beaucoup’ venant à travers différents sujets. Donc, j’ajouterais de tels mots à la liste stop_words pour les éliminer et accorder davantage le modèle de sujet pour un nombre optimal de sujets.

LdaMulticore() supporte le traitement parallèle. Alternativement, vous pourriez aussi essayer et voir quels sujets le LdaModel() donne.

Comment interpréter la sortie du modèle de sujet LDA?

L’objet lda_model supporte l’indexation. C’est-à-dire que si vous passez un document (liste de mots) à l’objet lda_model, il fournit 3 choses :

  1. Le ou les sujets auxquels appartient ce document ainsi que le pourcentage.
  2. Le ou les sujets auxquels appartient chaque mot de ce document.
  3. Le ou les sujets auxquels appartient chaque mot de ce document ET les valeurs phi.

Alors, qu’est-ce que la valeur phi ?

La valeur phi est la probabilité que le mot appartienne à ce sujet particulier. Et la somme des valeurs phi pour un mot donné s’ajoute au nombre de fois où ce mot est apparu dans ce document.

Par exemple, dans la sortie ci-dessous pour le 0e document, le mot avec id=0 appartient au sujet numéro 6 et la valeur phi est 3,999. Cela signifie que le mot avec id=0 est apparu 4 fois dans le 0e document.

Comment créer un modèle de sujet LSI en utilisant gensim?

La syntaxe pour utiliser un modèle LSI est similaire à la façon dont nous avons construit le modèle LDA, sauf que nous utiliserons le LsiModel().

Comment former le modèle Word2Vec en utilisant gensim?

Un modèle d’intégration de mots est un modèle qui peut fournir des vecteurs numériques pour un mot donné. En utilisant l’API de téléchargement de Gensim, vous pouvez télécharger des modèles d’intégration de mots préconstruits comme word2vec, fasttext, GloVe et ConceptNet. Ceux-ci sont construits sur de grands corpus de données textuelles courantes telles que wikipedia, google news, etc.

Cependant, si vous travaillez dans une niche spécialisée telle que les documents techniques, il se peut que vous ne puissiez pas obtenir des word embeddings pour tous les mots. Donc, dans de tels cas, il est souhaitable de former votre propre modèle.

L’implémentation de Gensim Word2Vec vous permet de former votre propre modèle d’intégration de mots pour un corpus donné.

Nous avons formé et enregistré un modèle Word2Vec pour notre document. Cependant, lorsqu’un nouveau jeu de données arrive, vous voulez mettre à jour le modèle afin de prendre en compte les nouveaux mots.

Comment mettre à jour un modèle Word2Vec existant avec de nouvelles données ?

Sur un modèle Word2Vec existant, appelez la méthode build_vocab() sur le nouveau datset et ensuite la méthode train(). build_vocab() est appelée en premier parce que le modèle doit être informé des nouveaux mots à attendre dans le corpus entrant.

Comment extraire les vecteurs de mots en utilisant les modèles Word2Vec et FastText pré-entraînés?

Nous venons de voir comment obtenir les vecteurs de mots pour le modèle Word2Vec que nous venons d’entraîner. Cependant, gensim vous permet de télécharger des modèles pré-entraînés à l’état de l’art via l’API downloader. Voyons comment extraire les vecteurs de mots de quelques-uns de ces modèles.

Nous avons 3 modèles d’incorporation différents. Vous pouvez évaluer lequel est le plus performant en utilisant le evaluate_word_analogies() du modèle respectif sur un jeu de données d’analogies standard.

Comment créer des vecteurs de documents en utilisant Doc2Vec?

Contrairement à Word2Vec, un modèle Doc2Vecfournit une représentation vectorisée d’un groupe de mots pris collectivement comme une seule unité. Ce n’est pas une simple moyenne des vecteurs des mots de la phrase.

Utilisons le jeu de données text8 pour entraîner le Doc2Vec.

import gensimimport gensim.downloader as api# Download datasetdataset = api.load("text8")data = 

Les données d’entraînement pour Doc2Vec doivent être une liste de TaggedDocument. Pour en créer une, nous passons une liste de mots et un entier unique en entrée au models.doc2vec.TaggedDocument().

L’entrée est préparée. Pour entraîner le modèle, il faut initialiser le modèle Doc2Vec, construire le vocabulaire et enfin entraîner le modèle.

Pour obtenir le vecteur document d’une phrase, on le passe comme une liste de mots à la méthode infer_vector().

Comment calculer les métriques de similarité comme la similarité en cosinus et la similarité en cosinus mou ?

La similarité en cosinus doux est similaire à la similarité en cosinus mais considère en plus la relation sémantique entre les mots à travers sa représentation vectorielle.

Pour calculer les cosinus doux, vous aurez besoin d’un modèle d’incorporation de mots comme Word2Vec ou FastText. Tout d’abord, calculez le similarity_matrix. Ensuite, convertissez les phrases d’entrée en corpus de sacs de mots et passez-les au softcossim() avec la matrice de similarité.

Vous trouverez ci-dessous quelques mesures de similarité et de distance utiles basées sur les modèles d’incorporation de mots comme fasttext et GloVe. Nous avons déjà téléchargé ces modèles en utilisant l’API de téléchargement.

Comment résumer des documents textuels ?

Gensim met en œuvre le résumé textrank en utilisant la fonction summarize() dans le module summarization. Tout ce que vous devez faire est de passer dans la chaîne tet avec soit le résumé de sortie ratio ou le maximum count de mots dans la sortie résumée.

Il n’est pas nécessaire de diviser la phrase en une liste tokenisée parce que gensim fait la division en utilisant la méthode intégrée split_sentences() dans le module gensim.summarization.texcleaner.

Résumons la coupure d’un nouvel article dans sample.txt.

Pour plus d’informations sur le résumé avec gensim, référez-vous à ce tutoriel.

Conclusion

Nous avons couvert beaucoup de terrain sur les différentes fonctionnalités de gensim et obtenons une bonne maîtrise de la façon de travailler avec et de manipuler des textes. Les exemples ci-dessus devraient servir de modèles agréables pour vous permettre de démarrer et de construire sur la base de diverses tâches NLP. J’espère que vous trouverez cela utile et que vous vous sentirez à l’aise pour utiliser gensim plus souvent dans vos projets NLP.

Laisser un commentaire

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