Cognitive Service for Language の一機能である カスタムテキスト分類 について、クイックスタート で動作確認してみようと思った人のための補足情報です。
面白そうな機能ですが、「データってどうしたらいいの?」と悩みそうな機能です。ということでクイックスタートです。
docs のクイックスタート はスクリーンキャプチャーを載せていて分かりやすいドキュメントですが、日本語 Window ではトレーニングのタイミングでエラーが発生します。
(正しくはサンプルデータセットの ZIP ファイルを展開する時に日本語 Windows でファイル名が文字化けすることが原因です。カスタムテキスト分類のトレーニングの問題ではありません。また英語 Windows では問題ないことを確認しています)

サンプルデータセットのファイル名に起因するエラーです。
以前はメッセージが今ひとつ不親切で原因が分かりづらかったんですが、今はちゃんとメッセージを出してくれるようになりました。おかげで回避するのは難しくありません。
本稿ではクイックスタートの手順にエラー回避方法を加えて、Language Studio でのカスタムテキスト分類の操作を見てみます。
まずは機能や操作感を確認したい、モデルの品質がどの程度かあたりを付けたいという方は以下を参考にカスタムテキスト分類を試してみてください。
長い記事ですが、分けて投稿するような内容でもないので、全体をまとめて投稿します。
最後までお付き合いください。そして、ぜひカスタムテキスト分類サービスを体験してみてください。
■ 手順の大まかな流れ
カスタムテキスト分類は “カスタム” なサービスなので独自のプロジェクトを作り、データセットをアップロードしてという手順が必要です。
大まかな流れとしては以下の感じ。
- テキスト分析リソースを作成
- データセットをアップロード
- カスタムテキスト分類 プロジェクトを作成
- トレーニングジョブを開始
- モデルのパフォーマンスを確認
- モデルをデプロイ
- デプロイのテスト
■ テキスト分類リソースを作成
Azure ポータルなり CLI なりで “テキスト分析” リソースを作成します。

カスタムテキスト分類プロジェクトを作成するには “追加機能の選択” 画面で [カスタムテキスト分類とカスタム固有表現認識] オプションを選択します。

リソース作成時の注意点は リージョンの選択 です。
これを書いている時点では残念ながら東日本、西日本では提供されていません。
最新の提供リージョンは こちらのページ で確認できます。
(個人的には定番どころの westus2、他には westus3 とか eastus 1/2/3 あたりがお気に入り)
■ データセットをアップロード
Azure ストレージに適当なコンテナーを作ってデータセットをアップロードします。
クイックアクセスで使用しているサンプルデータセットは こちら からダウンロードできます。
今回はそれを使う前提です。
(そもそもこの記事を書こうと思ったきっかけが、このデータセットでエラーが発生するからでした)
ダウンロードした ZIP ファイルを展開するとこんな風になっています。

modelLabels.json | カスタムテキスト分類データファイル データセットのどのテキストファイルがラベルに分類されるかを記述する JSON ファイルです。フォーマットフォーマットは こちらのページ にあります。 |
*.txt | データファイル このデータセットは映画のサマリーです。 クイックアクセスでは、サマリーからその映画がどのジャンルの映画であるかを推論するというものです。 |
readme.md | 文字通りの readme サンプルデータとして間違えてアップロードしないように。 |
Test フォルダー | デプロイのテストで使用できるテキストファイル 訓練データには含まれない映画サマリーです。 |
なお、日本語 Windows でこの後エラーが発生する理由は、ZIP ファイルを展開した時に一部のファイル名が文字化けしてしまうことが原因です。英語 Windows では問題ありません。
ZIP を展開した中から、*.txt ファイルと modelLabels.json ファイルを Azure ストレージのコンテナー (Blob) にアップロードします。

■ カスタムテキスト分類プロジェクトを作成
ここからは Language Studio での操作です。
[新規作成] – [カスタムテキスト分類] でプロジェクトを作成します。

ウィザードが始まります。
まず、データセットをアップロードしたストレージを選択します。
続いて、プロジェクトタイプを選択します。
今回のデータセットは 複数ラベル分類 (例えば、ある映画は “Drama” にも “Mistery” にも分類できる) を選択します。

今回のデータセットでは “English” または “English (US)” を選択します。
データセットに複数言語が含まれる場合は [はい、多言語データセットを有効にします] をチェックします。
今回のデータセットは英語のみなのでチェックしません。

さらに “カスタムテキストデータ分類” を定義した JSON ファイルを選択します。
今回はアップロードしたファイルの中に “movieLabels” があるので、これを選択します。(ここでは拡張子は表示されません)

あとは [次へ] でプロジェクト作成の確認画面に遷移して、[プロジェクトの作成] をします。
プロジェクト作成、データセットのインポートに成功すると次のような画面になります。

■ トレーニングジョブを開始(※手順通りならばここでエラー発生)
プロジェクトができたので早速トレーニングジョブを開始します。


数分待つとトレーニングが完了・・・すると思いきや、私の環境ではエラーが発生します。


ファイル名(の文字)に問題がありそうです。
■ サンプルデータと modelLabels.json の変更
トレーニングでエラーが発生しました。
ファイル名に問題がありそうです。
対応方法としては二つ考えられます。
- 問題のファイルを削除して、modelLabels.json から該当するファイルの要素を削除する
- modelLabels.json の内容に合わせて問題のファイル名を変更する
他のデータセットでも同じような問題が発生する可能性はあり得ます。
問題のファイルは今回は 3個あります。以下は問題のファイルを削除する方法です。

続いて modelLabels.json ファイルを編集します。modelLabels.json で該当するファイルの要素を削除します。

または問題の 3ファイルについて、modelLabels.json を見ながらファイル名を変更します。
(手順としてはこちらのほうが簡単ですかね)
■ (改めて) サンプルデータのアップロード、プロジェクト作成、トレーニングジョブを開始
ローカル PC で上記の変更を行ったら、Azure ストレージ上の失敗したコンテナーを削除して新しいコンテナーを作ります。
その後で更新したデータセットと modelLabels.json とをアップロードします。
あとは Language Studio で改めてプロジェクト作成してトレーニングジョブを開始します。
この手順については上のものと同じなのでここでは省略します。
■モデルのパフォーマンスを確認
データセットに問題がなければ、数分程度待つとトレーニングが完了します。

[モデルのパフォーマンス] を開きます。

テキスト分類はなかなか難しい問題なので、70-80% の精度が出ていればひとまず OK でしょうか。
もちろんもっと高い精度が欲しい場合は、データセットを増やす対応が必要でしょう。
今回はここまでとします。
■ モデルをデプロイ
カスタムテキスト分類ではテストをするためには先にデプロイする必要があるようです。
デプロイしましょう。
手順は簡単です。
[モデルのデプロイ] – [デプロイの追加] して、デプロイ名の入力・選択、デプロイ対象のモデルの選択をします。

デプロイはあっという間に終わるはずです。
■ デプロイのテスト
デプロイできたのでモデルのテストをします。
ダウンロードしたサンプルデータの中に “Test” フォルダーがあります。

[デプロイのテスト中] を開いて、テストする任意のファイルをドロップします。
[テストを実行します] をクリックすると結果が表示されます。


推論結果が期待通りにならないこともありますね。
実際の利用の際にはこの辺りをどう評価するか悩ましいかもしれません。
以上で、Cognitive Service for Language のカスタムテキスト分類の一連の操作を見てみました。
クイックスタートで使っているサンプルデータセットで発生するエラーについても確認しました。
カスタムテキスト分類は非常に難しい問題なので、データセットの集め方、品質の確認の仕方など、事前に確認しておきたい内容が多いはずです。
早めのタイミングでクイックスタートを使って、操作と品質の見方を理解しておくことをお勧めします。