【機械学習】AutoMLで文章分類

本稿ではGCPサービスの**AutoML Natural Language**を使って文章の分類を行います。

# 経緯
仕事でチャットボットの実装に携わる機会が増え、FAQの分類に使えるのでは？と思ったからです。
**質問（Q）**が分類できれば、それに紐づく**回答（A）**が分かるはずです。

# AutoML Natural Languageとは？
>カスタムの機械学習モデルを構築してデプロイし、ドキュメントの分析、分類、エンティティの識別、態度の評価を行えます。

[公式ドキュメントより](https://cloud.google.com/natural-language/automl/docs?hl=ja)

今回はその中でも、分類モデルを作成する**Text & Document Classification**を利用します。

# 教師データを用意する
今回は飲食店のFAQ想定でデータを用意してみました。
**Single-label-Classification**で学習させるのでDocumentとそのLabelだけ定義します。

| Document | Label |
|---|---|
| お手洗いはどこですか | toilet |
| 会計はクレジットカードでも良いですか | credit |
| タバコは吸えますか | tobacco |
| 予約はできますか | reservation |
| 宴会で利用できますか | party |
| 何時から営業してますか | starttime |
| 何時まで営業してますか | endtime |
| 営業日はいつですか | businessday |
| 最寄駅からのルートを教えてください | root |
| WiFiはありますか | wifi |

[公式ドキュメント](https://cloud.google.com/natural-language/automl/docs/prepare?hl=ja#expandable-1-label)によると**1Label当たり最低10Documentが必要**で、**推奨は1000Document**です。
今回は最低限の10Documentで学習させようと思うので、次のように表現を変えて1Labelに対するDocumentのバリエーションを作ります。

| Document | Label |
|---|---|
| タバコは吸えますか | tobacco |
| タバコを吸いたい | tobacco |
| 喫煙所はありますか | tobacco |
| 喫煙できますか | tobacco |
| 最寄りの喫煙所を教えて | tobacco |
| タバコ | tobacco |
| 喫煙できるか | tobacco |
| 喫煙可能か | tobacco |
| タバコ吸えるか | tobacco |
| 喫煙ルームはありますか | tobacco |

# 教師データをインポートする

**Natural Language products**の**AutoML Text & Document Classification**の**Get started**をクリックする。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/15d9dcc8-d530-4210-6ded-9137db1aaba7.png)

ヘッダーの**NEW DATASET**をクリックして次のダイアログを開く。
**Dataset name:restaurant_faq**
**Location:任意**
**Select your model objective:Single-label-Classification**
で**CREATE DATASET**をクリックする。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/54d945e7-56e8-bb6b-92a1-5799277f3790.png)

今回はローカルのCSVをアップロードするので、**Upload a CSV file from your computer**を選択する。
**SELECT FILES**で**restaurant_faq.csv**で保存しておいたCSVデータを選択する。
最後にアップロード先のGSCバケットを指定して、**IMPORT**をクリックする。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/5d30d62f-db39-58f5-aae0-c884967a59e3.png)

インポートが始まります。同時に、インポート開始メールが送信されます。
**このインポートにはめちゃくちゃ時間がかかります。**
今回の100Document10Labelのデータでさえ10分以上かかりました。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/31cb0209-2f1f-f2ac-00f5-b08fe22d8758.png)

インポートが終わると**ITEMS**タブからデータを確認することができます。
Documentの重複等のデータ不備があればこの画面でワーニングが出るので分かります。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/52929417-450d-9cbe-4aff-b80ec07d39fc.png)

# 学習を開始する

**TRAIN**タブからトレーニング・バリデーション・テストに使うデータ数が確認できます。
Documentの**80%がトレーニング**に使われ、**10%がバリデーション**（ハイパーパラメータの調整）、残りの**10%がテスト**に使われます。
**START TRAINING**ボタンをクリックして学習を開始します。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/a52453d5-abdb-f6fd-327c-2210465cc796.png)

待つこと５時間...無事学習が終わると**EVALUATE**タブからモデルの評価を確認できます。
各種データが少ないからなのか、PrecisionとRecallが共に100%出ています。

※**学習は1時間3ドル**かかります。今回だと15ドルかかった計算になります。GCP特有の無料枠があるかと思い、なくても今回のデータくらいならそんなにかからないだろうと思っていて、[料金](https://cloud.google.com/natural-language/automl/pricing?hl=ja)を調べず試していたら数千円の請求がきてしまいました。Predictは無料枠があるみたいです。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/d3e317a1-2c4a-9acd-c203-a9999fb6cccb.png)

# 予測してみる

**喫煙所ある？** を試して見ます。
完全一致の文章は学習データに含まれてませんが、喫煙所という単語は含まれているため、見事に**tabacco**のスコアが1.00！
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/08948f2a-d85e-0a66-7b7a-6b8346e5e72b.png)


次に全く学習データに含まれていない **ニコチン最高！** という文章を投げてみると、スコアは落ちるもののtabaccoであると言っています。凄い。タバコ=ニコチンという学習もしてくれていそうですね。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115823/62b4322a-2c69-079b-d00b-f75e3e420d80.png)

# 終わりに

FAQの分類に使えそうですね。
長い文章も学習できるので、より複雑なFAQにも対応できそうです。
ただし...お高い。