【UiPath】日本語テキスト分類モデルを使ってみる（AI Center）

# はじめに
AI Centerでプリセットされている機械学習モデル「日本語テキスト分類（Japanese Text Classification）」を検証してみます。
AI Centerの大まかな使い方は以下の記事で説明しています。

https://qiita.com/shuy/items/8f732357a1b2e8f61e06


# つかうもの
※クラウド環境は2022年10月時点のもの
* Automation Cloud(AI Center) Enterprise版


# モデルの概要
このモデルは、日本語テキストを予め用意したクラス（カテゴリ）に分類するモデルです。
デプロイ前にパイプライン（学習）をしてから使用する必要があります。
GPUに対応しています。
![パッケージ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/51b74e11-17b3-90cb-4b5e-c32a9194ee1d.png)

このモデルは、2018年にGoogleから発表された「BERT」という自然言語処理モデル（NLP）をベースにしています。BERTは高度な言語処理を行えるモデルで、検索やチャットボットなど様々なサービスに使用されています。

今回の検証では、某ショッピングサイトの口コミをインプットとして、商品カテゴリ別に分類してみようと思います。
![パッケージ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/defba70b-78b1-f182-9224-863fc7b62507.png)


# データセット
データセットは、CSVまたはJSONファイルを用意します。公式ドキュメントでは、タブ区切りのファイルでも対応できると書いてありましたが、検証してみたところエラーを解消できなかったので、とりあえず、カンマ区切りのCSVファイルを用意すれば間違いないかと思います。

今回はCSVファイルを使って検証したので、CSVファイルについて解説します。
CSVファイルで必要な列は、「分類対象の日本語テキスト」と「クラス（カテゴリ）」の2つです。それ以外の列は読み込み時に無視されるので、消す必要はありません。
後述するパイプライン実行時の環境変数で列名を指定します。

また、デフォルトの設定でフォルダに含まれているファイルすべてを読込対象とするので、複数ファイルを1つのファイルにマージする必要はありません。

今回の検証では、以下のように学習用と検証用のフォルダを用意し、その中にそれぞれCSVファイルを入れました。使用する列は、「review_body（レビュー本文）」と「product_category（商品カテゴリ）」です。
![データセット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/265e8491-6d6f-6073-1790-449698dab681.png)


# パイプライン
このモデルは、フルパイプラインとGPUをサポートしています。
パイプライン実行時に使用できる環境変数は以下の通りです。

|パラメータ|説明|
|-|-|
|input_column|分類対象の日本語テキストの列名（デフォルトはinput）|
|target_column|クラス（カテゴリ）の列名（デフォルトはtarget）|
|csv_delimiter|CSVファイルを使用する場合の区切り文字（デフォルトはカンマ区切り）|
|csv_name|特定のファイルのみを読込対象とする場合に指定する|
|csv_start_index|特定の行だけを読込対象とする場合に指定する（開始行）|
|csv_end_index|特定の行だけを読込対象とする場合に指定する（終了行）|
|evaluation_metric|パイプライン画面に表示されるスコアを決める評価関数。以下から選択可能（デフォルトはaccuracy）<br>accuracy：正解率<br>precision：適合率<br>recall：再現率<br>matthews correlation：マシューズ相関係数<br>fscore：F値<br>auroc：AUC（ROC曲線の下の領域）|

今回の検証では、以下のように実行しました。
かなり少ないのでスコアは期待できないですが、用意したデータセットは、5クラス（Music, Video DVD, Books, Electronics, Toys）、計100件のデータとします。
![パイプライン1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/57a40c48-8e35-c61d-d3d8-2ce456074f01.png)

実行結果は以下の通りです。
実行時間は15分ほど、スコアは0.5（accuracy）です。
![パイプライン2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/2605281b-30da-acfe-a752-0b2a27bf37f2.png)

他の評価関数も確認しましたが、軒並み低いです。やはり、今回の検証は学習データが1クラス当たり20件と少なかったので、データをもっと用意する必要があるかもしれません。
極端ですが試しに20万件弱のデータで学習させてみたところ、GPUなしで2週間以上かかりました（途中で諦めました）。一般的にBERTベースのモデルは時間がかかるので、大量データを使用する際はGPUを使用することをお勧めします（公式ドキュメントによると5～10倍の処理速度になる模様）。
![パイプライン3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/ded85b65-2114-468d-c52c-d6434653c913.png)


# 実行結果
デプロイしたMLスキルを使ってみます。
以下のように実装しました。
![検証1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/88f68516-e172-d1bb-d950-3401b86fca1b.png)

1回目の検証は正しく分類されました。確信度は0.84なので、まあまあってところでしょうか。
![検証2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/1acb686c-ae37-5b4c-4cb7-b5150600a94f.png)

検証の2回目です。
![検証3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/b564e322-5e73-6fdb-a372-101b4ff23b8f.png)

正しく分類できましたが、確信度は0.65と高くありません。
![検証4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/d1a11e0e-6ec8-b52c-1887-bccfdc3704d8.png)

とりあえず2回検証しましたが、うまく分類できました。ただ、今回の検証のインプットは単文なので、複雑な自然言語だったら、この学習スコアのモデルでは、おそらく上手くいかなかと思います。


# おわりに
モデルをトレーニングさせて、Studioから使うこと自体は難しくはありませんが、精度を上げるためのデータセットをどう用意したらよいか、とても難しい問題です。
機会がありましたら、別のモデルも検証してみます。


# 参考

https://docs.uipath.com/ai-fabric/lang-ja/v0/docs/japanese-text-classification