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

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

Классификатор текста версии 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) . Дополнительные сведения см. в разделе «Реализация пользовательской службы классификатора текста» .

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

Чтобы проверить реализацию службы классификатора текста, используйте тесты набора тестов совместимости (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 .

Установите системную службу классификатора текста по умолчанию в наложении конфигурации.

[ конфиг.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 появился API TextClassfier для реализации классификации текста.

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 с открытым исходным кодом (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 (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