Android 向けテキスト分類ガイド

MediaPipe テキスト分類タスクを使用すると、肯定的な感情や否定的な感情など、定義された一連のカテゴリにテキストを分類できます。カテゴリは使用するモデルと モデルのトレーニング方法によって決まりますここでは、Android アプリでテキスト分類器を使用する方法について説明します。

このタスクの実際の動作は、デモで確認できます。このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。

サンプルコード

テキスト分類器のサンプルコードには、このタスクの簡単な実装が掲載されています。このコードは、このタスクをテストし、独自のテキスト分類アプリの構築を始めるのに役立ちます。GitHub でテキスト分類器のサンプルコードを参照できます。

コードをダウンロードする

次の手順では、git バージョン管理コマンドライン ツールを使用して、サンプルコードのローカルコピーを作成する方法を示します。

サンプルコードをダウンロードするには:

  1. 次のコマンドを使用して、git リポジトリのクローンを作成します。
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. 必要に応じて、スパース チェックアウトを使用するように Git インスタンスを構成します。これにより、テキスト分類サンプルアプリのファイルのみを使用できます。
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/text_classification/android
    

Android Studio でサンプルをセットアップして実行する手順については、Android 向けセットアップ ガイドのサンプルコードのセットアップ手順をご覧ください。

主要コンポーネント

次のファイルには、テキスト分類サンプルアプリの重要なコードが含まれています。

  • TextClassifierHelper.kt - テキスト分類器を初期化し、モデルの選択を処理します。
  • MainActivity.kt - アプリを実装します(TextClassifierHelperResultsAdapter の呼び出しなど)。
  • ResultsAdapter.kt - 結果を処理し、フォーマットします。

セットアップ

このセクションでは、テキスト分類器を使用するための開発環境とコード プロジェクトをセットアップする主な手順について説明します。プラットフォームのバージョン要件など、MediaPipe Tasks を使用するための開発環境の設定に関する一般的な情報については、Android の設定ガイドをご覧ください。

依存関係

テキスト分類器は com.google.mediapipe:tasks-text ライブラリを使用します。この依存関係を Android アプリ開発プロジェクトの build.gradle ファイルに追加します。必要な依存関係は次のコードでインポートできます。

dependencies {
    implementation 'com.google.mediapipe:tasks-text:latest.release'
}

モデル

MediaPipe テキスト分類タスクには、このタスクと互換性のあるトレーニング済みモデルが必要です。テキスト分類器で利用可能なトレーニング済みモデルの詳細については、タスクの概要のモデル セクションをご覧ください。

モデルを選択してダウンロードし、プロジェクトの assets ディレクトリに保存します。

<dev-project-root>/src/main/assets

BaseOptions.Builder.setModelAssetPath() メソッドを使用して、使用するモデルのパスを指定します。コード例については、次のセクションをご覧ください。

タスクを作成する

テキスト分類器の TextClassifier.createFrom...() 関数のいずれかを使用して、推論を実行するタスクを準備します。createFromFile() 関数は、トレーニング済みモデルファイルへの相対パスまたは絶対パスを指定して使用できます。次のコードサンプルは TextClassifier.createFromOptions() 関数の使い方を示しています。使用可能な構成オプションの詳細については、構成オプションをご覧ください。

次のコードは、このタスクをビルドして構成する方法を示しています。

// no directory path required if model file is in src/main/assets:
String currentModel = "text_classifier_model.tflite";

fun initClassifier() {
    val baseOptionsBuilder = BaseOptions.builder()
        .setModelAssetPath(currentModel)
    try {
        val baseOptions = baseOptionsBuilder.build()
        val optionsBuilder = TextClassifier.TextClassifierOptions.builder()
            .setBaseOptions(baseOptions)
        val options = optionsBuilder.build()
        textClassifier = TextClassifier.createFromOptions(context, options)
    } catch (e: IllegalStateException) { // exception handling
    }
}

タスクの作成方法の例については、TextClassifierHelper クラスの initClassifier() 関数のコード例をご覧ください。

構成オプション

このタスクには、Android アプリ用に次の構成オプションがあります。

オプション名 説明 値の範囲 デフォルト値
displayNamesLocale タスクのモデルのメタデータで提供される表示名に使用するラベルの言語を設定します(利用可能な場合)。英語の場合、デフォルトは en です。TensorFlow Lite Metadata Writer API を使用して、カスタムモデルのメタデータにローカライズされたラベルを追加できます。言語 / 地域コード en
maxResults 返されるトップスコアの分類結果の最大数を設定します(省略可)。0 未満の場合、利用可能なすべての結果が返されます。 任意の正の数 -1
scoreThreshold モデル メタデータ(存在する場合)で指定された値をオーバーライドする予測スコアのしきい値を設定します。この値を下回る結果は拒否されます。 任意の浮動小数点数 未設定
categoryAllowlist 許可されるカテゴリ名のオプション リストを設定します。空でない場合、カテゴリ名がこのセットにない分類結果は除外されます。重複するカテゴリ名や不明なカテゴリ名は無視されます。 このオプションは categoryDenylist と相互に排他的であり、両方を使用するとエラーが発生します。 任意の文字列 未設定
categoryDenylist 使用できないカテゴリ名のオプション リストを設定します。空でない場合、カテゴリ名がこのセットに含まれる分類結果は除外されます。重複するカテゴリ名や不明なカテゴリ名は無視されます。このオプションは categoryAllowlist と相互に排他的であり、両方を使用するとエラーになります。 任意の文字列 未設定

データの準備

テキスト分類器はテキスト(String)データを処理します。このタスクは、トークン化やテンソルの前処理などのデータ入力の前処理を処理します。

すべての前処理は classify() 関数内で処理されます。入力テキストを事前に追加で前処理する必要はありません。

String inputText = "The input text to be classified.";

タスクを実行する

テキスト分類器は、TextClassifier.classify() 関数を使用して推論を実行します。アプリで Android ユーザー インターフェース スレッドがブロックされないように、分類の実行に別の実行スレッドを使用します。

次のコードは、別の実行スレッドを使用してタスクモデルで処理を実行する方法を示しています。

    fun classify(text: String) {
        executor = ScheduledThreadPoolExecutor(1)

        executor.execute {
            val results = textClassifier.classify(text)
            listener.onResult(results)
        }
    }

タスクを実行する方法の例については、TextClassifierHelper クラスの classify() 関数のコード例をご覧ください。

結果を処理して表示する

テキスト分類器は、入力テキストで使用可能なカテゴリのリストを含む TextClassifierResult を出力します。カテゴリは使用するモデルによって定義されるため、別のカテゴリが必要な場合は、別のモデルを選択するか、既存のモデルを再トレーニングします。

このタスクからの出力データの例を次に示します。

TextClassificationResult:
  Classification #0 (single classification head):
    ClassificationEntry #0:
      Category #0:
        category name: "positive"
        score: 0.8904
        index: 0
      Category #1:
        category name: "negative"
        score: 0.1096
        index: 1

この結果は、入力テキスト "an imperfect but overall entertaining mystery" に対して BERT 分類器を実行して取得されています。

結果を表示する方法の例については、ResultsAdapter クラスと ViewHolder 内部クラスのコード例をご覧ください。