Implementacja klasyfikatora tekstu

Klasyfikator tekstu korzysta z technik uczenia maszynowego, aby pomagać deweloperom klasyfikować tekst.

Klasyfikator tekstu w Androidzie 11

Android 11 wprowadza domyślną implementację usługi klasyfikacji tekstu, którą można aktualizować w  module ExtServices. Na urządzeniach z Androidem 11 lub nowszym metoda getTextClassifier() 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ż domyślną implementację lokalnego klasyfikatora tekstu wprowadzoną wcześniej w  Androidzie 8.1. W związku z tym getLocalTextClassifier() zwraca klasyfikator tekstu NO_OP. Zamiast implementacji lokalnej użyj metody getDefaultTextClassifierImplementation().

Producenci urządzeń, którzy chcą używać własnych algorytmów klasyfikacji tekstu, mogą wdrożyć niestandardową usługę klasyfikacji 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. W przypadku implementacji niestandardowych można uzyskać instancję implementacji domyślnej, wywołując TextClassifierService.getDefaultTextClassifierImplementation(Context). Więcej informacji znajdziesz w artykule Wdrażanie 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 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 modeli dla tych metod są widoczne poniżej i znajdują się w  external/libtextclassifier/models/.

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

Aby udostępnić 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
    

    To przykładowe dane wyjściowe 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ł platformę klasyfikacji tekstu wprowadzoną w Androidzie 8.1 o nową usługę klasyfikatora tekstu. Usługa klasyfikatora tekstu jest zalecanym sposobem zapewniania przez producentów OEM obsługi systemu klasyfikacji tekstu. Usługa klasyfikatora tekstu może być częścią dowolnego pakietu APK systemu i w razie potrzeby można ją 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.

Wdrażanie niestandardowej usługi klasyfikatora tekstu

W sekcjach poniżej znajdziesz informacje o wdrażaniu opracowanej przez siebie niestandardowej usługi klasyfikacji tekstu.

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

Zdefiniuj usługę 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 określać działanie intencji android.service.textclassifier.TextClassifierService.

Ustaw domyślną usługę klasyfikacji tekstu w nakładce konfiguracyjnej

[config.xml]

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

Wbuduj usługę klasyfikatora tekstu w obraz systemu

Usługa niestandardowego klasyfikatora tekstu może być samodzielnym plikiem APK wbudowanym w obraz systemu lub częścią innego systemowego pliku APK. System używa PackageManager.MATCH_SYSTEM_ONLY do rozpoznawania usługi.

Testowanie

Przeprowadzaj testy w android.view.textclassifier.cts.

Inne zmiany w klasyfikacji tekstu w Androidzie 9

Zapoznaj się z sekcją Sprawdzanie zainstalowanych modułów językowych.

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

Pliki modelu Androida 9 mają następujący 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 w wersji 8.1

W Androidzie 8.1 wprowadzono interfejs TextClassifier 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, w przypadku parametru getTextClassifier() zwracany jest domyślny klasyfikator tekstu systemu.

Zobacz android.view.textclassifier.TextClassifierImpl.

Komponenty TextView i WebView używają klasyfikatora tekstu do inteligentnego zaznaczania i inteligentnego udostępniania tekstu.

Korzystanie z klasyfikatora tekstu

Rysunek 1. Korzystanie z klasyfikatora tekstu

Modele sieci neuronowych TextClassifier

Projekt Android Open Source (AOSP) zawiera wiele 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 tych plikach:

external/libtextclassifier/Android.mk

wstępne instalowanie modeli językowych na urządzeniach;

Możesz określić pakiet modeli językowych i zainstalować go 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

Użyj ADB, aby wyświetlić listę plików w katalogu:

$ 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ć, uwzględniając nowy model w ramach 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 tego intencji interfejsu API systemu platforma 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 wstępnie wczytywać modeli dla wszystkich języków, ponieważ można je dodać później. Jeśli dla określonego języka nie zostanie znaleziony plik modelu, klasyfikacja tekstu zwróci wartości no-op.

Testy Compatibility Test Suite

Powiązane testy pakietu CTS (Compatibility Test Suite) na Androida znajdziesz w tych dokumentach:

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