Dominare la previsione della prossima parola con BI-LSTM Una guida completa

Guida completa alla previsione della prossima parola con BI-LSTM

Introduzione

Identificare la parola successiva è il compito della previsione della prossima parola, anche conosciuta come modellazione del linguaggio. Uno dei compiti di riferimento nell’ambito del NLP è la modellazione del linguaggio. Nella sua forma più basilare, consiste nel selezionare la parola che segue una sequenza di parole basandosi su di esse che è più probabile che si verifichi. La modellazione del linguaggio ha una vasta gamma di applicazioni in molti campi diversi.

Obiettivo di apprendimento

  • Riconoscere le idee e i principi sottostanti ai numerosi modelli utilizzati nell’analisi statistica, nell’apprendimento automatico e nella scienza dei dati.
  • Imparare a creare modelli predittivi, inclusi la regressione, la classificazione, l’aggregazione, ecc., per generare previsioni precise e tipi basati sui dati.
  • Comprendere i principi dell’overfitting e dell’underfitting e imparare a valutare le prestazioni del modello utilizzando misure come l’accuratezza, la precisione, il richiamo, ecc.
  • Imparare a pre-elaborare i dati e identificare le caratteristiche pertinenti per la modellazione.
  • Imparare a regolare gli iperparametri e ottimizzare i modelli utilizzando la ricerca in griglia e la convalida incrociata.

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

Applicazioni della modellazione del linguaggio

Ecco alcune applicazioni notevoli della modellazione del linguaggio:

Raccomandazione di testo sulla tastiera del cellulare

Una funzione presente nelle tastiere degli smartphone chiamata “raccomandazione di testo sulla tastiera del cellulare”, o testo predittivo o suggerimenti automatici, suggerisce parole o frasi mentre si scrive. Si cerca di rendere la digitazione più rapida e meno soggetta a errori e di offrire raccomandazioni più precise e appropriate dal punto di vista contestuale.

Leggi anche: Costruzione di un sistema di raccomandazione basato sul contenuto

Completamento automatico di Google Search

Ogni volta che utilizziamo un motore di ricerca come Google per cercare qualcosa, riceviamo molte idee e, man mano che aggiungiamo frasi, le raccomandazioni diventano migliori e più pertinenti alla nostra ricerca attuale. Come è possibile?

Tecnologia di elaborazione del linguaggio naturale (NLP). Qui, useremo la tecnologia di elaborazione del linguaggio naturale (NLP) per creare un modello di previsione che utilizzi un modello LSTM bidirezionale (memoria a breve termine a lungo termine) per prevedere le parole rimanenti della frase.

Ulteriori informazioni: Cos’è LSTM? Introduzione alla memoria a breve termine a lungo termine

Importazione delle librerie e dei pacchetti necessari

Sarà meglio importare le librerie e i pacchetti necessari per costruire un modello di previsione della prossima parola utilizzando un LSTM bidirezionale. Di seguito viene mostrato un esempio delle librerie generalmente richieste:

import pandas as pd
import os
import numpy as np

import tensorflow as tf
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Embedding, LSTM, Dense, Bidirectional
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.models import Sequential
from tensorflow.keras.optimizers import Adam

Informazioni sul dataset

Per comprendere le caratteristiche e gli attributi del dataset con cui si sta lavorando, è necessaria una conoscenza approfondita. Questo dataset include sette articoli VoAGI selezionati casualmente e pubblicati nel 2019:

  • Towards Data Science
  • UX Collective
  • The Startup
  • The Writing Cooperative
  • Data Driven Investor
  • Better Humans
  • Better Marketing

Link al dataset: https://www.kaggle.com/code/ysthehurricane/next-word-prediction-bi-lstm-tutorial-easy-way/input

VoAGI_data = pd.read_csv('../input/medium-articles-dataset/medium_data.csv')
VoAGI_data.head()

In questo caso, ci sono dieci campi diversi e 6508 record, ma utilizzeremo solo il campo del titolo per prevedere la prossima parola.

print("Numero di record: ", VoAGI_data.shape[0])
print("Numero di campi: ", VoAGI_data.shape[1])

Osservando e comprendendo le informazioni sul dataset, è possibile scegliere le procedure di pre-elaborazione, il modello e le metriche di valutazione per la sfida di previsione della prossima parola.

Visualizza i titoli di vari articoli e pre-elaborali

Diamo un’occhiata a alcuni titoli di esempio per illustrare la preparazione dei titoli degli articoli:

VoAGI_data['title']

Rimozione Caratteri e Parole Indesiderate nei Titoli

La pre-elaborazione dei dati testuali per compiti di previsione include talvolta la rimozione di lettere e frasi indesiderate dai titoli. Le lettere e le parole indesiderate potrebbero contaminare i dati con rumore e aggiungere una complessità inutile, riducendo così le prestazioni e l’accuratezza del modello.

  1. Caratteri Indesiderati:
    1. Segni di Punteggiatura: Dovresti rimuovere i punti esclamativi, i punti interrogativi, le virgole e altri segni di punteggiatura. Di solito, puoi eliminarli in modo sicuro perché di solito non aiutano nell’assegnazione della previsione.
    2. Caratteri Speciali: Rimuovi i simboli non alfanumerici, come il dollaro, l’@, gli hashtag e altri caratteri speciali, che non sono necessari per il compito di previsione.
    3. Tag HTML: Se i titoli hanno markup HTML o tag, rimuovili utilizzando gli strumenti o le librerie appropriate per estrarre il testo.
  2. Parole Indesiderate:
    1. Stop Words: Rimuovi le comuni stop words come “un”, “uno”, “il”, “è”, “in” e altre parole che si verificano frequentemente e non hanno un significato significativo o un potere predittivo.
    2. Parole Non Rilevanti: Identifica e rimuovi parole specifiche che non sono rilevanti per il compito o il dominio di previsione. Ad esempio, se stai prevedendo i generi dei film, parole come “film” o “pellicola” potrebbero non fornire informazioni utili.
VoAGI_data['title'] = VoAGI_data['title'].apply(lambda x: x.replace(u'\xa0',u' '))
VoAGI_data['title'] = VoAGI_data['title'].apply(lambda x: x.replace('\u200a',' '))

Tokenizzazione

La tokenizzazione divide il testo in token, parole, sotto-parole o caratteri e assegna quindi un ID o un indice unico a ciascun token, creando un indice di parole o vocabolario.

Il processo di tokenizzazione comprende i seguenti passaggi:

Pre-elaborazione del testo: Pre-elabora il testo eliminando la punteggiatura, convertendolo in minuscolo e gestendo eventuali esigenze specifiche del compito o del dominio.

Tokenizzazione: Divide il testo pre-elaborato in token separati da regole o metodi predefiniti. Le espressioni regolari, la separazione tramite spazi vuoti e l’uso di tokenizer specializzati sono tutte tecniche comuni di tokenizzazione.

Aumento del Vocabolario Puoi creare un dizionario, chiamato anche indice di parole, assegnando a ciascun token un ID o un indice unico. In questo processo, ogni titolo viene mappato al valore di indice rilevante.

tokenizer = Tokenizer(oov_token='<oov>') # Per le parole che non vengono trovate in word_index
tokenizer.fit_on_texts(VoAGI_data['title'])
total_words = len(tokenizer.word_index) + 1

print("Numero totale di parole: ", total_words)
print("Parola: ID")
print("------------")
print("<oov>: ", tokenizer.word_index['<oov>'])
print("Strong: ", tokenizer.word_index['strong'])
print("And: ", tokenizer.word_index['and'])
print("Consumption: ", tokenizer.word_index['consumption'])

Trasformando il testo in un vocabolario o indice di parole, puoi creare una tabella di ricerca che rappresenta il testo come una collezione di indici numerici. Ogni parola unica nel testo riceve un valore di indice corrispondente, consentendo ulteriori operazioni di elaborazione o modellazione che richiedono input numerici.

Trasformazione dei Titoli in Sequenze e Creazione di un Modello N-gram

Queste fasi possono essere utilizzate per costruire un modello n-gram per una previsione accurata basata su sequenze di titoli:

  1. Convertire i Titoli in Sequenze: Utilizzare un tokenizer per trasformare ciascun titolo in una stringa di token o separare manualmente ciascun token in parole costituenti. Assegna a ciascuna parola nel lessico un numero di indice distinto.
  2. Generare n-gram: Dalle sequenze, creare n-grammi. Una sequenza continua di n-token di titolo viene chiamata n-gramma.
  3. Contare la Frequenza: Determinare la frequenza con cui ciascun n-gramma appare nel dataset.
  4. Costruire il Modello n-gramma: Creare il modello n-gramma utilizzando le frequenze degli n-grammi. Il modello tiene traccia di ogni probabilità di token dato i precedenti n-1 token. Questo può essere visualizzato come una tabella di ricerca o un dizionario.
  5. Prevedere la Prossima Parola: Il prossimo token previsto in una sequenza di n-1 token può essere identificato utilizzando il modello n-gramma. Per fare ciò, è necessario trovare la probabilità nell’algoritmo e selezionare un token con la maggior probabilità.

Ulteriori informazioni: Cosa sono gli N-grammi e come implementarli in Python?

Puoi utilizzare queste fasi per costruire un modello N-gramma che utilizza le sequenze dei titoli per prevedere la prossima parola o token. Basandosi sui dati di addestramento, questo metodo può produrre previsioni accurate poiché cattura le relazioni statistiche e le tendenze nell’uso del linguaggio dei titoli.

input_sequences = []
for line in VoAGI_data['title']:
    token_list = tokenizer.texts_to_sequences([line])[0]
    #print(token_list)
    
    for i in range(1, len(token_list)):
        n_gram_sequence = token_list[:i+1]
        input_sequences.append(n_gram_sequence)

# print(input_sequences)
print("Sequenze di input totali: ", len(input_sequences))

Rendere tutti i titoli della stessa lunghezza utilizzando il padding

Puoi utilizzare il padding per assicurarti che ogni titolo abbia la stessa dimensione seguendo questi passaggi:

  • Trova il titolo più lungo nel tuo dataset confrontando tutti gli altri titoli.
  • Ripeti questo processo per ogni titolo, confrontando la lunghezza di ciascuno con il limite complessivo.
  • Quando un titolo è troppo corto, deve essere esteso utilizzando un token o carattere di padding specifico.
  • Esegui nuovamente la procedura di padding per ogni titolo nel tuo dataset.

Il padding assicurerà che tutti i titoli abbiano la stessa lunghezza e fornirà coerenza per il post-processing o l’addestramento del modello.

# sequenze di padding
max_sequence_len = max([len(x) for x in input_sequences])
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre'))
input_sequences[1]

Preparazione di Features e Label

Nello scenario dato, se consideriamo l’ultimo elemento di ogni sequenza di input come etichetta, possiamo eseguire la codifica one-hot sui titoli per rappresentarli come vettori corrispondenti al numero totale di parole uniche.

# creazione di features e label
xs, labels = input_sequences[:,:-1],input_sequences[:,-1]
ys = tf.keras.utils.to_categorical(labels, num_classes=total_words)


print(xs[5])
print(labels[5])
print(ys[5][14])

L’architettura della rete neurale LSTM bidirezionale

Le reti neurali ricorrenti (RNN) con memoria a lungo termine (LSTM) possono raccogliere e mantenere informazioni su sequenze estese. Le reti LSTM utilizzano celle di memoria specializzate e tecniche di gating per superare i problemi delle RNN regolari, che spesso lottano con il problema del gradiente che svanisce e hanno difficoltà a mantenere dipendenze a lungo termine.

La caratteristica fondamentale delle reti LSTM è la cella di memoria, che funge da unità di memoria in grado di memorizzare informazioni nel tempo. La cella di memoria è protetta e controllata da tre gate principali: il gate di oblio, il gate di input e il gate di output. Questi gate regolano il flusso di informazioni dentro, fuori e all’interno della cella LSTM, consentendo alla rete di ricordare o dimenticare informazioni in diversi passaggi temporali in modo selettivo.

Ulteriori informazioni: Memoria a lungo termine | Architettura di LSTM

LSTM Bidirezionale

Addestramento del modello di rete neurale Bi-LSTM

Durante l’addestramento di un modello di rete neurale bidirezionale Bi-LSTM, è necessario seguire diverse procedure cruciali. Il primo passo è compilare un dataset di addestramento con sequenze di input e output corrispondenti, che indicano la prossima parola. I dati di testo devono essere preelaborati dividendo le linee in modo separato, rimuovendo la punteggiatura e convertendo le lettere in minuscolo.

model = Sequential()
model.add(Embedding(total_words, 100, input_length=max_sequence_len-1))
model.add(Bidirectional(LSTM(150)))
model.add(Dense(total_words, activation='softmax'))
adam = Adam(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
history = model.fit(xs, ys, epochs=50, verbose=1)
#print model.summary()
print(model)

Chiamando il metodo fit(), il modello viene addestrato. I dati di addestramento consistono nelle sequenze di input (xs) e nelle sequenze di output corrispondenti (ys). Il modello procede attraverso 50 iterazioni, passando attraverso l’intero set di addestramento. Durante il processo di addestramento, viene mostrato il progresso dell’addestramento (verbose=1).

Grafico dell’accuratezza e della perdita del modello

La tracciatura dell’accuratezza e della perdita di un modello durante l’addestramento fornisce informazioni utili su quanto bene si comporta e su come sta procedendo l’addestramento. L’errore o la discrepanza tra i valori previsti e quelli effettivi è chiamato perdita. Mentre la percentuale di previsioni accurate generate dal modello è nota come accuratezza.

import matplotlib.pyplot as plt


def plot_graphs(history, string):
    plt.plot(history.history[string])
    plt.xlabel("Epoca")
    plt.ylabel(string)
    plt.show()

plot_graphs(history, 'accuratezza')

plot_graphs(history, 'perdita')

Prevedere la Prossima Parola del Titolo

Una sfida affascinante nell’elaborazione del linguaggio naturale è indovinare la parola successiva in un titolo. I modelli possono proporre la presentazione più probabile cercando modelli e correlazioni nei dati testuali. Questo potere predittivo rende possibili applicazioni come i sistemi di suggerimento del testo e l’autocompletamento. Approcci sofisticati come le reti neurali ricorrenti (RNN) e le architetture basate su trasformatori aumentano l’accuratezza e catturano le relazioni contestuali.

seed_text = "implementazione di"
next_words = 2
  
for _ in range(next_words):
    token_list = tokenizer.texts_to_sequences([seed_text])[0]
    token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
    predicted = model.predict_classes(token_list, verbose=0)
    output_word = ""
    for word, index in tokenizer.word_index.items():
        if index == predicted:
            output_word = word
            break
    seed_text += " " + output_word
print(seed_text)

Conclusione

In conclusione, addestrare un modello per prevedere la parola successiva in una stringa di parole è la sfida eccitante dell’elaborazione del linguaggio naturale nota come previsione della prossima parola utilizzando un LSTM bidirezionale. Ecco la conclusione riassunta in punti chiave:

  • L’architettura potente del deep learning BI-LSTM per l’elaborazione di dati sequenziali può catturare relazioni a lungo raggio e contesto di frase.
  • Per preparare i dati di testo grezzi per l’addestramento BI-LSTM, è essenziale la preparazione dei dati. Ciò include la tokenizzazione, la generazione del vocabolario e la vettorizzazione del testo.
  • La creazione di una funzione di perdita, la costruzione del modello utilizzando un ottimizzatore, l’adattamento ai dati preprocessati e la valutazione delle sue prestazioni sui set di validazione sono i passaggi per l’addestramento del modello BI-LSTM.
  • La previsione della prossima parola con BI-LSTM richiede una combinazione di conoscenze teoriche e sperimentazione pratica per essere padroneggiata.
  • L’autocompletamento, la creazione del linguaggio e gli algoritmi di suggerimento del testo sono esempi di applicazioni del modello di previsione della prossima parola.

Le applicazioni per la previsione della prossima parola includono i chatbot, la traduzione automatica e il completamento del testo. È possibile creare modelli di previsione della prossima parola più precisi e consapevoli del contesto con ulteriori ricerche e miglioramenti.

Domande Frequenti

I contenuti mostrati in questo articolo non sono di proprietà di Analytics Vidhya e sono utilizzati a discrezione dell’autore.