Android 向けテキスト埋め込みガイド

MediaPipe Text Embedder タスクを使用すると、テキストデータの数値表現を作成して、セマンティックな意味をキャプチャできます。ここでは、Android アプリで Text Embedder を使用する方法について説明します。

このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。

サンプルコード

MediaPipe Tasks のサンプルコードは、Android 用 Text Embedder アプリの単純な実装です。このサンプルは、2 つのテキスト間の意味的類似性を評価するもので、物理的な Android デバイスまたは Android Emulator が必要です。

このアプリは、独自の Android アプリの出発点として使用できます。または、既存のアプリを変更するときにアプリを参照できます。Text Embedder サンプルコードは、GitHub でホストされています。

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

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

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

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

サンプルコードのローカル バージョンを作成したら、Android Studio にプロジェクトをインポートしてアプリを実行できます。手順については、Android の設定ガイドをご覧ください。

主要コンポーネント

次のファイルには、このテキスト エンベダー サンプル アプリケーションの重要なコードが含まれています。

  • TextEmbedderHelper.kt: テキスト エンベダーを初期化し、モデルを処理して選択を委任します。
  • MainActivity.kt: アプリを実装し、ユーザー インターフェース コンポーネントを組み立てます。

セットアップ

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

依存関係

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

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

モデル

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

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

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

ModelAssetPath パラメータ内にモデルのパスを指定します。このサンプルコードでは、TextEmbedderHelper.kt ファイルの setupTextEmbedder() 関数でモデルが定義されています。

BaseOptions.Builder.setModelAssetPath() 関数を使用して、モデルで使用するパスを指定します。このメソッドは、次のセクションのコードサンプルで参照しています。

タスクを作成する

タスクを作成するには、createFrom...() 関数のいずれかを使用します。createFromOptions() 関数は、埋め込みオプションを設定する構成オプションを受け入れます。createFromFile() ファクトリ関数を使用してタスクを初期化することもできます。createFromFile() 関数には、トレーニング済みモデルファイルへの相対パスまたは絶対パスを指定できます。構成オプションの詳細については、構成オプションをご覧ください。

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

val baseOptions = baseOptionsBuilder.build()
val optionsBuilder =
    TextEmbedderOptions.builder().setBaseOptions(baseOptions)
val options = optionsBuilder.build()
textEmbedder = TextEmbedder.createFromOptions(context, options)

サンプルコードの実装では、TextEmbedderHelper.kt ファイルの setupTextEmbedder() 関数でテキスト埋め込みオプションを設定しています。

構成オプション

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

オプション名 説明 値の範囲 デフォルト値
l2_normalize 返された特徴ベクトルを L2 ノルムで正規化するかどうか。このオプションは、モデルにネイティブの L2_NORMALIZATION TFLite Op がまだ含まれていない場合にのみ使用してください。ほとんどの場合、これはすでに当てはまるため、L2 正規化は TFLite 推論によって行われるため、このオプションは必要ありません。 Boolean False
quantize 返されたエンベディングを、スカラー量子化によってバイトに量子化するかどうかを指定します。エンベディングは暗黙的に単位ノルムであると想定されるため、どのディメンションも [-1.0, 1.0] の値を持つことが保証されます。そうでない場合は、l2_normalize オプションを使用します。 Boolean False

データの準備

Text Embedder は、テキスト(String)データを処理します。このタスクは、トークン化やテンソルの前処理などのデータ入力の前処理を処理します。すべての前処理は embed() 関数内で処理されます。入力テキストを事前に追加で前処理する必要はありません。

val inputText = "The input text to be embedded."

タスクを実行する

Text Embedder は、embed 関数を使用して推論をトリガーします。テキスト エンベディングの場合、これは入力テキストのエンベディング ベクトルを返すことを意味します。

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

textEmbedder?.let {
    val firstEmbed =
        it.embed(firstText).embeddingResult().embeddings().first()
    val secondEmbed =
        it.embed(secondText).embeddingResult().embeddings().first()
    ...
}

このサンプルコードでは、TextEmbedderHelper.kt ファイルで embed 関数が呼び出されます。

結果を処理して表示する

推論を実行すると、Text Embedder タスクは、入力テキストのエンベディング(浮動小数点またはスカラー量子化)のリストを含む TextEmbedderResult オブジェクトを返します。

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

TextEmbedderResult:
  Embedding #0 (sole embedding head):
    float_embedding: {0.2345f, 0.1234f, ..., 0.6789f}
    head_index: 0

TextEmbedder.cosineSimilarity 関数を使用して、2 つのエンベディングの意味的類似性を比較できます。例として、次のコードをご覧ください。

val similarity = TextEmbedder.cosineSimilarity(firstEmbed, secondEmbed)

このサンプルコードでは、TextEmbedderHelper.kt ファイルで TextEmbedder.cosineSimilarity() 関数が呼び出されます。