テキスト分類の実装

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

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