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

テキスト分類タスクを使用すると、肯定的な感情や否定的な感情など、定義された一連のカテゴリにテキストを分類できます。カテゴリは、使用するモデルとそのモデルのトレーニング方法に基づいて決定されます。ここでは、iOS アプリでテキスト分類器を使用する方法について説明します。この手順で説明されているコードサンプルは、GitHub で入手できます。

このタスクの動作を確認するには、こちらのウェブデモをご覧ください。このタスクの機能、モデル、構成オプションの詳細については、概要をご覧ください。

サンプルコード

MediaPipe Tasks のサンプルコードは、iOS 用のテキスト分類アプリの基本的な実装です。

このアプリは、独自の iOS アプリの出発点として使用できます。または、既存のアプリを変更するときにアプリを参照できます。テキスト分類器のサンプルコードについては、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/ios/
    

サンプルコードのローカル バージョンを作成したら、MediaPipe タスク ライブラリをインストールし、Xcode を使用してプロジェクトを開いてアプリを実行できます。手順については、iOS の設定ガイドをご覧ください。

主要コンポーネント

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

セットアップ

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

依存関係

テキスト分類器は MediaPipeTasksText ライブラリを使用します。このライブラリは、CocoaPods を使用してインストールする必要があります。このライブラリは、Swift アプリと Objective-C アプリの両方と互換性があり、言語固有の追加設定は必要ありません。

macOS に CocoaPods をインストールする手順については、CocoaPods のインストール ガイドをご覧ください。アプリに必要な Pod で Podfile を作成する方法については、CocoaPods の使用をご覧ください。

次のコードを使用して、MediaPipeTasksText Pod を Podfile に追加します。

target 'MyTextClassifierApp' do
  use_frameworks!
  pod 'MediaPipeTasksText'
end

アプリに単体テストのターゲットが含まれている場合は、iOS のセットアップ ガイドPodfile のセットアップの詳細をご確認ください。

モデル

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

モデルを選択してダウンロードし、Xcode を使用してプロジェクト ディレクトリに追加します。Xcode プロジェクトにファイルを追加する方法については、Xcode プロジェクト内のファイルとフォルダの管理をご覧ください。

BaseOptions.modelAssetPath プロパティを使用して、App Bundle 内のモデルへのパスを指定します。コード例については、次のセクションをご覧ください。

タスクを作成する

テキスト分類タスクを作成するには、いずれかのイニシャライザを呼び出します。TextClassifier(options:) イニシャライザは、構成オプションの値を設定します。

カスタマイズされた構成オプションで初期化されるテキスト分類が不要な場合は、TextClassifier(modelPath:) イニシャライザを使用して、デフォルトのオプションでテキスト分類を作成できます。構成オプションの詳細については、構成の概要をご覧ください。

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

Swift

import MediaPipeTasksText

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = TextClassifierOptions()
options.baseOptions.modelAssetPath = modelPath
options.scoreThreshold = 0.6

let textClassifier = try TextClassifier(options: options)

Objective-C

@import MediaPipeTasksText;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPTextClassifierOptions *options = [[MPPTextClassifierOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.scoreThreshold = 0.6;

MPPTextClassifier *textClassifier =
      [[MPPTextClassifier alloc] initWithOptions:options error:nil];

構成オプション

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

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

データの準備

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

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

Swift

let text = "The input text to be classified."

Objective-C

NSString *text = @"The input text to be classified.";

タスクを実行する

テキスト分類を実行するには、classify(text:) メソッドを使用します。テキスト分類器は、入力テキストに該当するカテゴリを返します。

Swift

let result = try textClassifier.classify(text: text)

Objective-C

MPPTextClassifierResult *result = [textClassifier classifyText:text
                                                          error:nil];

: タスクは、テキストに対する推論の実行が完了するまで、現在のスレッドをブロックします。現在のスレッドのブロックを回避するには、iOS の Dispatch フレームワークまたは NSOperation フレームワークを使用して、バックグラウンド スレッドで処理を実行します。

結果を処理して表示する

推論を実行すると、テキスト分類タスクは 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 分類器を実行して取得されています。

サンプルコードの ViewController.swift ファイルは、タスクから返された検出結果を表示する方法を示しています。