Implementacja klasyfikatora tekstu

Klasyfikator tekstu korzysta z technik uczenia maszynowego, aby pomóc deweloperom w klasyfikowaniu tekstu.

Klasyfikator tekstu w Androidzie 11

Android 11 wprowadza domyślną implementację usługi klasyfikatora tekstu, którą można aktualizować, w module ExtServices. Na urządzeniach z Androidem 11 lub nowszym getTextClassifier() metoda zwraca tę domyślną implementację w module ExtServices. Producenci urządzeń powinni używać tej implementacji TextClassifierService, ponieważ można ją aktualizować za pomocą aktualizacji OTA Mainline.

Android 11 usuwa też lokalny klasyfikator tekstu domyślną implementację, która została wcześniej wprowadzona w Androidzie 8.1. W związku z tym getLocalTextClassifier() zwraca klasyfikator tekstu NO_OP. Zamiast implementacji lokalnej należy użyć metody.getDefaultTextClassifierImplementation()

Producenci urządzeń, którzy chcą używać własnych algorytmów klasyfikacji tekstu, mogą zaimplementować niestandardową usługę klasyfikatora tekstu, określając config_defaultTextClassifierPackage w pliku config.xml. Jeśli ta konfiguracja nie zostanie określona, używana jest domyślna implementacja systemowa. Implementacje niestandardowe mogą uzyskać instancję domyślnej implementacji, wywołując TextClassifierService.getDefaultTextClassifierImplementation(Context). Więcej informacji znajdziesz w artykule Implementowanie niestandardowej usługi klasyfikatora tekstu.

Testowanie

Aby sprawdzić implementację usługi klasyfikatora tekstu, użyj testów Compatibility Test Suite (CTS) w platform/cts/tests/tests/textclassifier/.

Ulepszenia klasyfikatora tekstu w Androidzie 10

Android 10 wprowadza 2 metody do interfejsu TextClassifier API: suggestConversationActions i detectLanguage. Metoda suggestConversationActions generuje sugerowane odpowiedzi i działania na podstawie danej rozmowy, a metoda detectLanguage wykrywa język tekstu.

Pliki modelu dla tych metod są pokazane poniżej i można je znaleźć w external/libtextclassifier/models/.

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

Aby opublikować urządzenie z najnowszymi plikami modelu w obrazie fabrycznym, wykonaj te czynności:

  1. Pobierz najnowsze pliki modelu.

    external/libtextclassifier/models/update.sh
    
  2. Zmień nazwy pobranych plików, aby zastąpić istniejące.
  3. Sprawdź konfigurację.
    adb shell dumpsys textclassification
    

    Oto przykład danych wyjściowych tego polecenia.

    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 }

Ulepszenia klasyfikatora tekstu w Androidzie 9

Android 9 rozszerzył framework klasyfikacji tekstu wprowadzony w Androidzie 8.1 o nową usługę klasyfikatora tekstu. Usługa klasyfikatora tekstu to zalecany sposób, w jaki producenci OEM mogą zapewnić obsługę systemu klasyfikacji tekstu. Usługa klasyfikatora tekstu może być częścią dowolnego pakietu APK systemu i można ją w razie potrzeby aktualizować.

Android 9 zawiera domyślną implementację usługi klasyfikatora tekstu ( TextClassifierImpl), która jest używana, chyba że zastąpisz ją niestandardową implementacją usługi klasyfikatora tekstu.

Implementowanie niestandardowej usługi klasyfikatora tekstu

W sekcjach poniżej opisujemy, jak zaimplementować niestandardową usługę klasyfikatora tekstu.

Rozszerzanie 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) {
        ...
    }
    ...
}

Definiowanie usługi w pliku manifestu Androida

[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>

Pamiętaj, że usługa musi wymagać uprawnienia android.permission.BIND_TEXTCLASSIFIER_SERVICE i musi określać działanie intencji android.service.textclassifier.TextClassifierService.

Ustawianie domyślnej usługi klasyfikatora tekstu w nakładce konfiguracji

[config.xml]

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

Tworzenie usługi klasyfikatora tekstu w obrazie systemu

Niestandardowa usługa klasyfikatora tekstu może być samodzielnym pakietem APK, który jest wbudowany w obraz systemu, lub częścią innego pakietu APK systemu. System używa PackageManager.MATCH_SYSTEM_ONLY do rozpoznawania usługi.

Testowanie

Uruchom testy w android.view.textclassifier.cts.

Inne zmiany w klasyfikacji tekstu w Androidzie 9

Zapoznaj się z artykułem Sprawdzanie zainstalowanych modułów językowych.

Pliki modelu Androida 9 są niezgodne z plikami modelu Androida 8.x.

Pliki modelu Androida 9 mają wzorzec nazewnictwa: texclassifier.[language-code].model (np. textclassifier.en.model) zamiast textclassifier.smartselection.en.model w Androidzie 8.x.

Pobieranie najnowszych plików modelu klasyfikacji tekstu

Aby uzyskać najnowsze modele, możesz uruchomić ten skrypt, który aktualizuje modele TextClassifier w drzewie źródłowym:

external/libtextclassifier/native/models/update.sh

Klasyfikator tekstu w Androidzie 8.1

Android 8.1 wprowadził interfejs TextClassfier API do implementowania klasyfikacji tekstu.

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

Deweloperzy mogą ustawić niestandardowy klasyfikator tekstu:

tcm.setTextClassifier(customTextClassifier);

Jeśli jednak deweloper aplikacji ustawi klasyfikator tekstu na null, metoda getTextClassifier() zwróci domyślny klasyfikator tekstu systemu.

Zobacz android.view.textclassifier.TextClassifierImpl.

TextView i WebView używają TextClassifier do funkcji inteligentnego zaznaczania i inteligentnego udostępniania tekstu.

Korzystanie z klasyfikatora tekstu

Rysunek 1. Użycie TextClassifier

Modele sieci neuronowych TextClassifier

Projekt Android Open Source (AOSP) zawiera kilka modeli sieci neuronowych do klasyfikowania tekstu. Każdy plik modelu jest trenowany w jednym języku. Możesz zainstalować dowolną kombinację modeli. Modele są zdefiniowane w:

external/libtextclassifier/Android.mk

Wstępne instalowanie modeli językowych na urządzeniach

Możesz określić pakiet modeli językowych i zainstalować je na urządzeniu:

# -----------------------
# 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)

Na przykład w device/google/marlin/device-common.mk.

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

Sprawdzanie zainstalowanych modułów językowych

Aby wyświetlić listę plików w katalogu, użyj 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

Aktualizacje modelu

Modele można aktualizować, dołączając nowy model do aktualizacji obrazu systemu lub dynamicznie, za pomocą komponentu systemu, który wywołuje aktualizację za pomocą intencji API ACTION_UPDATE_SMART_SELECTION systemu. Dzięki rozgłaszaniu tej intencji interfejsu API systemu framework może aktualizować model językowy aktualnie ustawionego języka. Same modele zawierają obsługiwany język i numer wersji, dzięki czemu używany jest najnowszy odpowiedni model.

Nie musisz więc wstępnie wczytywać modeli dla wszystkich języków, ponieważ można je dodać później. Jeśli nie zostanie znaleziony plik modelu dla określonego języka, klasyfikacja tekstu zwróci wartości no-op.

Testy Compatibility Test Suite

Powiązane testy Android Compatibility Test Suite (CTS) znajdziesz w:

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