Gensim - Trasformazioni

Questo capitolo ti aiuterà a conoscere le varie trasformazioni in Gensim. Cominciamo con la comprensione dei documenti trasformanti.

Trasformazione dei documenti

Trasformare documenti significa rappresentare il documento in modo tale che il documento possa essere manipolato matematicamente. Oltre a dedurre la struttura latente del corpus, la trasformazione dei documenti servirà anche ai seguenti obiettivi:

  • Scopre la relazione tra le parole.

  • Mette in risalto la struttura nascosta nel corpus.

  • Descrive i documenti in un modo nuovo e più semantico.

  • Rende più compatta la rappresentazione dei documenti.

  • Migliora l'efficienza perché la nuova rappresentazione consuma meno risorse.

  • Migliora l'efficacia perché nella nuova rappresentazione le tendenze dei dati marginali vengono ignorate.

  • Il rumore viene ridotto anche nella nuova rappresentazione del documento.

Vediamo i passaggi di implementazione per trasformare i documenti da una rappresentazione dello spazio vettoriale a un'altra.

Fasi di implementazione

Per trasformare i documenti, dobbiamo seguire i seguenti passaggi:

Passaggio 1: creazione del corpus

Il primo e fondamentale passaggio è creare il corpus dai documenti. Abbiamo già creato il corpus negli esempi precedenti. Creiamone un altro con alcuni miglioramenti (rimuovendo le parole comuni e le parole che compaiono una sola volta) -

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

Ora fornisci i documenti per creare il corpus -

t_corpus = ["CNTK precedentemente noto come Computational Network Toolkit", "è un toolkit di livello commerciale open source gratuito e facile da usare", "che ci consente di addestrare algoritmi di apprendimento profondo per imparare come il cervello umano.", " Puoi trovare il suo tutorial gratuito su tutorialspoint.com "," Tutorialspoint.com fornisce anche i migliori tutorial tecnici su tecnologie come il deep learning machine learning gratuito "]

Successivamente, dobbiamo fare tokenise e insieme ad esso rimuoveremo anche le parole comuni:

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
]

Lo script seguente rimuoverà solo quelle parole che appaiono -

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)

Produzione

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

Ora passalo al file corpora.dictionary() oggetto per ottenere gli oggetti unici nel nostro corpus -

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

Produzione

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

Successivamente, la seguente riga di codici creerà il modello Bag of Word per il nostro corpus:

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

Produzione

[
   [(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)]
]

Passaggio 2: creazione di una trasformazione

Le trasformazioni sono alcuni oggetti Python standard. Possiamo inizializzare queste trasformazioni, cioè oggetti Python, usando un corpus addestrato. Qui useremotf-idf modello per creare una trasformazione del nostro corpus addestrato, ad es BoW_corpus.

Per prima cosa, dobbiamo importare il pacchetto dei modelli da gensim.

from gensim import models

Ora, dobbiamo inizializzare il modello come segue:

tfidf = models.TfidfModel(BoW_corpus)

Passaggio 3: trasformazione dei vettori

Ora, in quest'ultimo passaggio, i vettori verranno convertiti dalla vecchia rappresentazione alla nuova rappresentazione. Poiché abbiamo inizializzato il modello tfidf nel passaggio precedente, il tfidf verrà ora trattato come un oggetto di sola lettura. Qui, usando questo oggetto tfidf convertiremo il nostro vettore dalla rappresentazione della borsa della parola (vecchia rappresentazione) a pesi reali Tfidf (nuova rappresentazione).

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

Produzione

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

Abbiamo applicato la trasformazione su due valori di corpus, ma possiamo anche applicarla all'intero corpus come segue:

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

Produzione

[(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)
]

Esempio di implementazione completo

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)

Varie trasformazioni in Gensim

Usando Gensim, possiamo implementare varie trasformazioni popolari, cioè algoritmi di Vector Space Model. Alcuni di loro sono i seguenti:

Tf-Idf (frequenza termine-frequenza documento inverso)

Durante l'inizializzazione, questo algoritmo del modello tf-idf si aspetta un corpus di addestramento con valori interi (come il modello Bag-of-Words). Successivamente, al momento della trasformazione, prende una rappresentazione vettoriale e restituisce un'altra rappresentazione vettoriale.

Il vettore di output avrà la stessa dimensionalità ma il valore delle caratteristiche rare (al momento dell'addestramento) sarà aumentato. Fondamentalmente converte i vettori a valori interi in vettori a valori reali. Di seguito è riportata la sintassi della trasformazione Tf-idf:

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

LSI (Latent Semantic Indexing)

L'algoritmo del modello LSI può trasformare il documento dal modello vettoriale a valori interi (come il modello Bag-of-Words) o dallo spazio ponderato Tf-Idf in spazio latente. Il vettore di output sarà di dimensionalità inferiore. Di seguito è riportata la sintassi della trasformazione LSI:

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

LDA (Latent Dirichlet Allocation)

L'algoritmo del modello LDA è un altro algoritmo che trasforma il documento dallo spazio modello Bag-of-Words in uno spazio argomento. Il vettore di output sarà di dimensionalità inferiore. Di seguito è riportata la sintassi della trasformazione LSI:

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

Proiezioni casuali (RP)

RP, un approccio molto efficiente, mira a ridurre la dimensionalità dello spazio vettoriale. Questo approccio è fondamentalmente approssimativo delle distanze Tf-Idf tra i documenti. Lo fa inserendo un po 'di casualità.

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

Processo gerarchico di Dirichlet (HDP)

HDP è un metodo bayesiano non parametrico che è una nuova aggiunta a Gensim. Dobbiamo fare attenzione durante l'utilizzo.

Model=models.HdpModel(corpus, id2word=dictionary