Przewodnik po klasyfikacji tekstu w Androidzie

Zadanie Klasyfikatora tekstu MediaPipe pozwala sklasyfikować tekst według zdefiniowanych kategorii, takich jak nastawienie pozytywne lub negatywne. Kategorie określają używany model i sposób jego trenowania. W tych instrukcjach pokazujemy, jak korzystać z klasyfikatora tekstu w aplikacjach na Androida.

Aby zobaczyć, jak działa to zadanie, obejrzyj prezentację. Więcej informacji o możliwościach, modelach i opcjach konfiguracji tego zadania znajdziesz w artykule Omówienie.

Przykładowy kod

Przykładowy kod narzędzia Text Classifier zawiera prostą implementację tego zadania do celów referencyjnych. Ten kod pomoże Ci przetestować to zadanie i rozpocząć tworzenie własnej aplikacji do klasyfikacji tekstu. Przykładowy kod klasyfikatora tekstu możesz przejrzeć na GitHubie.

Pobieranie kodu

Z instrukcji poniżej dowiesz się, jak utworzyć lokalną kopię przykładowego kodu za pomocą narzędzia wiersza poleceń git do kontroli wersji.

Aby pobrać przykładowy kod:

  1. Sklonuj repozytorium git za pomocą tego polecenia:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opcjonalnie skonfiguruj w instancji git rozproszony proces płatności, aby mieć tylko pliki dla przykładowej aplikacji Text Classifier:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

Instrukcje konfigurowania i uruchamiania przykładowego kodu w Android Studio znajdziesz w przewodniku konfiguracji na Androida.

Kluczowe elementy

Te pliki zawierają kluczowy kod aplikacji przykładowej do klasyfikacji tekstu:

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności, jakie należy wykonać, aby skonfigurować środowisko programistyczne i projekty kodu związane konkretnie z korzystaniem z Klasyfikatora tekstu. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby zadań MediaPipe, w tym o wymaganiach dotyczących wersji platformy, znajdziesz w przewodniku konfiguracji na Androida.

Zależności

Klasyfikator tekstu korzysta z bibliotek com.google.mediapipe:tasks-text. Dodaj tę zależność do pliku build.gradle swojego projektu na Androida. Możesz zaimportować wymagane zależności za pomocą tego kodu:

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

Model

Zadanie MediaPipe Text Classifier wymaga wytrenowanego modelu zgodnego z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach Klasyfikatora tekstu znajdziesz w sekcji poświęconej modelom na temat zadań.

Wybierz i pobierz model, a następnie zapisz go w katalogu assets projektu:

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

Aby określić ścieżkę modelu, który ma zostać użyty, użyj metody BaseOptions.Builder.setModelAssetPath(). Przykładowy kod znajdziesz w następnej sekcji.

Tworzenie zadania

Użyj 1 z funkcji klasyfikatora tekstu TextClassifier.createFrom...(), aby przygotować zadanie do uruchamiania wnioskowania. Możesz użyć funkcji createFromFile() ze ścieżką względną lub bezwzględną do wytrenowanego pliku modelu. W poniższym przykładzie kodu pokazano korzystanie z funkcji TextClassifier.createFromOptions(). Więcej informacji o dostępnych opcjach konfiguracji znajdziesz w artykule Opcje konfiguracji.

Poniższy kod pokazuje, jak skompilować i skonfigurować to zadanie.

// 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
    }
}

Przykład tworzenia zadania znajdziesz w przykładowej funkcji kodu TextClassifierHelper w klasie initClassifier().

Opcje konfiguracji

To zadanie ma te opcje konfiguracji aplikacji na Androida:

Nazwa opcji Opis Zakres wartości Wartość domyślna
displayNamesLocale Ustawia język etykiet, które mają być używane w przypadku nazw wyświetlanych w metadanych modelu zadania (jeśli są dostępne). Wartość domyślna w języku angielskim to en. Za pomocą TensorFlow Lite MetadataWriter API możesz dodawać zlokalizowane etykiety do metadanych modelu niestandardowego. Kod języka en
maxResults Określa opcjonalną maksymalną liczbę zwracanych wyników klasyfikacji o najwyższych wynikach. Jeśli wartość jest mniejsza niż 0, zostaną zwrócone wszystkie dostępne wyniki. Dowolne liczby dodatnie -1
scoreThreshold Ustawia próg wyniku prognozy, który zastępuje próg podany w metadanych modelu (jeśli istnieją). Wyniki poniżej tej wartości zostały odrzucone. Dowolna liczba zmiennoprzecinkowa Nie ustawiono
categoryAllowlist Ustawia opcjonalną listę dozwolonych nazw kategorii. Jeśli nie będzie pusty, wyniki klasyfikacji, których nazwy kategorii nie ma w tym zbiorze, zostaną odfiltrowane. Zduplikowane i nieznane nazwy kategorii są ignorowane. Ta opcja wzajemnie się wyklucza, categoryDenylist i ich użycie kończy się błędem. Dowolne ciągi Nie ustawiono
categoryDenylist Ustawia opcjonalną listę niedozwolonych nazw kategorii. Jeśli pole nie jest puste, wyniki klasyfikacji, których nazwa kategorii znajduje się w tym zbiorze, zostaną odfiltrowane. Zduplikowane i nieznane nazwy kategorii są ignorowane. Ta opcja wzajemnie się wyklucza z categoryAllowlist, a korzystanie z obu daje błąd. Dowolne ciągi Nie ustawiono

Przygotuj dane

Klasyfikator tekstu obsługuje dane tekstowe (String). To zadanie obsługuje wstępne przetwarzanie danych wejściowych, w tym tokenizację i wstępne przetwarzanie tensorów.

Przetwarzanie wstępne jest realizowane w ramach funkcji classify(). Nie ma potrzeby wcześniejszego wstępnego przetwarzania tekstu wejściowego.

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

Uruchamianie zadania

Klasyfikator tekstu używa funkcji TextClassifier.classify() do uruchamiania wnioskowania. Do przeprowadzenia klasyfikacji użyj osobnego wątku wykonania, aby uniknąć zablokowania wątku interfejsu Androida w aplikacji.

Poniższy kod pokazuje, jak wykonać przetwarzanie za pomocą modelu zadań za pomocą osobnego wątku wykonywania.

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

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

Przykład uruchamiania zadania znajdziesz w przykładowej funkcji kodu TextClassifierHelper w klasie classify().

Obsługa i wyświetlanie wyników

Klasyfikator tekstu generuje element TextClassifierResult zawierający listę możliwych kategorii tekstu wejściowego. Kategorie są definiowane przez używany przez Ciebie model, więc jeśli chcesz korzystać z innych kategorii, wybierz inny model lub ponownie wytrenuj istniejący.

Poniżej znajdziesz przykład danych wyjściowych z tego zadania:

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

Wynik można uzyskać, uruchamiając klasyfikator BERT na tekście wejściowym: "an imperfect but overall entertaining mystery".

Przykład wyświetlania wyników znajdziesz w przykładowej klasie ResultsAdapter i klasie wewnętrznej ViewHolder.