Torna alla versione inglese della documentazione

Classificazione del testo con un modello personalizzato di classificazione

Ultimo aggiornamento: 28 nov 2024
Classificazione del testo con un modello personalizzato di classificazione

È possibile addestrare i propri modelli per la classificazione del testo utilizzando algoritmi di classificazione avanzati da tre diverse famiglie:

  • Apprendimento automatico classico mediante SVM (Support Vector Machines)
  • Apprendimento approfondito con CNN (Convolutional Neural Networks)
  • Un algoritmo basato su transformer che utilizza un modello di transformer pre - addestrato: modello Slate IBM Foundation

La libreria Watson Natural Language Processing offre anche un classificatore Ensemble facile da utilizzare che combina diversi algoritmi di classificazione e voto a maggioranza.

Gli algoritmi supportano attività a più etichette e a più classi e casi speciali, ad esempio se il documento appartiene a una sola classe (attività a singola etichetta) o attività di classificazione binaria.

Nota:

I modelli di classificazione di addestramento utilizzano molta CPU e memoria. A seconda della dimensione dei tuoi dati di addestramento, l'ambiente potrebbe non essere abbastanza grande per completare la formazione. Se si verificano problemi con il kernel del notebook durante l'addestramento, creare un ambiente notebook personalizzato con una maggiore quantità di CPU e memoria e utilizzarlo per eseguire il notebook. Soprattutto per gli algoritmi basati sui trasformatori, dovresti utilizzare un ambiente basato sulla GPU, se è disponibile per te. Consultare Creazione del proprio template ambiente.

Sezioni argomento:

Formato dei dati di input per l'addestramento

I blocchi di classificazione accettano i dati di addestramento nei formati CSV e JSON.

  • Il formato CSV

    Il file CSV non deve contenere alcuna intestazione. Ogni riga nel file CSV rappresenta un record di esempio. Ogni record ha una o più colonne, dove la prima colonna rappresenta il testo e le colonne successive rappresentano le etichette associate a quel testo.

    Nota:

    • Gli algoritmi SVM e CNN non supportano i dati di addestramento in cui un'istanza non ha etichette. Quindi, se si sta utilizzando l'algoritmo SVM, o l'algoritmo CNN, o un Ensemble che include uno di questi algoritmi, ogni riga CSV deve avere almeno un'etichetta, cioè 2 colonne.
    • Gli algoritmi di trasformazione basati su BERT e basati su Slate supportano i dati di addestramento in cui ogni istanza ha 0, 1 o più di un'etichetta.
    Example 1,label 1
    Example 2,label 1,label 2
    
  • Il formato JSON

    I dati di addestramento sono rappresentati come un array con più oggetti JSON. Ogni oggetto JSON rappresenta un'istanza di addestramento e deve avere un campo di testo e di etichette. Il testo rappresenta l'esempio di addestramento e le etichette memorizzano le etichette associate all'esempio (0, 1 o più di un'etichetta).

    [
        {
        "text": "Example 1",
        "labels": ["label 1"]
        },
        {
        "text": "Example 2",
        "labels": ["label 1", "label 2"]
        },
        {
        "text": "Example 3",
        "labels": []
        }
    ]
    

    Nota:

    • "labels": [] indica un esempio senza etichette. Gli algoritmi SVM e CNN non supportano i dati di addestramento in cui un'istanza non ha etichette. Quindi, se si sta utilizzando l'algoritmo SVM, o l'algoritmo CNN, o un Ensemble che include uno di questi algoritmi, ogni oggetto JSON deve avere almeno un'etichetta.
    • Gli algoritmi di trasformazione basati su BERT e basati su Slate supportano i dati di addestramento in cui ogni istanza ha 0, 1 o più di un'etichetta.

Requisiti dei dati di input

Per gli algoritmi SVM e CNN:

  • Numero minimo di etichette univoche richieste: 2
  • Numero minimo di esempi di testo richiesti per etichetta: 5

Per gli algoritmi di trasformazione basati su BERT e su Slate:

  • Numero minimo di etichette univoche richieste: 1
  • Numero minimo di esempi di testo richiesti per etichetta: 5

I dati di allenamento in formato CSV o JSON vengono convertiti in un DataStream prima dell'allenamento. Invece di file di dati di addestramento, è anche possibile passare i flussi di dati direttamente alle funzioni di addestramento dei blocchi di classificazione.

Parole non significative

È possibile fornire le proprie stopword che verranno rimosse durante la pre - elaborazione. Gli input del file di parole non significative sono previsti in formato standard: un singolo file di testo con una frase per riga. Le parole non significative possono essere fornite come un elenco o come un file in un formato standard.

Le parole non significative possono essere utilizzate solo con il classificatore Ensemble.

Addestramento degli algoritmi SVM

SVM è un classificatore della macchina vettore di supporto che può essere addestrato utilizzando previsioni su qualsiasi tipo di input fornito dai blocchi di incorporazione o vettorizzazione come vettori di funzione, ad esempio, da USE (Universal Sentence Encoder) e TF-IDF vettorizzatori. Supporta la classificazione di testi multiclasse e multietichetta e produce punteggi di confidenza utilizzando il ridimensionamento Platt.

Per tutte le opzioni disponibili per la configurazione della formazione SVM, immettere:

help(watson_nlp.blocks.classification.svm.SVM.train)

Per eseguire il training degli algoritmi SVM:

  1. Iniziare con i seguenti passi di preelaborazione:

    import watson_nlp
    from watson_nlp.toolkit.classification_utils.train_util import prepare_data_from_json
    from watson_nlp.blocks.classification.svm import SVM
    
    training_data_file = "train_data.json"
    
    # Load a Syntax model
    syntax_model = watson_nlp.load('syntax_izumo_en_stock')
    
    # Create datastream from training data
    train_stream = prepare_data_from_json(training_data_file, syntax_model)
    syntax_stream, labels_stream = train_stream[0], train_stream[1]
    
  2. Addestrare il modello di classificazione utilizzando USE embeddings. Per un elenco dei blocchi preaddestrati disponibili, vedere Incorporazione degli USE preaddestrati che sono inclusi .

    # download embedding
    use_embedding_model = watson_nlp.load('embedding_use_en_stock')
    
    use_train_stream = use_embedding_model.stream(syntax_stream, doc_embed_style='raw_text')
    # NOTE: doc_embed_style can be changed to `avg_sent` as well. For more information check the documentation for Embeddings
    # Or the USE run function API docs
    use_svm_train_stream = watson_nlp.data_model.DataStream.zip(use_train_stream, labels_stream)
    
    # Train SVM using Universal Sentence Encoder (USE) training stream
    classification_model = SVM.train(use_svm_train_stream)
    

Addestramento dell'algoritmo CNN

CNN è una semplice architettura di rete convoluzionale, costruita per la classificazione di testi multi - classe e multi - etichetta su testi brevi. Utilizza GloVe incastri. GloVe gli incorporamenti codificano la semantica a livello di parola in uno spazio vettoriale. IL GloVe gli incorporamenti per ciascuna lingua vengono addestrati sul corpus di Wikipedia in quella lingua. Per informazioni sull'utilizzo GloVe incastri, vedi GloVe Incorporamenti.

Per tutte le opzioni disponibili per la configurazione dell'addestramento CNN, immettere:

help(watson_nlp.blocks.classification.cnn.CNN.train)

Per addestrare gli algoritmi CNN:

import watson_nlp
from watson_nlp.toolkit.classification_utils.train_util import prepare_data_from_json
from watson_nlp.blocks.classification.cnn import CNN

training_data_file = "train_data.json"

# Load a Syntax model
syntax_model = watson_nlp.load('syntax_izumo_en_stock')

# Create datastream from training data
train_stream = prepare_data_from_json(training_data_file, syntax_model)
syntax_stream, labels_stream = train_stream[0], train_stream[1]

# Download GloVe embeddings
glove_embedding_model = watson_nlp.load('embedding_glove_en_stock')

# Train CNN
classification_model = CNN.train(watson_nlp.data_model.DataStream.zip(syntax_stream, labels_stream), embedding=glove_embedding_model.embedding)

Addestramento dell'algoritmo del trasformatore utilizzando il modello IBM Slate

L'algoritmo del trasformatore che utilizza uno Slate preaddestrato IBM Il modello Foundation può essere utilizzato per la classificazione di testi multiclasse e multietichetta su testi brevi.

Per tutte le opzioni disponibili per la configurazione dell'addestramento di Transformer, immettere:

help(watson_nlp.blocks.classification.transformer.Transformer.train)

Per un elenco dei modelli Slate disponibili, vedere questa tabella:

Elenco dei modelli Slate disponibili e relative descrizioni
Modello Descrizione
pretrained-model_slate.153m.distilled_many_transformer_multilingual_uncased Modello generico e multiuso
pretrained-model_slate.125m.finance_many_transformer_en_cased Modello preaddestrato sui contenuti finanziari
pretrained-model_slate.110m.cybersecurity_many_transformer_en_uncased Modello preaddestrato sui contenuti di sicurezza informatica
pretrained-model_slate.125m.biomedical_many_transformer_en_cased Modello preaddestrato sui contenuti biomedici

Per addestrare gli algoritmi Transformer:

import watson_nlp
from watson_nlp.blocks.classification.transformer import Transformer
from watson_nlp.toolkit.classification_utils.train_util import prepare_stream_of_train_records
from watson_nlp import data_model as dm

training_data_file = "train_data.json"

# Create datastream from training data
train_data_stream = dm.DataStream.from_file(training_data_file)
train_record_data_stream = prepare_stream_of_train_records(train_data_stream)

# Load pre-trained slate model
pretrained_model_resource = watson_nlp.load('<pretrained Slate model>')

# Train model - note that Transformer uses Slatea by default
classification_model = Transformer.train(train_data_stream=train_record_data_stream,
                                         pretrained_model_resource=pretrained_model_resource)

Formazione di un modello di trasformatore personalizzato utilizzando un modello fornito da Hugging Face

È possibile addestrare un modello personalizzato basato su trasformatori utilizzando un modello preaddestrato di Hugging Face.

Per utilizzare un modello Hugging Face, specificare il nome del modello come parametro 'pretrained_model_resource nel metodo 'train di 'watson_nlp.blocks.classification.transformer.Transformer. Accedere a https://huggingface.co/models per copiare il nome del modello.

Per ottenere un elenco di tutte le opzioni disponibili per configurare un addestramento del trasformatore, immettere questo codice:

help(watson_nlp.blocks.classification.transformer.Transformer.train)

Per informazioni su come addestrare gli algoritmi del trasformatore, fare riferimento a questo esempio di codice:

import watson_nlp
from watson_nlp.blocks.classification.transformer import Transformer
from watson_nlp.toolkit.classification_utils.train_util import prepare_stream_of_train_records
from watson_nlp import data_model as dm

training_data_file = "train_data.json"

# Create datastream from training data
train_data_stream = dm.DataStream.from_file(training_data_file)
train_record_data_stream = prepare_stream_of_train_records(train_data_stream)

# Specify the name of the Hugging Face model
huggingface_model_name = 'xml-roberta-base'

# Train model
classification_model = Transformer.train(train_data_stream=train_record_data_stream,
                                         pretrained_model_resource=huggingface_model_name)

Addestramento di un modello di insieme

Il modello Ensemble è un insieme ponderato di questi tre algoritmi: CNN, SVM con TF-IDF e SVM con USE. Calcola la media ponderata di un insieme di previsioni di classificazione utilizzando i punteggi di confidenza. Il modello ensemble è molto facile da usare.

Il classificatore GenericEnsemble consente all'utente di scegliere tra i tre classificatori di base TFIDF - SVM, USE - SVM e CNN. Per testi che vanno da 50 a 1000 caratteri, l'uso della combinazione di classificatori TFIDF-SVM e USE - SVM spesso produce un buon equilibrio di qualità e prestazioni. Su alcuni documenti medi o lunghi (500-1000 + caratteri), l'aggiunta della CNN all'Ensemble potrebbe aiutare ad aumentare la qualità, ma di solito viene fornito con un significativo impatto sulle prestazioni di runtime (velocità di trasmissione inferiore e maggiore tempo di caricamento del modello).

Per tutte le opzioni disponibili per la configurazione della formazione dell'insieme, immettere:

help(watson_nlp.workflows.classification.GenericEnsemble)

Per addestrare gli algoritmi dell'insieme:

import watson_nlp
from watson_nlp.workflows.classification.generic_ensemble import GenericEnsemble
from watson_nlp.workflows.classification.base_classifier import GloveCNN
from watson_nlp.workflows.classification.base_classifier import TFidfSvm

training_data_file = "train_data.json"

# Syntax model
syntax_model = watson_nlp.load('syntax_izumo_en_stock')

# GloVE Embedding model
glove_embedding_model = watson_nlp.load('embedding_glove_en_stock')

# Train classifier using the manually defined base classifier and manually defined weights¶
classification_model = GenericEnsemble.train(training_data_file,
                                             syntax_model,
                                             base_classifiers_params=[
                                                TFidfSvm.TrainParams(syntax_model=syntax_model),
                                                GloveCNN.TrainParams(syntax_model=syntax_model,
                                                                     glove_embedding_model=glove_embedding_model,
                                                                    )],
                                             weights=[2,1])

Modelli di parole di arresto preaddestrati disponibili pronti all'uso

Il modello di testo per l'identificazione delle parole non significative viene utilizzato nell'addestramento del modello dell'insieme di classificazione del documento.

La seguente tabella elenca i modelli di parole non significative preaddestrati e i codici lingua supportati (xx sta per codice lingua). Per un elenco dei codici lingua e della lingua corrispondente, consultare Codici lingua.

Elenco di modelli di parole di arresto preaddestrate con le relative lingue supportate
Classe di risorse Nome modello Lingue supportate
text text_stopwords_classification_ensemble_xx_stock ar, de, es, en, fr, it, ja, ko

Migliori pratiche di formazione

Esistono alcuni vincoli sulla qualità e sulla quantità dei dati per garantire che l'addestramento del modello di classificazioni possa essere completato in un periodo di tempo ragionevole e soddisfi anche diversi criteri di prestazione. Questi sono elencati di seguito. Si noti che nessuna è una restrizione rigida. Tuttavia, quanto più si discosta da queste linee guida, tanto maggiore è la possibilità che il modello non si alleni o non sarà soddisfacente.

  • Quantità dei dati

    • Il numero più alto di modelli di classificazione delle classi è stato testato su ~1200.
    • La dimensione del testo più adatta per l'addestramento e il test dei dati per la classificazione è di circa 3000 punti di codice. Tuttavia, è possibile elaborare anche testi più grandi, ma le prestazioni di runtime potrebbero essere più lente.
    • Il tempo di formazione aumenterà in base al numero di esempi e di etichette.
    • Il tempo di inferenza aumenterà in base al numero di etichette.
  • Qualità dei dati

    • La dimensione di ogni campione (ad esempio, il numero di frasi in ogni campione di addestramento) può influire sulla qualità.
    • La separazione delle classi è importante. In altre parole, le classi tra i dati di addestramento (e di test) devono essere semanticamente distinguibili l'una dall'altra per evitare errori di classificazione. Poiché gli algoritmi del classificatore in Watson Natural Language Processing si basano su integrazioni di parole, le classi di formazione che contengono esempi di testo con una sovrapposizione semantica eccessiva possono rendere la classificazione di alta qualità computazionalmente intrattabile. Mentre euristica più sofisticata può esistere per valutare la somiglianza semantica tra le classi, si dovrebbe iniziare con un semplice "eye test" di alcuni esempi di ogni classe per discernere se sembrano o meno adeguatamente separati.
    • Si consiglia di utilizzare dati bilanciati per l'addestramento. Idealmente dovrebbe esserci un numero grosso modo uguale di esempi da ogni classe nei dati di formazione, altrimenti i classificatori possono essere distorti verso classi con una rappresentazione più ampia nei dati di formazione.
    • È meglio evitare le circostanze in cui alcune classi nei dati di formazione sono altamente sottorappresentate rispetto ad altre classi.

Limitazioni e avvertenze:

  • Il blocco di classificazione CNN ha una lunghezza di sequenza predefinita di 1000 punti di codice. Questo limite può essere configurato in fase di addestramento modificando il parametro max_phrase_len. Non esiste un limite massimo per questo parametro, ma l'aumento della lunghezza massima della frase influirà sul consumo di CPU e memoria.
  • I blocchi SVM non hanno tale limite di lunghezza della sequenza e possono essere utilizzati con testi più lunghi.

Applicazione del modello ai nuovi dati

Dopo aver preparato il modello su un dataset, applicare il modello ai nuovi dati utilizzando il metodo run() , come si farebbe con uno qualsiasi dei blocchi preaddestrati esistenti.

Esempio di codice

  • Per i modelli Ensemble:

    # run Ensemble model on new text
    ensemble_prediction = ensemble_classification_model.run("new input text")
    
  • Per i modelli SVM e CNN, ad esempio per CNN:

    # run Syntax model first
    syntax_result = syntax_model.run("new input text")
    # run CNN model on top of syntax result
    cnn_prediction = cnn_classification_model.run(syntax_result)
    

Scegliere l'algoritmo giusto per il tuo caso d'uso

È necessario scegliere l'algoritmo del modello più adatto al proprio caso d'uso.

Quando si sceglie tra SVM, CNN e Transformers, considerare quanto segue:

  • Piastra basata su trasformatore

    • Scegliere quando è richiesta un'elevata qualità e quando sono disponibili risorse di elaborazione più elevate.
  • CNN

    • Scegliere quando sono disponibili dati di dimensioni decenti
    • Scegliere se l'incorporazione GloVe è disponibile per la lingua richiesta
    • Scegliere se si ha l'opzione tra etichetta singola e etichetta multipla
    • La CNN sintonizza le incorporazioni, in modo da poter offrire prestazioni migliori per termini sconosciuti o domini più recenti.
  • SVM

    • Scegliere se è necessario un modello più semplice
    • SVM ha il tempo di addestramento e inferenza più veloce
    • Scegliere se la dimensione del dataset è piccola

Se si seleziona SVM, è necessario considerare quanto segue quando si sceglie tra le diverse implementazioni di SVM:

  • Gli SVM formano i classificatori con più etichette.
  • Maggiore è il numero di classi, maggiore è il tempo di formazione.
  • TF - IDF:
    • Scegli la vettorizzazione TF-IDF con SVM se il dataset è piccolo, ad esempio ha un piccolo numero di classi, un piccolo numero di esempi e una dimensione del testo più breve, ad esempio, frasi contenenti meno frasi.
    • TF - IDF con SVM può essere più veloce di altri algoritmi nel blocco di classificazione.
    • Scegliere TF-IDF se le incorporazioni per la lingua richiesta non sono disponibili.
  • Usa:
    • Scegliere USE (Universal Frase Encoder) con SVM se il dataset ha una o più frasi nel testo di input.
    • USE può funzionare meglio su insiemi di dati in cui la comprensione del contesto di parole o frasi è importante.

Il modello Ensemble combina più modelli individuali (diversi) per fornire una potenza di previsione superiore. Considerare i seguenti dati chiave per questo tipo di modello:

  • Il modello ensemble combina CNN, SVM con TF-IDF e SVM con USE.
  • È il modello più semplice da utilizzare.
  • Può dare prestazioni migliori rispetto ai singoli algoritmi.
  • Funziona per tutti i tipi di dataset. Tuttavia, il tempo di addestramento per dataset di grandi dimensioni (più di 20000 esempi) può essere elevato.
  • Un modello di insieme consente di impostare i pesi. Questi pesi decidono in che modo il modello di insieme combina i risultati dei singoli classificatori. Attualmente, la selezione dei pesi è un'euristica e deve essere impostata per tentativi ed errori. I pesi predefiniti forniti nella funzione stessa sono un buon punto di partenza per l'esplorazione.

Argomento principale: Creazione di propri modelli