Gensim Tutorial – Una guida completa per i principianti

Gensim è pubblicizzato come un pacchetto di elaborazione del linguaggio naturale che fa ‘modellazione di argomenti per gli esseri umani’. Ma è praticamente molto più di questo. È un pacchetto leader e all’avanguardia per elaborare testi, lavorare con modelli vettoriali di parole (come Word2Vec, FastText ecc.) e per costruire modelli di argomenti.

Gensim Tutorial – Una guida completa per principianti. Foto di Jasmin Schreiber

Contenuti

1. Introduzione
2. Cos’è un dizionario e un corpus?
3. Come creare un dizionario da una lista di frasi?
4. Come creare un dizionario da uno o più file di testo?
5. Come creare un corpus di parole in gensim?
6. Come creare un corpus bag of words da un file di testo esterno?
7. Come salvare un dizionario gensim e un corpus su disco e caricarli nuovamente?
8. Come creare la matrice TFIDF (corpus) in gensim?
9. Come usare gensim downloader API per caricare i set di dati?
10. Come creare bigrammi e trigrammi usando i modelli Phraser? Come creare modelli di argomenti con LDA?
12. Come interpretare l’output del modello di argomento LDA? Come creare un modello di argomento LSI usando gensim?
14. Come addestrare il modello Word2Vec usando gensim?
15. Come aggiornare un modello Word2Vec esistente con nuovi dati? Come estrarre i vettori di parole usando modelli Word2Vec e FastText pre-addestrati? Come creare vettori di documenti usando Doc2Vec? Come calcolare le metriche di somiglianza come la somiglianza del coseno e la somiglianza morbida del coseno?
19. Come riassumere documenti di testo?
20. Conclusione

Introduzione

Cos’è gensim?

Gensim è pubblicizzato come un pacchetto di elaborazione del linguaggio naturale che fa ‘Topic Modeling for Humans’. Ma in pratica è molto più di questo.

Se non avete familiarità con la modellazione di argomenti, è una tecnica per estrarre gli argomenti sottostanti da grandi volumi di testo. Gensim fornisce algoritmi come LDA e LSI (che vedremo più avanti in questo post) e la sofisticazione necessaria per costruire modelli di argomento di alta qualità.

Si può obiettare che i modelli di argomento e l’incorporazione di parole sono disponibili in altri pacchetti come scikit, R ecc. Ma l’ampiezza e la portata delle strutture per costruire e valutare i modelli di argomento sono impareggiabili in gensim, oltre a molte altre comode strutture per l’elaborazione del testo.

È un ottimo pacchetto per elaborare testi, lavorare con modelli vettoriali di parole (come Word2Vec, FastText ecc) e per costruire modelli di argomento.

Inoltre, un altro vantaggio significativo di gensim è: permette di gestire file di testo di grandi dimensioni senza dover caricare l’intero file in memoria.

Questo post intende dare una panoramica pratica di quasi tutte le caratteristiche principali, spiegate in modo semplice e facile da capire.

Alla fine di questo tutorial, saprai:

  • Quali sono i concetti fondamentali di gensim?
  • Cos’è il dizionario e il corpus, perché sono importanti e dove usarli?
  • Come creare e lavorare con il dizionario e il corpus?
  • Come caricare e lavorare con dati di testo da più file di testo in modo efficiente in termini di memoria
  • Creare modelli di argomenti con LDA e interpretare i risultati
  • Creare modelli TFIDF, bigrammi, trigrammi, modello Word2Vec, modello Doc2Vec
  • Computare metriche di similarità
  • E molto altro..

Iniziamo.

Cos’è un dizionario e un corpus?

Per lavorare su documenti di testo, Gensim richiede che le parole (dette token) siano convertite in id unici. Per ottenere ciò, Gensim permette di creare un oggetto Dictionary che mappa ogni parola ad un id unico.

Vedremo come farlo nella prossima sezione.

Ma perché è necessario l’oggetto dizionario e dove può essere usato?

L’oggetto dizionario è tipicamente usato per creare un ‘bag of words’ Corpus. Sono questo dizionario e il bag-of-words (Corpus) che sono usati come input per la modellazione dei temi e altri modelli in cui Gensim è specializzato.

Ebbene, che tipo di input di testo può gestire Gensim? Il testo di input si presenta tipicamente in 3 forme diverse:

  1. come frasi memorizzate nell’oggetto lista nativo di python
  2. come un singolo file di testo, piccolo o grande.
  3. In più file di testo.

Ora, quando il vostro input di testo è grande, dovete essere in grado di creare l’oggetto dizionario senza dover caricare l’intero file di testo.

La buona notizia è che Gensim vi permette di leggere il testo e aggiornare il dizionario, una riga alla volta, senza caricare l’intero file di testo nella memoria di sistema. Vediamo come farlo nelle prossime 2 sezioni.

Ma, prima di entrare, cerchiamo di capire un po’ di gergo NLP.

Un ‘token’ tipicamente significa una ‘parola’. Un ‘documento’ può tipicamente riferirsi a una ‘frase’ o ‘paragrafo’ e un ‘corpus’ è tipicamente una ‘collezione di documenti come una borsa di parole’. Cioè, per ogni documento, un corpus contiene l’id di ogni parola e il suo numero di frequenza in quel documento. Di conseguenza, l’informazione sull’ordine delle parole è persa.

Se tutto è chiaro finora, bagniamoci le mani e vediamo come creare il dizionario da una lista di frasi.

Come creare un dizionario da una lista di frasi?

In gensim, il dizionario contiene una mappa di tutte le parole (token) al suo id unico.

È possibile creare un dizionario da un paragrafo di frasi, da un file di testo che contiene più righe di testo e da più file di testo simili contenuti in una directory. Per il secondo e il terzo caso, lo faremo senza caricare l’intero file in memoria in modo che il dizionario venga aggiornato man mano che si legge il testo riga per riga.

Iniziamo con l’input ‘Lista di frasi’.

Quando si hanno più frasi, è necessario convertire ogni frase in una lista di parole. La comprensione delle liste è un modo comune per farlo.

Come dice il dizionario ha 34 token (o parole) unici. Vediamo gli id unici per ognuno di questi token.

Abbiamo creato con successo un oggetto Dictionary. Gensim userà questo dizionario per creare un corpus bag-of-words dove le parole nei documenti sono sostituite con i rispettivi id forniti da questo dizionario.

Se si ottengono nuovi documenti in futuro, è anche possibile aggiornare un dizionario esistente per includere le nuove parole.

Come creare un dizionario da uno o più file di testo?

È anche possibile creare un dizionario da un file di testo o da una directory di file di testo.

L’esempio seguente legge un file riga per riga e usa il simple_preprocess di gensim per processare una riga del file alla volta.

Il vantaggio qui è che ti permette di leggere un intero file di testo senza caricare il file in memoria tutto in una volta.

Utilizziamo un file sample.txt per dimostrare questo.

Abbiamo creato un dizionario da un singolo file di testo. Bene!

Ora, come leggere una riga alla volta da più file?

Assumendo di avere tutti i file di testo nella stessa directory, è necessario definire una classe con un metodo __iter__. Il metodo __iter__() dovrebbe iterare attraverso tutti i file in una data directory e produrre l’elenco elaborato di parole token.

Definiamo una classe di questo tipo con il nome ReadTxtFiles, che prende il percorso della directory contenente i file di testo. Sto usando questa directory di documenti di cibo sportivo come input.

Questo post del blog dà una bella panoramica per capire il concetto di iteratori e generatori.

Come creare un corpus di parole in gensim?

Ora sapete come creare un dizionario da una lista e da un file di testo.

Il prossimo oggetto importante con cui dovete familiarizzare per lavorare in gensim è il Corpus (un Bag of Words). Cioè, è un oggetto corpus che contiene l’id della parola e la sua frequenza in ogni documento. Potete pensarlo come l’equivalente di gensim di una matrice Documento-Termine.

Una volta che avete il dizionario aggiornato, tutto quello che dovete fare per creare un corpus bag of words è passare la lista di parole tokenizzate al Dictionary.doc2bow()

Creiamo un Corpus per una semplice lista (my_docs) contenente 2 frasi.

Come interpretare il corpus di cui sopra?

Il (0, 1) nella linea 1 significa che la parola con id=0 appare una volta nel primo documento.
Parimenti, il (4, 4) nella seconda voce della lista significa che la parola con id 4 appare 4 volte nel secondo documento. E così via.

Bene, questo non è leggibile all’uomo. Per convertire gli id in parole, avrete bisogno del dizionario per fare la conversione.

Vediamo come recuperare i testi originali.

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

Nota, l’ordine delle parole si perde. Solo la parola e le sue informazioni di frequenza sono conservate.

6. Come creare un corpus bag of words da un file di testo?

Leggere le parole da una lista python è abbastanza semplice perché l’intero testo è già in-memoria.
Tuttavia, potresti avere un file di grandi dimensioni che non vuoi caricare l’intero file in memoria.

Puoi importare tali file una riga alla volta definendo una classe e la funzione __iter__ che legge iterativamente il file una riga alla volta e produce un oggetto corpus. Ma come creare l’oggetto corpus?

Il __iter__() di BoWCorpus legge una riga dal file, la elabora in una lista di parole usando simple_preprocess() e la passa al dictionary.doc2bow(). Puoi collegare come questo è simile e diverso dalla classe ReadTxtFiles che abbiamo creato in precedenza?

Inoltre, nota che sto usando il pacchetto smart_open() da smart_open perché, ti permette di aprire e leggere grandi file linea per linea da una varietà di fonti come S3, HDFS, WebHDFS, HTTP, o file locali e compressi. A proposito, è davvero fantastico!

Tuttavia, se avete usato open() per un file nel vostro sistema, funzionerà perfettamente anche il file.

Come salvare un dizionario e un corpus gensim su disco e caricarli nuovamente? Vedi gli esempi qui sotto.

Abbiamo salvato gli oggetti dizionario e corpus. Carichiamoli di nuovo.

Come creare la matrice TFIDF (corpus) in gensim?

Il Term Frequency – Inverse Document Frequency(TF-IDF) è anche un modello bag-of-words ma a differenza del corpus regolare, TFIDF pesa i token (parole) che appaiono frequentemente nei documenti.

Come viene calcolato TFIDF?

Tf-Idf si calcola moltiplicando una componente locale come la frequenza dei termini (TF) con una componente globale, cioè la frequenza inversa dei documenti (IDF) e opzionalmente normalizzando il risultato all’unità di lunghezza.

Come risultato di ciò, le parole che ricorrono frequentemente nei documenti saranno sottopesate.

Esistono molteplici varianti di formule per TF e IDF. Gensim usa il sistema SMART Information retrieval che può essere usato per implementare queste variazioni. Puoi specificare quale formula usare specificando il parametro smartirs nel TfidfModel. Vedi help(models.TfidfModel) per maggiori dettagli.

Come ottenere i pesi TFIDF?

Allena il corpus con models.TfidfModel(). Poi, applicare il corpus tra le parentesi quadre del modello tfidf addestrato. Vedi l’esempio qui sotto.

Nota la differenza nei pesi delle parole tra il corpus originale e il corpus ponderato con tfidf.

Le parole ‘è’ e ‘il’ appaiono in due documenti e sono state ponderate. La parola ‘questo’ che appare in tutti e tre i documenti è stata rimossa del tutto. In termini semplici, le parole che ricorrono più frequentemente nei documenti ricevono pesi minori.

Come usare gensim downloader API per caricare i dataset?

Gensim fornisce un’API integrata per scaricare i dataset di testo più popolari e i modelli di word embedding.

Un elenco completo dei dataset e dei modelli disponibili è mantenuto qui.

Utilizzare l’API per scaricare il dataset è semplice come chiamare il metodo api.load() con il giusto nome del dato o del modello.

L’esempio seguente mostra come scaricare il modello ‘glove-wiki-gigaword-50’.

Come creare bigrammi e trigrammi usando i modelli Phraser?

Ora sai come scaricare dataset e modelli pre-addestrati con gensim.

Scarichiamo il dataset text8, che non è altro che il “Primo 100.000.000 bytes di testo semplice da Wikipedia”. Poi, da questo, genereremo bigrammi e trigrammi.

Ma cosa sono i bigrammi e i trigrammi? e perché sono importanti?

Nei paragrafi, certe parole tendono sempre a presentarsi in coppia (bigramma) o in gruppi di tre (trigramma). Perché le due parole combinate insieme formano l’entità vera e propria. Per esempio: La parola ‘francese’ si riferisce alla lingua o alla regione e la parola ‘rivoluzione’ può riferirsi alla rivoluzione planetaria. Ma combinandole, ‘Rivoluzione Francese’, si riferisce a qualcosa di completamente diverso.

È abbastanza importante formare bigrammi e trigrammi dalle frasi, specialmente quando si lavora con modelli bag-of-words.

Come creare i bigrammi?

È abbastanza facile ed efficiente con il modello Phrases di gensim. Il modello Phrases creato permette l’indicizzazione, quindi, basta passare il testo originale (lista) al modello Phrases costruito per formare i bigrammi. Un esempio è mostrato qui sotto:

I bigrammi sono pronti. Puoi indovinare come creare un trigramma?

Bene, semplicemente risciacqua e ripeti la stessa procedura per l’output del modello di bigrammi. Una volta che hai generato i bigrammi, puoi passare l’output per addestrare un nuovo modello Phrases. Poi, applica il corpus di bigrammi al modello di trigrammi addestrato. Confusi? Vedi l’esempio qui sotto.

Come creare modelli di argomento con LDA?

L’obiettivo dei modelli di argomento è di estrarre gli argomenti sottostanti da una data collezione di documenti di testo. Ogni documento nel testo è considerato come una combinazione di argomenti e ogni argomento è considerato come una combinazione di parole correlate.

La modellazione degli argomenti può essere fatta con algoritmi come Latent Dirichlet Allocation (LDA) e Latent Semantic Indexing (LSI).

In entrambi i casi è necessario fornire il numero di argomenti come input. Il modello degli argomenti, a sua volta, fornirà le parole chiave per ogni argomento e il contributo percentuale degli argomenti in ogni documento.

La qualità degli argomenti dipende molto dalla qualità dell’elaborazione del testo e dal numero di argomenti che fornite all’algoritmo. Il post precedente su come costruire i migliori modelli di argomenti spiega la procedura in modo più dettagliato. Tuttavia, raccomando di capire i passi fondamentali coinvolti e l’interpretazione nell’esempio qui sotto.

Passo 0: Caricare i pacchetti necessari e importare le stopwords.

Passo 1: Importare il dataset. Userò il dataset text8 che può essere scaricato usando l’API del downloader di gensim.

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

Step 2: Preparare i dati scaricati rimuovendo le stopwords e lemmatizzarli. Per la lemmatizzazione, gensim richiede il pacchetto pattern. Quindi, assicuratevi di fare pip install pattern nel vostro terminale o prompt prima di eseguire questo. Ho impostato la lemmatizzazione in modo che solo i nomi (NN), gli aggettivi (JJ) e i pronomi (RB) vengano mantenuti. Perché preferisco che solo queste parole vadano come parole chiave dell’argomento. Questa è una scelta personale.

Il data_processed viene ora elaborato come una lista di parole. Ora puoi usarlo per creare i Dictionary e Corpus, che saranno poi usati come input per il modello LDA.

Abbiamo creato il dizionario e il corpus. Costruiamo un modello di argomento LDA con 7 argomenti, usando LdaMulticore(). 7 argomenti è una scelta arbitraria per ora.

Il lda_model.print_topics mostra quali parole hanno contribuito a quale dei 7 argomenti, insieme al peso del contributo della parola a quell’argomento.

Si possono vedere le parole come ‘anche’, ‘molti’ che arrivano in diversi argomenti. Quindi aggiungerei tali parole alla lista stop_words per rimuoverle e sintonizzare ulteriormente il modello di argomento per il numero ottimale di argomenti.

LdaMulticore() supporta l’elaborazione parallela. In alternativa potresti anche provare a vedere quali argomenti dà il LdaModel().

Come interpretare l’output del modello di argomento LDA?

L’oggetto lda_model supporta l’indicizzazione. Cioè, se si passa un documento (lista di parole) al lda_model, esso fornisce 3 cose:

  1. L’argomento(i) a cui appartiene quel documento insieme alla percentuale.
  2. L’argomento(i) a cui appartiene ogni parola in quel documento.
  3. L’argomento(i) a cui appartiene ogni parola in quel documento E i valori phi.

Quindi, cos’è il valore phi?

Il valore phi è la probabilità che la parola appartenga a quel particolare argomento. E la somma dei valori phi per una data parola si somma al numero di volte che quella parola si è verificata in quel documento.

Per esempio, nell’output sottostante per il documento 0, la parola con id=0 appartiene all’argomento numero 6 e il valore phi è 3,999. Ciò significa che la parola con id=0 è apparsa 4 volte nel documento 0.

Come creare un modello di argomento LSI usando gensim?

La sintassi per usare un modello LSI è simile a come abbiamo costruito il modello LDA, tranne che useremo il LsiModel().

Come addestrare il modello Word2Vec usando gensim?

Un modello di word embedding è un modello che può fornire vettori numerici per una data parola. Usando l’API di download di Gensim, è possibile scaricare modelli di word embedding pre-costruiti come word2vec, fasttext, GloVe e ConceptNet. Questi sono costruiti su grandi corpus di dati testuali comuni come wikipedia, google news ecc.

Tuttavia, se state lavorando in una nicchia specializzata come i documenti tecnici, potreste non essere in grado di ottenere word embeddings per tutte le parole. Quindi, in questi casi è auspicabile addestrare il proprio modello.

L’implementazione di Gensim Word2Vecconsente di addestrare il proprio modello di word embedding per un dato corpus.

Abbiamo addestrato e salvato un modello Word2Vec per il nostro documento. Tuttavia, quando arriva un nuovo set di dati, vogliamo aggiornare il modello in modo da tenere conto delle nuove parole.

Come aggiornare un modello Word2Vec esistente con i nuovi dati?

Su un modello Word2Vec esistente, chiamate il build_vocab() sul nuovo set di dati e poi chiamate il metodo train(). build_vocab() viene chiamato prima perché il modello deve essere informato su quali nuove parole aspettarsi nel corpus in arrivo.

Come estrarre i vettori di parole usando i modelli Word2Vec e FastText pre-addestrati?

Abbiamo appena visto come ottenere i vettori di parole per il modello Word2Vec appena addestrato. Tuttavia, gensim permette di scaricare i modelli preaddestrati allo stato dell’arte attraverso l’API del downloader. Vediamo come estrarre i vettori di parole da un paio di questi modelli.

Abbiamo 3 diversi modelli di embedding. Puoi valutare quale si comporta meglio usando il rispettivo modello evaluate_word_analogies() su un set di dati standard di analogie.

Come creare vettori di documenti usando Doc2Vec?

A differenza di Word2Vec, un modello Doc2Vec fornisce una rappresentazione vettoriale di un gruppo di parole prese collettivamente come una singola unità. Non è una semplice media dei vettori delle parole nella frase.

Utilizziamo il set di dati text8 per allenare il Doc2Vec.

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

I dati di allenamento per Doc2Vec dovrebbero essere una lista di TaggedDocument. Per crearne uno, passiamo una lista di parole e un intero unico come input al modello models.doc2vec.TaggedDocument().

L’input è preparato. Per addestrare il modello, è necessario inizializzare il modello Doc2Vec, costruire il vocabolario e infine addestrare il modello.

Per ottenere il vettore documento di una frase, passarlo come lista di parole al metodo infer_vector().

Come calcolare le metriche di similarità come la similarità coseno e la similarità coseno morbido?

La somiglianza soft cosine è simile alla somiglianza cosine ma in aggiunta considera la relazione semantica tra le parole attraverso la sua rappresentazione vettoriale.

Per calcolare i coseni soft, avrete bisogno di un modello di word embedding come Word2Vec o FastText. Per prima cosa, calcolate il similarity_matrix. Poi convertire le frasi di input in corpus di bag-of-words e passarle al softcossim() insieme alla matrice di similarità.

Di seguito ci sono alcune utili metriche di similarità e distanza basate sui modelli di word embedding come fasttext e GloVe. Abbiamo già scaricato questi modelli usando l’API del downloader.

Come riassumere i documenti di testo?

Gensim implementa la sintesi textrank usando la funzione summarize() nel modulo summarization. Tutto quello che devi fare è passare la stringa tet insieme al riassunto dell’output ratio o il massimo count di parole nell’output riassunto.

Non c’è bisogno di dividere la frase in una lista tokenizzata perché gensim fa la divisione usando il metodo integrato split_sentences() nel modulo gensim.summarization.texcleaner.

Riassumiamo il ritaglio di un nuovo articolo in sample.txt.

Per maggiori informazioni sul riassunto con gensim, fate riferimento a questo tutorial.

Conclusione

Abbiamo coperto molto terreno sulle varie caratteristiche di gensim e abbiamo una buona conoscenza di come lavorare e manipolare i testi. Gli esempi di cui sopra dovrebbero servire come buoni modelli per iniziare e costruire su di essi per vari compiti NLP. Spero che lo troverete utile e vi sentirete a vostro agio nell’usare gensim più spesso nei vostri progetti PNL.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.