Gensim - Vector & Model
Qui impareremo i concetti fondamentali di Gensim, con focus principale sul vettore e sul modello.
Cos'è Vector?
E se volessimo dedurre la struttura latente nel nostro corpus? Per questo, dobbiamo rappresentare i documenti in modo tale da poterli manipolare matematicamente. Un tipo popolare di rappresentazione consiste nel rappresentare ogni documento del corpus come un vettore di caratteristiche. Ecco perché possiamo dire che il vettore è una comoda rappresentazione matematica di un documento.
Per darti un esempio, rappresentiamo una singola caratteristica, del nostro corpus sopra utilizzato, come una coppia QA -
Q - Quante volte fa la parola Hello compaiono nel documento?
A - Zero (0).
Q - Quanti paragrafi ci sono nel documento?
A - Due (2)
La domanda è generalmente rappresentata dal suo intero id, quindi la rappresentazione di questo documento è una serie di coppie come (1, 0.0), (2, 2.0). Tale rappresentazione vettoriale è nota come adensevettore. Perchédense, perché comprende una risposta esplicita a tutte le domande scritte sopra.
La rappresentazione può essere un semplice come (0, 2), se conosciamo tutte le domande in anticipo. Tale sequenza delle risposte (ovviamente se le domande sono note in anticipo) è lavector per il nostro documento.
Un altro tipo di rappresentazione popolare è il bag-of-word (BoW)modello. In questo approccio, ogni documento è fondamentalmente rappresentato da un vettore contenente il conteggio della frequenza di ogni parola nel dizionario.
Per darti un esempio, supponiamo di avere un dizionario che contenga le parole ["Hello", "How", "are", "you"]. Un documento costituito dalla stringa "Come stai come" sarebbe quindi rappresentato dal vettore [0, 2, 1, 1]. Qui, le voci del vettore sono in ordine delle occorrenze di "Hello", "How", "are" e "you".
Vector contro documento
Dalla precedente spiegazione del vettore, la distinzione tra un documento e un vettore è quasi compresa. Ma, per renderlo più chiaro,document è testo e vectorè una rappresentazione matematicamente conveniente di quel testo. Sfortunatamente, a volte molte persone usano questi termini in modo intercambiabile.
Ad esempio, supponiamo di avere un documento A arbitrario, invece di dire "il vettore che corrisponde al documento A", dicevano "il vettore A" o "il documento A". Questo porta a una grande ambiguità. Un'altra cosa importante da notare qui è che due documenti diversi possono avere la stessa rappresentazione vettoriale.
Conversione di un corpus in un elenco di vettori
Prima di prendere un esempio di implementazione della conversione di un corpus nell'elenco di vettori, dobbiamo associare ogni parola nel corpus con un ID intero univoco. Per questo, estenderemo l'esempio preso nel capitolo precedente.
Esempio
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Produzione
Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)
Mostra che nel nostro corpus ci sono 25 diversi gettoni in questo gensim.corpora.Dictionary.
Esempio di implementazione
Possiamo usare il dizionario per trasformare i documenti tokenizzati in questi vettori a 5 diemsional come segue:
pprint.pprint(dictionary.token2id)
Produzione
{
'binary': 11,
'computer': 0,
'error': 7,
'generation': 12,
'graph': 16,
'intersection': 17,
'iv': 19,
'measurement': 8,
'minors': 20,
'opinion': 1,
'ordering': 21,
'paths': 18,
'perceived': 9,
'quasi': 22,
'random': 13,
'relation': 10,
'response': 2,
'survey': 3,
'system': 4,
'time': 5,
'trees': 14,
'unordered': 15,
'user': 6,
'well': 23,
'widths': 24
}
Allo stesso modo, possiamo creare la rappresentazione del bag of word per un documento come segue:
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
Produzione
[
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
[(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
[(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
[(14, 1), (16, 1), (17, 1), (18, 1)],
[(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]
Cos'è il modello?
Una volta vettorializzato il corpus, cosa succederà? Ora possiamo trasformarlo usando i modelli. Il modello può essere riferito a un algoritmo utilizzato per trasformare una rappresentazione del documento in un'altra.
Come abbiamo discusso, i documenti, in Gensim, sono rappresentati come vettori quindi, possiamo, sebbene modellare come una trasformazione tra due spazi vettoriali. C'è sempre una fase di formazione in cui i modelli apprendono i dettagli di tali trasformazioni. Il modello legge il corpus formativo durante la fase di formazione.
Inizializzazione di un modello
Inizializziamo tf-idfmodello. Questo modello trasforma i vettori dalla rappresentazione BoW (Bag of Words) in un altro spazio vettoriale in cui i conteggi di frequenza sono pesati in base alla rarità relativa di ogni parola nel corpus.
Esempio di implementazione
Nell'esempio seguente, inizializzeremo il file tf-idfmodello. Lo addestreremo sul nostro corpus e poi trasformeremo la stringa “tree graph”.
Esempio
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])
Produzione
[(3, 0.4869354917707381), (4, 0.8734379353188121)]
Ora, una volta creato il modello, possiamo trasformare l'intero corpus tramite tfidf e indicizzarlo e interrogare la somiglianza del nostro documento di query (stiamo dando il documento di query 'sistema ad albero') contro ogni documento nel corpus -
Esempio
from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))
Produzione
[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]
Dall'output di cui sopra, il documento 4 e il documento 5 hanno un punteggio di somiglianza di circa il 49%.
Inoltre, possiamo anche ordinare questo output per una maggiore leggibilità come segue:
Esempio
for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
print(doc_number, score)
Produzione
2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0