Как реализовать классификатор текста

Классификатор текста использует методы машинного обучения, чтобы помочь разработчикам классифицировать текст.

Классификатор текста в Android 11

В Android 11 представлен обновляемый сервис классификации текста по умолчанию в модуле ExtServices. На устройствах с Android 11 или более поздней версии метод getTextClassifier() возвращает эту реализацию по умолчанию в модуле ExtServices. Производителям устройств рекомендуется использовать эту реализацию TextClassifierService, поскольку ее можно обновить с помощью беспроводных обновлений Mainline.

В Android 11 также удалена реализация по умолчанию локального классификатора текста, которая была представлена в Android 8.1. В результате функция getLocalTextClassifier() возвращает текстовый классификатор NO_OP. Вместо локальной реализации следует использовать метод getDefaultTextClassifierImplementation().

Производители устройств, которые хотят использовать собственные алгоритмы классификации текста, могут реализовать специальный сервис классификации текста, указав config_defaultTextClassifierPackage в файле config.xml. Если эта конфигурация не указана, используется реализация системы по умолчанию. В пользовательских реализациях можно получить экземпляр реализации по умолчанию, вызвав метод TextClassifierService.getDefaultTextClassifierImplementation(Context). Подробнее о том, как реализовать собственный сервис классификации текста…

Тестирование

Чтобы проверить реализацию сервиса классификации текста, используйте тесты Compatibility Test Suite (CTS) в platform/cts/tests/tests/textclassifier/.

Улучшения классификатора текста в Android 10

В Android 10 в TextClassifier API добавлены два метода: suggestConversationActions и detectLanguage. Метод suggestConversationActions генерирует готовые ответы и действия на основе заданного чата, а метод detectLanguage определяет язык текста.

Файлы моделей для этих методов показаны ниже и находятся в external/libtextclassifier/models/.

  • suggestionConversationActions: actions_suggestions.universal.model
  • detectLanguage: lang_id.model

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

  1. Получите последние файлы модели.

    external/libtextclassifier/models/update.sh
    
  2. Переименуйте скачанные файлы, чтобы заменить существующие.
  3. Проверьте настройки.
    adb shell dumpsys textclassification
    

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

    TextClassifierImpl:
      Annotator model file(s):
        ModelFile { path=/etc/textclassifier/textclassifier.universal.model name=textclassifier.universal.model version=608 locales=und }
        ModelFile { path=/etc/textclassifier/textclassifier.en.model name=textclassifier.en.model version=608 locales=en }
      LangID model file(s):
        ModelFile { path=/etc/textclassifier/lang_id.model name=lang_id.model version=0 locales=und }
      Actions model file(s):
        ModelFile { path=/etc/textclassifier/actions_suggestions.universal.model name=actions_suggestions.universal.model version=0 locales=und }

Улучшения классификатора текста в Android 9

В Android 9 фреймворк text classification, представленный в Android 8.1, был расширен за счет нового сервиса text classifier. Сервис классификации текста – это рекомендуемый способ для OEM-производителей обеспечить поддержку системы классификации текста. Сервис классификации текста может быть частью любого системного APK-файла и при необходимости обновляться.

В Android 9 реализован сервис классификации текста по умолчанию ( TextClassifierImpl), который используется, если вы не замените его на собственный сервис классификации текста.

Как реализовать сервис классификации текста

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

Extend android.service.textclassifier.TextClassifierService

public final class TextClassifierServiceImpl
        extends TextClassifierService {

    // Returns TextClassifierImpl.
    private final TextClassifier tc = getLocalTextClassifier();

    @Override
    public void onSuggestSelection(
            @Nullable TextClassificationSessionId sessionId,
            @NonNull TextSelection.Request request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Callback<TextSelection> callback) {
        CompletableFuture.supplyAsync(
                () -> tc.suggestSelection(request))
                .thenAccept(r -> callback.onSuccess(r));
    }

    @Override
    public void onClassifyText(
            @Nullable TextClassificationSessionId sessionId,
		@NonNull TextClassification.Request request,
		@NonNull CancellationSignal cancellationSignal,
		@NonNull Callback<TextClassification> callback) {
        ...
    }

    @Override
    public void onGenerateLinks(
            @Nullable TextClassificationSessionId sessionId,
            @NonNull TextLinks.Request request,
            @NonNull CancellationSignal cancellationSignal,
            @NonNull Callback<TextLinks> callback) {
        ...
    }
    ...
}

Определите сервис в манифесте Android

[AndroidManifest.xml]

<service android:name=".TextClassifierServiceImpl"
  android:permission="android.permission.BIND_TEXTCLASSIFIER_SERVICE">
    <intent-filter>
      <action android:name=
        "android.service.textclassifier.TextClassifierService"/>
    </intent-filter>
</service>

Обратите внимание, что сервис должен запрашивать разрешение android.permission.BIND_TEXTCLASSIFIER_SERVICE и указывать действие интента android.service.textclassifier.TextClassifierService.

Как задать сервис классификации текста по умолчанию в оверлее конфигурации

[config.xml]

<string name="config_defaultTextClassifierPackage" translatable="false">com.example.textclassifierservice</string>

Встройте сервис классификации текста в образ системы

Ваш сервис классификации текста может быть автономным APK-файлом, встроенным в образ системы, или частью другого системного APK-файла. Система использует PackageManager.MATCH_SYSTEM_ONLY для разрешения сервиса.

Тестирование

Запустить тесты в группе "android.view.textclassifier.cts".

Другие изменения в классификации текста в Android 9

Подробнее о проверке установленных языковых модулей…

Файлы моделей Android 9 несовместимы с файлами моделей Android 8.x.

Файлы моделей Android 9 имеют следующий формат: texclassifier.[language-code].model (например, textclassifier.en.model) вместо textclassifier.smartselection.en.model в Android 8.x.

Как получить последние файлы модели классификации текста

Чтобы получить самые новые модели, можно запустить следующий скрипт, который обновит модели TextClassifier в дереве исходного кода:

external/libtextclassifier/native/models/update.sh

Классификатор текста Android 8.1

В Android 8.1 появился TextClassfier API для классификации текста.

TextClassificationManager tcm =
    context.getSystemService(TextClassificationManager.class);
TextClassifier classifier = tcm.getTextClassifier();
TextSelection selection = classifier.suggestSelection(...);
TextClassification classification = classifier.classifyText(...);

Разработчики могут задать собственный классификатор текста:

tcm.setTextClassifier(customTextClassifier);

Однако если разработчик приложения задает для классификатора текста значение null, для getTextClassifier() возвращается классификатор текста, заданный в системе по умолчанию.

Подробнее: android.view.textclassifier.TextClassifierImpl.

TextView и WebView используют TextClassifier для умного выделения и умного обмена текстом.

Использование классификатора текста

Рисунок 1. Использование TextClassifier

Модели нейросети TextClassifier

В Android Open Source Project (AOSP) есть несколько моделей нейронных сетей для классификации текста. Каждый файл модели обучается для одного языка. Вы можете установить любые сочетания моделей. Модели определены в следующих документах:

external/libtextclassifier/Android.mk

Предварительная установка языковых моделей на устройствах

Вы можете указать набор языковых моделей и установить их на устройство.

# -----------------------
# Smart Selection bundles
# -----------------------

include $(CLEAR_VARS)
LOCAL_MODULE           := textclassifier.smartselection.bundle1
LOCAL_REQUIRED_MODULES := textclassifier.smartselection.en.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.es.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.de.model
LOCAL_REQUIRED_MODULES += textclassifier.smartselection.fr.model
include $(BUILD_STATIC_LIBRARY)

Например, в device/google/marlin/device-common.mk.

# TextClassifier smart selection model files
PRODUCT_PACKAGES += \
    textclassifier.smartselection.bundle1

Проверка установленных языковых модулей

Чтобы получить список файлов в каталоге, используйте ADB:

$ adb shell ls -l /etc/textclassifier
-rw-r--r-- 1 root root ... textclassifier.smartselection.de.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.en.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.es.model
-rw-r--r-- 1 root root ... textclassifier.smartselection.fr.model

Обновления модели

Модели можно обновлять, включив новую модель в обновление образа системы или динамически, используя системный компонент, который запускает обновление через намерение API ACTION_UPDATE_SMART_SELECTION. При трансляции этого намерения системного API фреймворк может обновить языковую модель для текущего языка. Сами модели содержат поддерживаемый язык и номер версии, чтобы использовалась последняя подходящая модель.

Поэтому вам не нужно предварительно загружать модели для всех языков, так как их можно добавить позже. Если для указанного языка не будет найден файл модели, функция классификации текста вернет значения no-op.

Тесты Compatibility Test Suite

Связанные тесты Android Compatibility Test Suite (CTS) можно найти в следующих файлах:

cts/tests/tests/view/src/android/view/textclassifier/cts/TextClassificationManagerTest.java

cts/tests/tests/widget/src/android/widget/cts/TextViewTest.java

  • testSmartSelection
  • testSmartSelection_dragSelection
  • testSmartSelection_resetSelection