Zaimplementuj klasyfikator tekstu

Klasyfikator tekstu wykorzystuje techniki uczenia maszynowego, aby pomóc programistom klasyfikować tekst.

Klasyfikator tekstu wersji Androida 11

W Androidzie 11 wprowadzono aktualizowaną domyślną implementację usługi klasyfikatora tekstu w module ExtServices . Na urządzeniach z systemem Android 11 lub nowszym metoda getTextClassifier() zwraca tę domyślną implementację w module ExtServices. Producentom urządzeń zaleca się korzystanie z tej implementacji TextClassifierService , ponieważ można ją aktualizować za pośrednictwem aktualizacji Mainline OTA.

Android 11 usuwa także domyślną implementację lokalnego klasyfikatora tekstu wprowadzoną wcześniej w Androidzie 8.1 . W rezultacie 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 klasyfikowania 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 systemu. Implementacje niestandardowe mogą uzyskać instancję implementacji domyślnej, wywołując TextClassifierService.getDefaultTextClassifierImplementation(Context) . Więcej informacji można znaleźć w sekcji Implementowanie niestandardowej usługi klasyfikatora tekstu .

Testowanie

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

Ulepszenia klasyfikatora tekstu w wersji Androida 10

W systemie Android 10 do interfejsu API TextClassifier wprowadzono dwie metody: suggestConversationActions i detectLanguage . Metoda suggestConversationActions generuje sugerowane odpowiedzi i akcje z danej konwersacji, a metoda detectLanguage wykrywa język tekstu.

Pliki modeli tych metod pokazano poniżej i można je znaleźć w external/libtextclassifier/models/ .

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

Aby wypuścić urządzenie z najnowszymi plikami modelu w obrazie fabrycznym, wykonaj następujące czynności:

  1. Pobierz najnowsze pliki modeli.

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

    To jest przykładowy wynik 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 wersji Androida 9

Android 9 rozszerzył strukturę klasyfikacji tekstu wprowadzoną w Androidzie 8.1 o nową usługę klasyfikatora tekstu. Usługa klasyfikatora tekstu jest zalecaną metodą zapewniania przez producentów OEM obsługi systemu klasyfikacji tekstu. Usługa klasyfikatora tekstu może być częścią dowolnego systemu APK i może być aktualizowana w razie potrzeby.

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

Zaimplementuj niestandardową usługę klasyfikatora tekstu

W poniższych sekcjach opisano sposób implementowania opracowanej przez Ciebie niestandardowej usługi klasyfikatora tekstu.

Rozszerz usługę 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 manifeście systemu 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>

Należy pamiętać, że usługa musi wymagać uprawnienia android.permission.BIND_TEXTCLASSIFIER_SERVICE i musi określać akcję intencji android.service.textclassifier.TextClassifierService .

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

[ konfiguracja.xml ]

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

Wbuduj usługę klasyfikatora tekstu w obraz systemu

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

Testowanie

Uruchom testy w android.view.textclassifier.cts .

Inne zmiany w klasyfikacji tekstu w systemie Android 9

Patrz Sprawdzanie zainstalowanych modułów językowych .

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

Pliki modeli systemu Android 9 mają wzór nazewnictwa: texclassifier.[language-code].model (na przykład textclassifier.en.model ) zamiast textclassifier.smartselection.en.model w systemie Android 8.x.

Uzyskaj najnowsze pliki modelu klasyfikacji tekstu

Aby uzyskać najbardziej aktualne modele, można uruchomić następujący skrypt, który aktualizuje modele TextClassifier w drzewie źródłowym:

external/libtextclassifier/native/models/update.sh

Klasyfikator tekstu w wersji Androida 8.1

W systemie Android 8.1 wprowadzono interfejs API TextClassfier w celu zaimplementowania 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 twórca aplikacji ustawi klasyfikator tekstu na null , dla metody getTextClassifier() zwracany jest domyślny systemowy klasyfikator tekstu.

Zobacz android.view.textclassifier.TextClassifierImpl .

TextView i WebView wykorzystują TextClassifier do inteligentnego zaznaczania i inteligentnych funkcji udostępniania tekstu.

Zastosowanie klasyfikatora tekstu

Rysunek 1. Użycie TextClassifier

Modele sieci neuronowych TextClassifier

Projekt Android Open Source Project (AOSP) zawiera szereg modeli sieci neuronowych do klasyfikacji tekstu. Każdy plik modelu jest szkolony dla jednego języka. Można zainstalować dowolną kombinację modeli. Modele są zdefiniowane w:

external/libtextclassifier/Android.mk

Preinstaluj 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 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, 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 modeli

Modele można aktualizować albo poprzez dodanie nowego modelu w ramach aktualizacji obrazu systemu, albo dynamicznie poprzez dodanie komponentu systemu, który wyzwala aktualizację poprzez intencję systemowego API ACTION_UPDATE_SMART_SELECTION . Rozgłaszając intencję API systemu, framework jest w stanie zaktualizować model językowy aktualnie ustawionego języka. Same modele zawierają obsługiwany język i numer wersji, dlatego używany jest najnowszy odpowiedni model.

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

Testy zestawu testów zgodności

Powiązane testy zestawu testów zgodności systemu Android (CTS) można znaleźć 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