Руководство по классификации текста для Android

Задача «Классификатор текста MediaPipe» позволяет классифицировать текст по набору определенных категорий, таких как положительные или отрицательные настроения. Категории определяются используемой вами моделью и способом обучения этой модели. В этих инструкциях показано, как использовать классификатор текста с приложениями Android.

Увидеть эту задачу в действии можно, просмотрев демо-версию . Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .

Пример кода

В примере кода классификатора текста представлена ​​простая реализация этой задачи. Этот код поможет вам протестировать эту задачу и приступить к созданию собственного приложения для классификации текста. Вы можете просмотреть пример кода классификатора текста на GitHub.

Загрузите код

Следующие инструкции показывают, как создать локальную копию примера кода с помощью инструмента командной строки управления версиями git .

Чтобы загрузить пример кода:

  1. Клонируйте репозиторий git, используя следующую команду:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. При желании настройте экземпляр git на использование разреженной проверки, чтобы у вас были только файлы для примера приложения классификатора текста:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

Инструкции по настройке и запуску примера с помощью Android Studio см. в инструкциях по настройке примера кода в Руководстве по установке для Android .

Ключевые компоненты

Следующие файлы содержат важный код для примера приложения классификации текста:

  • TextClassifierHelper.kt — инициализирует классификатор текста и обрабатывает выбор модели.
  • MainActivity.kt — реализует приложение, включая вызов TextClassifierHelper ResultsAdapter .
  • ResultAdapter.kt — обрабатывает и форматирует результаты.

Настраивать

В этом разделе описаны ключевые шаги по настройке среды разработки и проектов кода специально для использования классификатора текста. Общие сведения о настройке среды разработки для использования задач MediaPipe, включая требования к версии платформы, см. в руководстве по установке для Android .

Зависимости

Классификатор текста использует библиотеки com.google.mediapipe:tasks-text . Добавьте эту зависимость в файл build.gradle вашего проекта разработки приложения для Android. Вы можете импортировать необходимые зависимости с помощью следующего кода:

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

Модель

Для задачи классификатора текста MediaPipe требуется обученная модель, совместимая с этой задачей. Дополнительную информацию о доступных обученных моделях для Классификатора текста см. в разделе «Модели » обзора задач.

Выберите и загрузите модель, а затем сохраните ее в каталоге assets вашего проекта:

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

Используйте метод BaseOptions.Builder.setModelAssetPath() чтобы указать путь к используемой модели. Пример кода см. в следующем разделе.

Создать задачу

Используйте одну из функций классификатора текста TextClassifier.createFrom...() , чтобы подготовить задачу к выполнению выводов. Вы можете использовать функцию createFromFile() с относительным или абсолютным путем к файлу обученной модели. В приведенном ниже примере кода показано использование функции TextClassifier.createFromOptions() . Дополнительные сведения о доступных параметрах конфигурации см. в разделе Параметры конфигурации .

Следующий код демонстрирует, как создать и настроить эту задачу.

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

Пример создания задачи вы можете увидеть в примере кода функции initClassifier() класса TextClassifierHelper .

Варианты конфигурации

Эта задача имеет следующие параметры конфигурации для приложений Android:

Название опции Описание Диапазон значений Значение по умолчанию
displayNamesLocale Задает язык меток, которые будут использоваться для отображаемых имен, представленных в метаданных модели задачи, если они доступны. По умолчанию en английский язык. Вы можете добавить локализованные метки к метаданным пользовательской модели с помощью API записи метаданных TensorFlow Lite. Код региона ru
maxResults Устанавливает необязательное максимальное количество возвращаемых результатов классификации с наивысшим баллом. Если < 0, будут возвращены все доступные результаты. Любые положительные числа -1
scoreThreshold Устанавливает порог оценки прогноза, который переопределяет тот, который указан в метаданных модели (если таковые имеются). Результаты ниже этого значения отклоняются. Любой плавающий Не установлено
categoryAllowlist Устанавливает необязательный список разрешенных имен категорий. Если поле не пусто, результаты классификации, имя категории которых отсутствует в этом наборе, будут отфильтрованы. Повторяющиеся или неизвестные названия категорий игнорируются. Эта опция является взаимоисключающей с categoryDenylist , и использование обеих приводит к ошибке. Любые строки Не установлено
categoryDenylist Устанавливает необязательный список имен категорий, которые не разрешены. Если значение не пустое, результаты классификации, имя категории которых находится в этом наборе, будут отфильтрованы. Повторяющиеся или неизвестные названия категорий игнорируются. Этот параметр является взаимоисключающим с categoryAllowlist , и использование обоих приводит к ошибке. Любые строки Не установлено

Подготовьте данные

Классификатор текста работает с текстовыми ( String ) данными. Задача выполняет предварительную обработку входных данных, включая токенизацию и предварительную обработку тензоров.

Вся предварительная обработка выполняется внутри функции classify() . Предварительная дополнительная обработка входного текста не требуется.

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

Запустить задачу

Классификатор текста использует функцию TextClassifier.classify() для выполнения выводов. Используйте отдельный поток выполнения для выполнения классификации, чтобы избежать блокировки потока пользовательского интерфейса Android вашим приложением.

Следующий код демонстрирует, как выполнить обработку с помощью модели задачи, используя отдельный поток выполнения.

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

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

Вы можете увидеть пример запуска задачи в примере кода функции classify() класса TextClassifierHelper .

Обработка и отображение результатов

Классификатор текста выводит TextClassifierResult , который содержит список возможных категорий для входного текста. Категории определяются используемой вами моделью, поэтому, если вам нужны другие категории, выберите другую модель или переобучите существующую.

Ниже показан пример выходных данных этой задачи:

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

Этот результат был получен путем применения BERT-классификатора к входному тексту: "an imperfect but overall entertaining mystery" .

Вы можете увидеть пример отображения результатов в примере кода классаResultAdapter и внутреннего класса ViewHolder .