Wdróż klasyfikator tekstu

Klasyfikator tekstu korzysta z technik uczenia maszynowego, aby pomagać programistom w klasyfikowaniu tekstu.

Klasyfikator tekstu w wersji na Androida 11

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

Android 11 usuwa też domyślną implementację klasyfikatora tekstu lokalnego wprowadzoną wcześniej w Androidzie 8.1. W związku z tym funkcja getLocalTextClassifier() zwraca klasyfikator tekstu NO_OP. Zamiast implementacji lokalnej użyj metody getDefaultTextClassifierImplementation().

Producenci urządzeń, którzy zechcą użyć własnych algorytmów klasyfikacji tekstu, mogą wdrożyć usługę klasyfikatora niestandardowego tekstu, określając właściwość config_defaultTextClassifierPackage w pliku config.xml. Jeśli ta konfiguracja nie zostanie określona, zostanie użyta domyślna implementacja systemu. Implementacje niestandardowe mogą uzyskać instancję domyślnej implementacji, wywołując funkcję TextClassifierService.getDefaultTextClassifierImplementation(Context). Więcej informacji znajdziesz w artykule o wdrażaniu usługi klasyfikatora niestandardowego tekstu.

Testowanie

Aby sprawdzić poprawność implementacji usługi klasyfikatora tekstu, użyj testów z pakietu CTS (Compatibility Test Suite) 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.

Poniżej znajdziesz pliki modeli służące do tych metod. Znajdziesz je w folderze external/libtextclassifier/models/.

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

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

  1. Pobierz najnowsze pliki modeli.

    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ł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 klasyfikatorów tekstu w Androidzie 9

Android 9 rozszerzył platformę klasyfikacji tekstu wprowadzoną w Androidzie 8.1 o nową usługę klasyfikacji tekstu. Usługa klasyfikatorów tekstu jest zalecanym sposobem dla OEM do zapewniania pomocy w zakresie systemu klasyfikacji tekstu. Usługa klasyfikatora tekstu może być częścią dowolnego pakietu APK systemu i w razie potrzeby może zostać zaktualizowana.

Android 9 zawiera implementację domyślnej usługi klasyfikatora tekstu ( TextClassifierImpl), która jest używana, o ile nie zastąpisz jej implementacją niestandardowego klasyfikatora tekstu.

Wdrażanie usługi klasyfikatora niestandardowego tekstu

W następnych sekcjach znajdziesz informacje o wdrażaniu opracowanego przez siebie niestandardowego usługi klasyfikatora tekstu.

Rozszerzanie obiektu 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 określić działanie intencji android.service.textclassifier.TextClassifierService.

Ustaw domyślną usługę klasyfikatora tekstu systemu w nakładce konfiguracji

[config.xml]

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

Umieszczenie usługi klasyfikatora tekstu w obrazie systemu

Niestandardowa usługa klasyfikatora tekstu może być samodzielnym plikiem APK, który jest skompilowany w ramach obrazu systemu lub jako część innego pliku APK systemu. System używa PackageManager.MATCH_SYSTEM_ONLY do rozwiązywania problemów z usługą.

Testowanie

Uruchom testy za android.view.textclassifier.cts.

Inne zmiany w klasyfikacji tekstu w Androidzie 9

Zobacz sprawdzanie zainstalowanych modułów językowych.

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

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

Uzyskiwanie najnowszych plików modeli 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

W Androidzie 8.1 wprowadzono 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(...);

Programiści mogą ustawić niestandardowy klasyfikator tekstu:

tcm.setTextClassifier(customTextClassifier);

Jeśli jednak deweloper aplikacji ustawi klasyfikator tekstu na null, dla getTextClassifier() zwrócony zostanie domyślny klasyfikator tekstu systemowy.

Zobacz android.view.textclassifier.TextClassifierImpl.

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

Korzystanie z klasyfikatora tekstu

Rysunek 1. Wykorzystanie TextClassifier

Modele sieci neuronowej TextClassifier

Projekt Android Open Source (AOSP) zawiera wiele modeli sieci neuronowych do klasyfikowania tekstu. Każdy plik modelu jest trenowany pod kątem jednego języka. Możesz zainstalować dowolną kombinację modeli. Modele są zdefiniowane w następujących sekcjach:

external/libtextclassifier/Android.mk

Wstępnie instaluj modele językowe 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 tym języku: device/google/marlin/device-common.mk.

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

Sprawdź zainstalowane moduły językowe

Użyj ADB, by 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ć, dołączając nowy model w ramach aktualizacji obrazu lub dynamicznie, gdy komponent systemu uruchamia aktualizację za pomocą intencji API ACTION_UPDATE_SMART_SELECTION. Dzięki rozgłaszaniu tej intencji systemowej interfejsu API platforma może aktualizować model językowy obecnie ustawionego języka. 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 podanego języka, klasyfikacja tekstu zwróci wartości no-op.

Testy Compatibility Test Suite

Powiązane testy Compatibility Test Suite (CTS) dla Androida można znaleźć w tych miejscach:

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