Implementieren Sie einen Textklassifikator

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

Textklassifizierer für Android 11-Release

Android 11 führt eine aktualisierbare Standardimplementierung des Textklassifizierungsdienstes im ExtServices-Modul ein. 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.

Android 11 entfernt außerdem die Standardimplementierung des lokalen Textklassifikators, die zuvor in Android 8.1 eingeführt wurde. Als Ergebnis gibt getLocalTextClassifier() einen NO_OP Textklassifikator zurück. Anstelle der lokalen Implementierung sollten Sie die Methode getDefaultTextClassifierImplementation() verwenden.

Gerätehersteller, die möglicherweise ihre eigenen Textklassifizierungsalgorithmen verwenden möchten, können einen benutzerdefinierten Textklassifizierungsdienst 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 Implementieren eines benutzerdefinierten Textklassifizierungsdienstes .

Testen

Um Ihre Implementierung des Textklassifizierungsdienstes zu validieren, verwenden Sie die Tests der Compatibility Test Suite (CTS) in platform/cts/tests/tests/textclassifier/ .

Verbesserungen des Textklassifikators der Android 10-Version

Android 10 führt zwei Methoden in die TextClassifier-API ein: suggestConversationActions und detectLanguage . Die Methode suggestConversationActions generiert vorgeschlagene Antworten und Aktionen aus einer bestimmten Konversation und die Methode detectLanguage erkennt die Sprache des Textes.

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

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

Gehen Sie wie folgt vor, um ein Gerät mit den neuesten Modelldateien in Ihrem Werksimage freizugeben:

  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 der 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 Textklassifizierers für Android 9

Android 9 erweiterte das in Android 8.1 eingeführte Textklassifizierungs-Framework um den neuen Textklassifizierungsdienst. Der Textklassifizierungsdienst ist die empfohlene Methode für OEMs, um Unterstützung für Textklassifizierungssysteme bereitzustellen. Der Textklassifizierungsdienst kann Teil jeder System-APK sein und bei Bedarf aktualisiert werden.

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

Implementieren Sie einen benutzerdefinierten Textklassifizierungsdienst

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

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

Definieren Sie den Dienst im Android-Manifest

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

Beachten Sie, dass der Dienst die Berechtigung android.permission.BIND_TEXTCLASSIFIER_SERVICE erfordern und die Absichtsaktion android.service.textclassifier.TextClassifierService angeben muss.

Legen Sie im Konfigurations-Overlay einen Systemstandard-Textklassifizierungsdienst fest

[ config.xml ]

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

Bauen Sie den Textklassifizierungsdienst in das Systembild ein

Ihr benutzerdefinierter Textklassifizierungsdienst kann ein eigenständiges APK sein, das in das System-Image integriert ist, oder ein Teil eines anderen System-APK. 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 Überprüfen installierter Sprachmodule .

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.

Besorgen Sie sich die neuesten Textklassifizierungsmodelldateien

Um die aktuellsten Modelle zu erhalten, kann das folgende Skript ausgeführt werden, das die TextClassifier-Modelle im Quellbaum aktualisiert:

external/libtextclassifier/native/models/update.sh

Textklassifikator für Android Version 8.1

Mit Android 8.1 wurde die TextClassfier-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 Textklassifizierer jedoch auf null setzt, wird für getTextClassifier() ein Systemstandardtextklassifizierer zurückgegeben.

Siehe android.view.textclassifier.TextClassifierImpl .

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

Verwendung von Textklassifikatoren

Abbildung 1. Verwendung von TextClassifier

TextClassifier-Modelle für neuronale Netze

Das Android Open Source Project (AOSP) bietet eine Reihe neuronaler Netzwerkmodelle zur Klassifizierung von Text. Jede Modelldatei wird für eine einzelne Sprache trainiert. Sie können jede beliebige Kombination von Modellen installieren. Die Modelle sind definiert in:

external/libtextclassifier/Android.mk

Sprachmodelle auf Geräten vorinstallieren

Sie können ein Bündel von Sprachmodellen angeben und diese 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)

Zum Beispiel in device/google/marlin/device-common.mk .

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

Überprüfen Sie die installierten Sprachmodule

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 aktualisiert werden, indem ein neues Modell als Teil einer System-Image-Aktualisierung eingebunden wird, oder dynamisch, indem eine Systemkomponente vorhanden ist, die eine Aktualisierung über die System API ACTION_UPDATE_SMART_SELECTION auslöst. Durch die Übertragung dieser System-API-Absicht ist das Framework in der Lage, das Sprachmodell der aktuell eingestellten Sprache zu aktualisieren. Die Modelle selbst enthalten die unterstützte Sprache und eine Versionsnummer, sodass das neueste geeignete Modell verwendet wird.

Sie müssen also nicht für alle Sprachen Modelle vorab laden, da diese 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 Tests der Android Compatibility Test Suite (CTS) finden Sie in:

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