Gensim - Création d'une matrice TF-IDF

Ici, nous allons apprendre à créer une matrice de fréquence de document à fréquence inversée (TF-IDF) avec l'aide de Gensim.

Qu'est-ce que TF-IDF?

Il s'agit du modèle de fréquence du terme-fréquence de document inversée qui est également un modèle de sac de mots. Il est différent du corpus normal car il réduit le poids des jetons, c'est-à-dire des mots apparaissant fréquemment dans les documents. 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.

Comment est-il calculé?

Le modèle TF-IDF calcule tfidf en suivant deux étapes simples -

Étape 1: multiplier les composants locaux et mondiaux

Dans cette première étape, le modèle multipliera une composante locale telle que TF (Term Frequency) par une composante globale telle que IDF (Inverse Document Frequency).

Étape 2: normaliser le résultat

Une fois fait avec la multiplication, à l'étape suivante, le modèle TFIDF normalisera le résultat à la longueur unitaire.

En raison de ces deux étapes ci-dessus, les mots fréquemment rencontrés dans les documents seront pondérés.

Comment obtenir des poids TF-IDF?

Ici, nous allons implémenter un exemple pour voir comment nous pouvons obtenir des poids TF-IDF. Fondamentalement, pour obtenir les pondérations TF-IDF, nous devons d'abord former le corpus, puis appliquer ce corpus dans le modèle tfidf.

Former le corpus

Comme indiqué ci-dessus, pour obtenir le TF-IDF, nous devons d'abord former notre corpus. Tout d'abord, nous devons importer tous les packages nécessaires comme suit -

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

Maintenant, fournissez la liste contenant les phrases. Nous avons trois phrases dans notre liste -

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

Ensuite, faites la tokenisation des phrases comme suit -

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

Créer un objet de corpora.Dictionary() comme suit -

dictionary = corpora.Dictionary()

Passez maintenant ces phrases symboliques à dictionary.doc2bow() objet comme suit -

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

Ensuite, nous obtiendrons les identifiants de mot et leurs fréquences dans nos documents.

for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])

Production

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

De cette manière, nous avons formé notre corpus (corpus Bag-of-Word).

Ensuite, nous devons appliquer ce corpus entraîné dans le modèle tfidf models.TfidfModel().

Importez d'abord le package numpay -

import numpy as np

Appliquant maintenant notre corpus entraîné (BoW_corpus) entre crochets models.TfidfModel()

tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')

Ensuite, nous obtiendrons les identifiants de mot et leurs fréquences dans notre corpus modélisé tfidf -

for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

Production

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

À partir des sorties ci-dessus, nous voyons la différence dans les fréquences des mots dans nos documents.

Exemple d'implémentation complet

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])
import numpy as np
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

Différence de poids des mots

Comme indiqué ci-dessus, les mots qui apparaîtront plus fréquemment dans le document auront les poids les plus petits. Comprenons la différence de poids des mots entre les deux sorties ci-dessus. Le mot‘are’se produit dans deux documents et ont été lestés. De même, le mot‘you’ apparaissant dans tous les documents et supprimés complètement.