Реализация текстового классификатора

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

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

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

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 в API TextClassifier представлены два метода: 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 расширил структуру классификации текста, представленную в Android 8.1 , с новой службой классификации текста. Служба классификатора текста — это рекомендуемый OEM-производителям способ обеспечения поддержки системы классификации текста. Служба классификатора текста может быть частью любого системного APK и обновляться при необходимости.

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

Реализация пользовательского сервиса классификатора текста

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

Расширить 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, платформа может обновить языковую модель текущего установленного языка. Сами модели содержат поддерживаемый язык и номер версии, поэтому используется самая последняя подходящая модель.

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

Тесты набора тестов совместимости

Соответствующие тесты 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