Textklassifikator implementieren

Der Textklassifikator verwendet Techniken des maschinellen Lernens, um Entwicklern bei der Klassifizierung von Text zu helfen.

Textklassifikator für Android 11

Mit Android 11 wird eine aktualisierbare Standardimplementierung des Textklassifizierungsdienstes im ExtServices-Modul eingeführt. Auf Geräten mit Android 11 oder höher gibt die Methode getTextClassifier() diese Standardimplementierung im Modul „ExtServices“ zurück. Geräteherstellern wird empfohlen, diese Implementierung von TextClassifierService zu verwenden, da sie über Mainline-OTA-Updates aktualisiert werden kann.

In Android 11 wird auch die Standardimplementierung des lokalen Textklassifikators entfernt, die zuvor in Android 8.1 eingeführt wurde. Daher gibt getLocalTextClassifier() einen NO_OP-Textklassifikator zurück. Statt der lokalen Implementierung sollten Sie die Methode getDefaultTextClassifierImplementation() verwenden.

Gerätehersteller, die ihre eigenen Algorithmen zur Textklassifizierung verwenden möchten, können einen benutzerdefinierten Dienst zur Textklassifizierung implementieren, indem sie config_defaultTextClassifierPackage in der Datei config.xml angeben. Wenn diese Konfiguration nicht angegeben ist, wird die Standardsystemimplementierung verwendet. Benutzerdefinierte Implementierungen können eine Instanz der Standardimplementierung abrufen, indem sie TextClassifierService.getDefaultTextClassifierImplementation(Context) aufrufen. Weitere Informationen finden Sie unter Benutzerdefinierten Textklassifizierungsdienst implementieren.

Testen

Verwenden Sie die CTS-Tests (Compatibility Test Suite) in platform/cts/tests/tests/textclassifier/, um Ihre Implementierung des Textklassifizierungsdienstes zu validieren.

Verbesserungen des Textklassifikators in Android 10

In Android 10 werden zwei Methoden in die TextClassifier API eingeführt: suggestConversationActions und detectLanguage. Die Methode suggestConversationActions generiert Antwort- und Aktionsvorschläge aus einer bestimmten Unterhaltung und die Methode detectLanguage erkennt die Sprache des Texts.

Die Modelldateien für diese Methoden sind unten aufgeführt und befinden sich unter external/libtextclassifier/models/.

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

So stellen Sie ein Gerät mit den neuesten Modelldateien in Ihrem Werksimage bereit:

  1. Die neuesten Modelldateien abrufen

    external/libtextclassifier/models/update.sh
    
  2. Benennen Sie die heruntergeladenen Dateien um, um die vorhandenen Dateien zu ersetzen.
  3. Prüfen Sie die Einrichtung.
    adb shell dumpsys textclassification
    

    Hier ein Beispiel für die Ausgabe dieses Befehls:

    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 }

Verbesserungen des Textklassifikators in Android 9

Unter Android 9 wurde das in Android 8.1 eingeführte Framework für die Textklassifizierung um den neuen Dienst für die Textklassifizierung erweitert. Der Textklassifizierungsdienst ist die empfohlene Methode für OEMs, um Unterstützung für das Textklassifizierungssystem bereitzustellen. Der Dienst zur Textklassifizierung kann Teil einer beliebigen System-APK sein und bei Bedarf aktualisiert werden.

Android 9 enthält eine Standardimplementierung des Textklassifikator-Dienstes ( TextClassifierImpl), die verwendet wird, sofern Sie sie nicht durch eine benutzerdefinierte Implementierung des Textklassifikator-Dienstes ersetzen.

Benutzerdefinierten Dienst für die Textklassifizierung implementieren

In den folgenden Abschnitten wird beschrieben, wie Sie einen benutzerdefinierten Textklassifizierungsdienst implementieren, den Sie entwickeln.

android.service.textclassifier.TextClassifierService erweitern

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

Dienst im Android-Manifest definieren

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

Der Dienst muss die Berechtigung android.permission.BIND_TEXTCLASSIFIER_SERVICE erfordern und die Intent-Aktion android.service.textclassifier.TextClassifierService angeben.

Standarddienst für die Textklassifizierung im Konfigurations-Overlay festlegen

[config.xml]

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

Textklassifizierungsdienst in das System-Image einbauen

Ihr benutzerdefinierter Dienst zur Textklassifizierung kann ein eigenständiges APK sein, das in das System-Image eingebunden ist, oder Teil eines anderen System-APKs. Das System verwendet PackageManager.MATCH_SYSTEM_ONLY, um den Dienst aufzulösen.

Testen

Führen Sie Tests in android.view.textclassifier.cts aus.

Weitere Änderungen bei der Textklassifizierung in Android 9

Weitere Informationen finden Sie unter Installierte Sprachmodule prüfen.

Android 9-Modelldateien sind nicht mit Android 8.x-Modelldateien kompatibel.

Android 9-Modelldateien haben das Namensmuster texclassifier.[language-code].model (z. B. textclassifier.en.model) anstelle von textclassifier.smartselection.en.model in Android 8.x.

Neueste Dateien für das Textklassifizierungsmodell abrufen

Mit dem folgenden Skript können Sie die aktuellsten Modelle abrufen. Es aktualisiert die TextClassifier-Modelle im Quellbaum:

external/libtextclassifier/native/models/update.sh

Textklassifikator für Android 8.1

Mit Android 8.1 wurde die TextClassifier API eingeführt, um die Textklassifizierung zu implementieren.

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

Entwickler können einen benutzerdefinierten Textklassifikator festlegen:

tcm.setTextClassifier(customTextClassifier);

Wenn ein App-Entwickler den Textklassifikator jedoch auf null festlegt, wird für getTextClassifier() ein standardmäßiger Textklassifikator des Systems zurückgegeben.

android.view.textclassifier.TextClassifierImpl ansehen.

TextView und WebView verwenden TextClassifier für die Funktionen zur intelligenten Auswahl und zum intelligenten Teilen von Text.

Verwendung des Textklassifikators

Abbildung 1: Verwendung von TextClassifier

Neuronale Netzwerkmodelle für TextClassifier

Das Open-Source-Projekt für Android (AOSP) bietet eine Reihe von Modellen für neuronale Netze zur Klassifizierung von Text. Jede Modelldatei wird für eine einzelne Sprache trainiert. Sie können eine beliebige Kombination von Modellen installieren. Die Modelle sind in folgenden Dateien definiert:

external/libtextclassifier/Android.mk

Sprachmodelle auf Geräten vorinstallieren

Sie können ein Paket von Sprachmodellen angeben und auf einem Gerät installieren:

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

Wie zum Beispiel in device/google/marlin/device-common.mk.

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

Installierte Sprachmodule prüfen

Verwenden Sie ADB, um die Dateien im Verzeichnis aufzulisten:

$ 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

Modellaktualisierungen

Modelle können entweder durch ein neues Modell aktualisiert werden, das Teil eines Systemimage-Updates ist, oder dynamisch durch eine Systemkomponente, die ein Update über den System-Intent API ACTION_UPDATE_SMART_SELECTION auslöst. Durch das Senden dieses System-API-Intents kann das Framework das Sprachmodell der aktuell eingestellten Sprache aktualisieren. Die Modelle selbst enthalten die unterstützte Sprache und eine Versionsnummer, damit das jeweils aktuelle geeignete Modell verwendet wird.

Sie müssen also nicht für alle Sprachen Modelle vorab laden, da sie später hinzugefügt werden können. Wenn für die angegebene Sprache keine Modelldatei gefunden wird, gibt die Textklassifizierung No-Op-Werte zurück.

Tests der Compatibility Test Suite

Die zugehörigen Android Compatibility Test Suite (CTS)-Tests finden Sie unter:

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