Guida alla classificazione del testo per Android

L'attività Classificatore di testo MediaPipe ti consente di classificare il testo in un insieme di categorie definite, come sentiment positivi o negativi. Le categorie sono determinate dal modello che usi e come è stato addestrato quel modello. Queste istruzioni mostrano come utilizzare il classificatore di testo con le app per Android.

Puoi vedere questa attività in azione visualizzando la demo. Per ulteriori informazioni su funzionalità, modelli di questa attività, consulta la Panoramica.

Esempio di codice

Il codice di esempio per Classificatore di testo fornisce una semplice implementazione come riferimento. Questo codice è utile per testare l'attività e iniziare creando la tua app di classificazione del testo. Puoi sfogliare Codice di esempio del classificatore di testo su GitHub.

Scarica il codice

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

Per scaricare il codice di esempio:

  1. Clona il repository git utilizzando il comando seguente:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Facoltativamente, configura l'istanza Git in modo da utilizzare il pagamento sparso, in modo da avere solo i file dell'app di esempio Classificatore di testo:
    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 di configurazione del codice di esempio nella Guida alla configurazione per Android.

Componenti chiave

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

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e per i progetti di codice che usano Classificatore di testo. Per informazioni generali su l'impostazione dell'ambiente di sviluppo per l'utilizzo di Attività di MediaPipe, tra cui: i requisiti di versione della piattaforma, consulta Guida alla configurazione per Android.

Dipendenze

Il classificatore di testo utilizza le librerie com.google.mediapipe:tasks-text. Aggiungi questo al file build.gradle del progetto di sviluppo di app per 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 dell'attività. Per ulteriori informazioni sui modelli addestrati disponibili per il classificatore di testo, consulta la panoramica delle attività nella sezione Modelli.

Seleziona e scarica un modello, quindi archivialo nel tuo progetto assets directory:

<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.

Crea l'attività

Usa una delle funzioni del classificatore di testo TextClassifier.createFrom...() per per preparare l'attività per l'esecuzione delle inferenze. Puoi usare createFromFile() con un percorso relativo o assoluto al file del modello addestrato. Il codice l'esempio seguente mostra l'utilizzo dell'elemento TextClassifier.createFromOptions() personalizzata. Per ulteriori informazioni sulle opzioni di configurazione disponibili, vedi Opzioni di configurazione.

Il codice seguente illustra 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à nel codice TextClassifierHelper di classe initClassifier().

Opzioni di configurazione

Questa attività include 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 nel metadati del modello dell'attività, se disponibili. Il valore predefinito è en per Inglese. Puoi aggiungere etichette localizzate ai metadati di un modello personalizzato Utilizzando l'API TensorFlow Metadata Writer Codice impostazioni internazionali it
maxResults Imposta il numero massimo facoltativo di risultati della classificazione con il punteggio più alto su per tornare indietro. Se < 0, verranno restituiti tutti i risultati disponibili. Qualsiasi numero positivo -1
scoreThreshold Imposta la soglia del punteggio di previsione che sostituisce quella fornita in gli eventuali metadati del modello. I risultati al di sotto di questo valore vengono rifiutati. Qualsiasi numero in virgola mobile Non impostato
categoryAllowlist Consente di impostare l'elenco facoltativo di nomi di categorie consentiti. Se il campo non è vuoto, i risultati della classificazione i cui nome non è incluso in questo set saranno esclusi. I nomi di categorie duplicati o sconosciuti vengono ignorati. Questa opzione si esclude a vicenda con categoryDenylist e utilizza entrambi generano un errore. Qualsiasi stringa Non impostato
categoryDenylist Consente di impostare un elenco facoltativo di nomi di categorie non consentiti. Se non vuoti, i risultati di classificazione con nome della categoria incluso in questo set verranno filtrati fuori. I nomi di categorie duplicati o sconosciuti vengono ignorati. Questa opzione è reciproca è esclusivo con categoryAllowlist e l'utilizzo di entrambi genera un errore. Qualsiasi stringa Non impostato

Preparazione dei dati

Classificatore di testo funziona con i dati di testo (String). L'attività gestisce l'input dei dati pre-elaborazione, tra cui la tokenizzazione e la pre-elaborazione dei tensori.

Tutte le pre-elaborazioni vengono gestite all'interno della funzione classify(). Non è necessario per un'ulteriore pre-elaborazione del testo di input in anticipo.

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

Esegui l'attività

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

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

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

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

Puoi vedere un esempio di come eseguire un'attività nel codice TextClassifierHelper di classe classify().

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 modello utilizzato, quindi se vuoi categorie diverse, scegli un modello diverso, o riaddestrare una rete 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 nel codice ResultsAdapter e ViewHolder classe interna.