テキスト分類器の実装

テキスト分類器は、機械学習技術を使用して、デベロッパーによるテキスト分類を支援します。

Android 11 リリースのテキスト分類器

Android 11 では、ExtServices モジュールに、テキスト分類器の更新可能なデフォルト実装が導入されています。Android 11 以上を搭載したデバイスでは、getTextClassifier() メソッドが ExtServices モジュールにあるこのデフォルト実装を返します。TextClassifierService のこの実装はメインライン OTA アップデートにより更新できるため、デバイス メーカーはこちらを使用することをおすすめします。

また、Android 11 では、以前 Android 8.1 で導入されたローカル テキスト分類のデフォルト分類器が削除されました。その結果、getLocalTextClassifier()NO_OP テキスト分類器を返します。ローカル実装の代わりに、getDefaultTextClassifierImplementation() メソッドを使用してください。

独自のテキスト分類アルゴリズムを使用するデバイス メーカーは、config.xml ファイルで config_defaultTextClassifierPackage を指定してカスタム テキスト分類器を実装できます。この構成が指定されていない場合は、デフォルトのシステム実装が使用されます。カスタム実装は、TextClassifierService.getDefaultTextClassifierImplementation(Context) を呼び出すことにより、デフォルト実装のインスタンスを取得できます。詳細については、カスタム テキスト分類器サービスを実装するをご覧ください。

テスト

テキスト分類器サービスの実装を検証するには、platform/cts/tests/tests/textclassifier/ にある互換性テストスイート(CTS)テストを使用します。

Android 10 リリースのテキスト分類器拡張機能

Android 10 では、TextClassifier API に suggestConversationActionsdetectLanguage の 2 つのメソッドが導入されています。suggestConversationActions メソッドは、指定された会話から返信とアクションの候補を生成します。detectLanguage メソッドは、テキストの言語を検出します。

これらのメソッドのモデルファイルは以下のとおりです。これらは external/libtextclassifier/models/ にあります。

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

ファクトリー イメージの最新のモデルファイルを設定してデバイスをリリースする方法は次のとおりです。

  1. 最新のモデルファイルを取得します。

    external/libtextclassifier/models/update.sh
    
  2. ダウンロードしたファイルの名前を変更し、既存のファイルを置き換えます。
  3. 設定を確認します。
    adb shell dumpsys textclassification
    

    このコマンドの出力サンプルを以下に示します。

    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 }
    

Android 9 リリースのテキスト分類器拡張機能

Android 9 では、Android 8.1 で導入されたテキスト分類フレームワークが新しいテキスト分類器サービスによって拡張されています。テキスト分類器サービスは、OEM がテキスト分類システムをサポートするのにおすすめの方法です。テキスト分類器サービスは任意のシステム APK に組み込むことが可能で、必要に応じて更新できます。

Android 9 にはデフォルトのテキスト分類器サービス実装(TextClassifierImpl)が含まれており、カスタム テキスト分類器サービス実装に置き換えない限り、そちらが使用されます。

カスタム テキスト分類器サービスを実装する

以下のセクションでは、独自に開発したカスタム テキスト分類器サービスを実装する方法について説明します。

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

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>

サービスには android.permission.BIND_TEXTCLASSIFIER_SERVICE 権限が必要であり、android.service.textclassifier.TextClassifierService インテント アクションを指定する必要があります。

構成オーバーレイでシステムのデフォルト テキスト分類器サービスを設定する

[config.xml]

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

テキスト分類器サービスをシステム イメージに組み込む

カスタム テキスト分類器サービスは、システム イメージまたは別のシステム APK の一部に組み込まれるスタンドアロン APK としてビルドできます。システムは PackageManager.MATCH_SYSTEM_ONLY を使用してサービスを解決します。

テスト

android.view.textclassifier.cts でテストを実施します。

Android 9 のその他のテキスト分類の変更点

インストールされている言語モジュールを検査するを参照してください。

Android 9 のモデルファイルは、Android 8.x のモデルファイルと互換性がありません。

Android 9 のモデルファイルの命名パターンは、texclassifier.[language-code].model(たとえば textclassifier.en.model)であり、Android 8.x の textclassifier.smartselection.en.model とは異なります。

最新のテキスト分類モデルファイルを取得する

最新のモデルを取得するには、次のスクリプトを実行します。実行すると、ソースツリーの TextClassifier モデルが更新されます。

external/libtextclassifier/native/models/update.sh

Android リリース 8.1 のテキスト分類器

Android 8.1 では、テキスト分類を実装するために TextClassfier API が導入されました。

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

デベロッパーは、次のようにしてカスタム テキスト分類器を設定できます。

tcm.setTextClassifier(customTextClassifier);

ただし、アプリ デベロッパーがテキスト分類器を null に設定すると、getTextClassifier() に対してシステムのデフォルト テキスト分類器が返されます。

android.view.textclassifier.TextClassifierImpl をご覧ください。

TextView と WebView は、スマート選択機能とスマート テキスト共有機能に TextClassifier を使用します。

テキスト分類器の使用

図 1. TextClassifier の使用

TextClassifier ニューラル ネットワーク モデル

Android オープンソース プロジェクト(AOSP)には、テキストを分類するためのニューラル ネットワーク モデルが多数用意されています。各モデルファイルは、それぞれ 1 つの言語用にトレーニングされています。任意の組み合わせのモデルをインストールできます。モデルは以下で定義されます。

external/libtextclassifier/Android.mk

デバイスに言語モデルをプリインストールする

言語モデルのバンドルを指定してデバイスにインストールできます。

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

たとえば、device/google/marlin/device-common.mk に以下の行を挿入します。

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

インストールされている言語モジュールを検査する

adb を使用して、ディレクトリ内のファイルを一覧表示します。

$ 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

モデルの更新

モデルを更新するには、システム イメージのアップデートの一環として新しいモデルを含めるか、システムの API ACTION_UPDATE_SMART_SELECTION インテントを介して更新をトリガーするシステム コンポーネントを設定して動的に更新します。このシステム API インテントをブロードキャストすることで、フレームワークは現在設定されている言語の言語モデルを更新できるようになります。モデル自体にサポートされている言語とバージョン番号が含まれているため、最新の適切なモデルが使用されます。

すべての言語のモデルは後で追加できるので、プリロードする必要はありません。指定された言語のモデルファイルが見つからない場合、テキスト分類器は no-op 値を返します。

互換性テストスイート テスト

関連する Android 互換性テストスイート(CTS)テストは次の場所にあります。

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