Gensim - Transformations

Ce chapitre vous aidera à découvrir les différentes transformations de Gensim. Commençons par comprendre les documents transformateurs.

Transformer des documents

Transformer des documents signifie représenter le document de manière à ce que le document puisse être manipulé mathématiquement. Outre la déduction de la structure latente du corpus, la transformation des documents servira également les objectifs suivants -

  • Il découvre la relation entre les mots.

  • Il fait ressortir la structure cachée du corpus.

  • Il décrit les documents d'une manière nouvelle et plus sémantique.

  • Cela rend la représentation des documents plus compacte.

  • Cela améliore l'efficacité car une nouvelle représentation consomme moins de ressources.

  • Cela améliore l'efficacité car dans la nouvelle représentation, les tendances des données marginales sont ignorées.

  • Le bruit est également réduit dans la nouvelle représentation de document.

Voyons les étapes de mise en œuvre pour transformer les documents d'une représentation d'espace vectoriel à une autre.

Étapes de mise en œuvre

Afin de transformer des documents, nous devons suivre les étapes suivantes -

Étape 1: Création du corpus

La toute première étape de base consiste à créer le corpus à partir des documents. Nous avons déjà créé le corpus dans les exemples précédents. Créons-en un autre avec quelques améliorations (en supprimant les mots courants et les mots qui n'apparaissent qu'une seule fois) -

import gensim
import pprint
from collections import defaultdict
from gensim import corpora

Maintenant, fournissez les documents pour créer le corpus -

t_corpus = ["CNTK anciennement connu sous le nom de Computational Network Toolkit", "est une boîte à outils open-source gratuite et de qualité commerciale", "qui nous permet de former des algorithmes d'apprentissage en profondeur pour apprendre comme le cerveau humain.", " Vous pouvez trouver son tutoriel gratuit sur tutorialspoint.com "," Tutorialspoint.com propose également les meilleurs tutoriels techniques sur des technologies telles que l'apprentissage automatique en profondeur par IA "]

Ensuite, nous devons faire des jetons et avec cela, nous supprimerons également les mots communs -

stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
   [
      word for word in document.lower().split() if word not in stoplist
   ]
	for document in t_corpus
]

Le script suivant supprimera les mots qui apparaissent uniquement -

frequency = defaultdict(int)
for text in processed_corpus:
   for token in text:
      frequency[token] += 1
   processed_corpus = [
      [token for token in text if frequency[token] > 1] 
      for text in processed_corpus
   ]
pprint.pprint(processed_corpus)

Production

[
   ['toolkit'],
   ['free', 'toolkit'],
   ['deep', 'learning', 'like'],
   ['free', 'on', 'tutorialspoint.com'],
   ['tutorialspoint.com', 'on', 'like', 'deep', 'learning', 'learning', 'free']
]

Passez-le maintenant au corpora.dictionary() objet pour obtenir les objets uniques de notre corpus -

dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)

Production

Dictionary(7 unique tokens: ['toolkit', 'free', 'deep', 'learning', 'like']...)

Ensuite, la ligne de codes suivante créera le modèle Bag of Word pour notre corpus -

BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)

Production

[
   [(0, 1)],
   [(0, 1), (1, 1)],
   [(2, 1), (3, 1), (4, 1)],
   [(1, 1), (5, 1), (6, 1)],
   [(1, 1), (2, 1), (3, 2), (4, 1), (5, 1), (6, 1)]
]

Étape 2: création d'une transformation

Les transformations sont des objets Python standard. Nous pouvons initialiser ces transformations ie les objets Python en utilisant un corpus entraîné. Ici, nous allons utilisertf-idf modèle pour créer une transformation de notre corpus formé ie BoW_corpus.

Tout d'abord, nous devons importer le package de modèles depuis gensim.

from gensim import models

Maintenant, nous devons initialiser le modèle comme suit -

tfidf = models.TfidfModel(BoW_corpus)

Étape 3: Transformer les vecteurs

Maintenant, dans cette dernière étape, les vecteurs seront convertis de l'ancienne représentation en nouvelle représentation. Comme nous avons initialisé le modèle tfidf à l'étape ci-dessus, le tfidf sera désormais traité comme un objet en lecture seule. Ici, en utilisant cet objet tfidf, nous convertirons notre vecteur de la représentation du sac de mots (ancienne représentation) en poids réels Tfidf (nouvelle représentation).

doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW]

Production

[(1, 0.4869354917707381), (3, 0.8734379353188121)]

Nous avons appliqué la transformation sur deux valeurs de corpus, mais nous pouvons également l'appliquer à l'ensemble du corpus comme suit -

corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
   print(doc)

Production

[(0, 1.0)]
[(0, 0.8734379353188121), (1, 0.4869354917707381)]
[(2, 0.5773502691896257), (3, 0.5773502691896257), (4, 0.5773502691896257)]
[(1, 0.3667400603126873), (5, 0.657838022678017), (6, 0.657838022678017)]
[
   (1, 0.19338287240886842), (2, 0.34687949360312714), (3, 0.6937589872062543), 
   (4, 0.34687949360312714), (5, 0.34687949360312714), (6, 0.34687949360312714)
]

Exemple d'implémentation complet

import gensim
import pprint
from collections import defaultdict
from gensim import corpora
t_corpus = [
   "CNTK formerly known as Computational Network Toolkit", 
   "is a free easy-to-use open-source commercial-grade toolkit", 
   "that enable us to train deep learning algorithms to learn like the human brain.", 
   "You can find its free tutorial on tutorialspoint.com", 
   "Tutorialspoint.com also provide best technical tutorials on 
   technologies like AI deep learning machine learning for free"
]
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
   [word for word in document.lower().split() if word not in stoplist]
   for document in t_corpus
]
frequency = defaultdict(int)
for text in processed_corpus:
   for token in text:
      frequency[token] += 1
   processed_corpus = [
      [token for token in text if frequency[token] > 1] 
      for text in processed_corpus
   ]
pprint.pprint(processed_corpus)
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
   from gensim import models
   tfidf = models.TfidfModel(BoW_corpus)
   doc_BoW = [(1,1),(3,1)]
   print(tfidf[doc_BoW])
   corpus_tfidf = tfidf[BoW_corpus]
   for doc in corpus_tfidf:
print(doc)

Diverses transformations dans Gensim

En utilisant Gensim, nous pouvons implémenter diverses transformations populaires, à savoir des algorithmes de modèle d'espace vectoriel. Certains d'entre eux sont les suivants -

Tf-Idf (fréquence du terme-fréquence de document inverse)

Lors de l'initialisation, cet algorithme de modèle tf-idf attend un corpus d'apprentissage ayant des valeurs entières (comme le modèle Bag-of-Words). Ensuite, au moment de la transformation, il prend une représentation vectorielle et renvoie une autre représentation vectorielle.

Le vecteur de sortie aura la même dimensionnalité mais la valeur des caractéristiques rares (au moment de l'apprentissage) sera augmentée. Il convertit essentiellement les vecteurs à valeurs entières en vecteurs à valeurs réelles. Voici la syntaxe de la transformation Tf-idf -

Model=models.TfidfModel(corpus, normalize=True)

LSI (indexation sémantique latente)

L'algorithme de modèle LSI peut transformer un document d'un modèle vectoriel à valeur entière (tel que le modèle Bag-of-Words) ou d'un espace pondéré Tf-Idf en espace latent. Le vecteur de sortie sera de dimensionnalité inférieure. Voici la syntaxe de la transformation LSI -

Model=models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=300)

LDA (allocation de dirichlet latent)

L'algorithme de modèle LDA est un autre algorithme qui transforme le document de l'espace modèle Bag-of-Words en un espace thématique. Le vecteur de sortie sera de dimensionnalité inférieure. Voici la syntaxe de la transformation LSI -

Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)

Projections aléatoires (RP)

RP, une approche très efficace, vise à réduire la dimensionnalité de l'espace vectoriel. Cette approche est essentiellement une approximation des distances Tf-Idf entre les documents. Il le fait en ajoutant un peu de hasard.

Model=models.RpModel(tfidf_corpus, num_topics=500)

Processus de Dirichlet hiérarchique (HDP)

HDP est une méthode bayésienne non paramétrique qui est un nouvel ajout à Gensim. Nous devrions avoir à faire attention lors de son utilisation.

Model=models.HdpModel(corpus, id2word=dictionary