Textklassifikator implementieren

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

Textklassifikator in der Android 11-Version

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

Außerdem wird in Android 11 die Standardimplementierung des lokalen Textklassifizierers entfernt, die in Android 8.1 eingeführt wurde. Daher gibt getLocalTextClassifier() einen NO_OP-Textklassifikator zurück. Verwenden Sie anstelle der lokalen Implementierung die Methode getDefaultTextClassifierImplementation().

Gerätehersteller, die eigene Textklassifizierungsalgorithmen verwenden möchten, können einen benutzerdefinierten Textklassifikatordienst implementieren. Dazu geben sie config_defaultTextClassifierPackage in der Datei config.xml an. Wenn diese Konfiguration nicht angegeben ist, wird die Standardsystemimplementierung verwendet. Bei benutzerdefinierten Implementierungen kann eine Instanz der Standardimplementierung durch Aufrufen von TextClassifierService.getDefaultTextClassifierImplementation(Context) abgerufen werden. Weitere Informationen finden Sie unter Benutzerdefinierten Textklassifikatordienst implementieren.

Testen

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

Verbesserungen am Textklassifikator in Android 10

Mit Android 10 werden zwei Methoden für die TextClassifier API eingeführt: suggestConversationActions und detectLanguage. Die Methode suggestConversationActions generiert vorgeschlagene Antworten und Aktionen aus einer bestimmten Unterhaltung und die Methode detectLanguage erkennt die Sprache des Textes.

Die Modelldateien für diese Methoden werden unten gezeigt und sind in external/libtextclassifier/models/ zu finden.

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

So geben Sie ein Gerät mit den neuesten Modelldateien in Ihrem Factory Image frei:

  1. Rufen Sie die neuesten Modelldateien ab.

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

    Dies ist 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 am Textklassifikator in Android 9

Android 9 erweitert das in Android 8.1 eingeführte Textklassifizierungs-Framework um den neuen Textklassifizierungsdienst. Der Textklassifikatordienst wird für OEMs empfohlen, um Unterstützung für das Textklassifizierungssystem bereitzustellen. Der Textklassifikatordienst kann Teil jedes System-APKs 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 Textklassifizierung implementieren

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

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.

Standard-Textklassifizierungsdienst des Systems im Konfigurations-Overlay festlegen

[config.xml]

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

Textklassifizierungsdienst in das System-Image einbinden

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

Testen

Führe Tests in android.view.textclassifier.cts durch.

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 Benennungsmuster: texclassifier.[language-code].model (z. B. textclassifier.en.model) anstelle von textclassifier.smartselection.en.model in Android 8.x.

Neueste Dateien des Textklassifizierungsmodells abrufen

Um die neuesten Modelle abzurufen, können Sie das folgende Skript ausführen, mit dem die TextClassifier-Modelle in der Quellstruktur aktualisiert werden:

external/libtextclassifier/native/models/update.sh

Textklassifikator der Android-Version 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() der standardmäßige Textklassifikator des Systems zurückgegeben.

android.view.textclassifier.TextClassifierImpl ansehen.

TextView und WebView verwenden TextClassifier für intelligente Auswahl und intelligente Textfreigabe-Funktionen.

Verwendung des Textklassifikators

Abbildung 1: Verwendung von TextClassifier

Neuronale Netzmodelle von TextClassifier

Das Android Open Source Project (AOSP) bietet eine Reihe von neuronalen Netzwerkmodellen zur Textklassifizierung. Jede Modelldatei wird für eine einzelne Sprache trainiert. Sie können beliebige Kombinationen von Modellen installieren. Die Modelle sind definiert in:

external/libtextclassifier/Android.mk

Vorinstallierte Sprachmodelle auf Geräten

Sie können ein Bundle mit 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)

Beispiel: 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

Zum Aktualisieren von Modellen kann entweder ein neues Modell als Teil einer Systemimageaktualisierung eingebunden werden oder dynamisch durch eine Systemkomponente, die eine Aktualisierung über den System-Intent API ACTION_UPDATE_SMART_SELECTION auslöst. Durch das Senden dieser System-API-Intent kann das Framework das Sprachmodell der aktuell eingestellten Sprache aktualisieren. Die Modelle selbst enthalten die unterstützte Sprache und eine Versionsnummer, sodass das neueste geeignete Modell verwendet wird.

Sie müssen also nicht alle Modelle für alle Sprachen 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.

Kompatibilitätstest-Suite-Tests

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

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