Guida alla classificazione del testo per Android

L'attività Classificatore di testo MediaPipe consente di classificare il testo in un insieme di categorie definite, come sentiment positivo o negativo. Le categorie sono determinate dal modello utilizzato e dalle modalità di addestramento. Queste istruzioni mostrano come usare il classificatore di testo con app per Android.

Puoi vedere questa attività in azione visualizzando la demo. Per ulteriori informazioni sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.

Esempio di codice

Il codice di esempio per Text Classifier fornisce una semplice implementazione di questa attività come riferimento. Questo codice ti consente di testare questa attività e iniziare a creare la tua app di classificazione del testo. Puoi sfogliare il codice di esempio di Text Classifier su GitHub.

Scarica il codice

Le seguenti istruzioni mostrano come creare una copia locale del codice di esempio utilizzando lo strumento a riga di comando per il controllo della versione git.

Per scaricare il codice di esempio:

  1. Clona il repository git utilizzando il seguente comando:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Facoltativamente, configura la tua istanza Git in modo da utilizzare un pagamento sparse, in modo da avere solo i file per l'app di esempio Text Classifier:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

Per istruzioni su come configurare ed eseguire un esempio con Android Studio, consulta le istruzioni per la configurazione del codice di esempio nella Guida alla configurazione per Android.

Componenti chiave

I seguenti file contengono il codice fondamentale per l'app di esempio di classificazione del testo:

Configurazione

In questa sezione vengono descritti i passaggi chiave per configurare l'ambiente di sviluppo e codificare i progetti in modo specifico per l'utilizzo di Text Classifier. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo di MediaPipe Tasks, inclusi i requisiti di versione della piattaforma, consulta la Guida alla configurazione per Android.

Dipendenze

Il classificatore di testo utilizza le librerie com.google.mediapipe:tasks-text. Aggiungi questa dipendenza al file build.gradle del tuo progetto di sviluppo di app Android. Puoi importare le dipendenze richieste con il seguente codice:

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

Modello

L'attività Classificatore di testo MediaPipe richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per il classificatore di testo, consulta la sezione Modelli della panoramica dell'attività.

Seleziona e scarica un modello, quindi memorizzalo nella directory assets del progetto:

<dev-project-root>/src/main/assets

Usa il metodo BaseOptions.Builder.setModelAssetPath() per specificare il percorso del modello da utilizzare. Per un esempio di codice, consulta la sezione successiva.

Creare l'attività

Utilizza una delle funzioni TextClassifier.createFrom...() del classificatore di testo per preparare l'attività all'esecuzione delle inferenze. Puoi utilizzare la funzione createFromFile() con un percorso relativo o assoluto al file del modello addestrato. L'esempio di codice riportato di seguito mostra l'uso della funzione TextClassifier.createFromOptions(). Per ulteriori informazioni sulle opzioni di configurazione disponibili, consulta Opzioni di configurazione.

Il codice seguente mostra come creare e configurare questa attività.

// no directory path required if model file is in src/main/assets:
String currentModel = "text_classifier_model.tflite";

fun initClassifier() {
    val baseOptionsBuilder = BaseOptions.builder()
        .setModelAssetPath(currentModel)
    try {
        val baseOptions = baseOptionsBuilder.build()
        val optionsBuilder = TextClassifier.TextClassifierOptions.builder()
            .setBaseOptions(baseOptions)
        val options = optionsBuilder.build()
        textClassifier = TextClassifier.createFromOptions(context, options)
    } catch (e: IllegalStateException) { // exception handling
    }
}

Puoi vedere un esempio di come creare un'attività nell'esempio di codice della funzione initClassifier() della classe TextClassifierHelper.

Opzioni di configurazione

Questa attività prevede le seguenti opzioni di configurazione per le app per Android:

Nome opzione Descrizione Intervallo di valori Valore predefinito
displayNamesLocale Imposta la lingua delle etichette da utilizzare per i nomi visualizzati forniti nei metadati del modello dell'attività, se disponibili. Il valore predefinito è en per l'inglese. Puoi aggiungere etichette localizzate ai metadati di un modello personalizzato utilizzando l'API Metadata Writer di TensorFlow Lite Codice impostazioni internazionali it
maxResults Imposta il numero massimo facoltativo di risultati di classificazione con il punteggio più alto da restituire. Se < 0, verranno restituiti tutti i risultati disponibili. Eventuali numeri positivi -1
scoreThreshold Imposta la soglia del punteggio di previsione che sostituisce quella fornita nei metadati del modello (se presenti). I risultati inferiori a questo valore vengono rifiutati. Qualsiasi elemento in virgola mobile Non impostata
categoryAllowlist Consente di impostare l'elenco facoltativo di nomi di categorie consentite. Se il campo non è vuoto, i risultati della classificazione il cui nome categoria non è presente in questo set verranno filtrati. I nomi di categoria duplicati o sconosciuti vengono ignorati. Questa opzione si esclude a vicenda con categoryDenylist e l'utilizzo di entrambe genera un errore. Qualsiasi stringa Non impostata
categoryDenylist Consente di impostare l'elenco facoltativo di nomi di categorie non consentiti. Se il campo non è vuoto, i risultati di classificazione il cui nome di categoria è presente in questo set verranno filtrati. I nomi di categoria duplicati o sconosciuti vengono ignorati. Questa opzione si esclude a vicenda con categoryAllowlist e l'uso di entrambe genera un errore. Qualsiasi stringa Non impostata

Preparazione dei dati

Il classificatore di testo funziona con i dati di testo (String). L'attività gestisce la pre-elaborazione dell'input dei dati, tra cui la tokenizzazione e la pre-elaborazione tensor.

L'intera pre-elaborazione viene gestita all'interno della funzione classify(). Non è necessaria un'ulteriore pre-elaborazione del testo di input.

String inputText = "The input text to be classified.";

Esegui l'attività

Il classificatore di testo utilizza la funzione TextClassifier.classify() per eseguire le inferenze. Usa un thread di esecuzione separato per l'esecuzione della classificazione in modo da evitare di bloccare il thread dell'interfaccia utente di Android con la tua app.

Il codice seguente mostra come eseguire l'elaborazione con il modello di attività utilizzando un thread di esecuzione separato.

    fun classify(text: String) {
        executor = ScheduledThreadPoolExecutor(1)

        executor.execute {
            val results = textClassifier.classify(text)
            listener.onResult(results)
        }
    }

Per un esempio di come eseguire un'attività, consulta la funzione classify() di esempio di codice TextClassifierHelper.

Gestire e visualizzare i risultati

Il classificatore di testo restituisce un TextClassifierResult che contiene l'elenco di possibili categorie per il testo di input. Le categorie sono definite dal modello utilizzato, quindi se vuoi categorie diverse, scegli un modello diverso o riaddestra uno esistente.

Di seguito è riportato un esempio dei dati di output di questa attività:

TextClassificationResult:
  Classification #0 (single classification head):
    ClassificationEntry #0:
      Category #0:
        category name: "positive"
        score: 0.8904
        index: 0
      Category #1:
        category name: "negative"
        score: 0.1096
        index: 1

Questo risultato è stato ottenuto eseguendo il classificatore BERT sul testo di input: "an imperfect but overall entertaining mystery".

Puoi vedere un esempio di come visualizzare i risultati nell'esempio di codice della classe ResultsAdapter e nella classe interna ViewHolder.