本稿ではGCPサービスのAutoML Natural Languageを使って文章の分類を行います。
経緯
仕事でチャットボットの実装に携わる機会が増え、FAQの分類に使えるのでは?と思ったからです。
**質問(Q)が分類できれば、それに紐づく回答(A)**が分かるはずです。
AutoML Natural Languageとは?
カスタムの機械学習モデルを構築してデプロイし、ドキュメントの分析、分類、エンティティの識別、態度の評価を行えます。
今回はその中でも、分類モデルを作成するText & Document Classificationを利用します。
教師データを用意する
今回は飲食店のFAQ想定でデータを用意してみました。
Single-label-Classificationで学習させるのでDocumentとそのLabelだけ定義します。
Document | Label |
---|---|
お手洗いはどこですか | toilet |
会計はクレジットカードでも良いですか | credit |
タバコは吸えますか | tobacco |
予約はできますか | reservation |
宴会で利用できますか | party |
何時から営業してますか | starttime |
何時まで営業してますか | endtime |
営業日はいつですか | businessday |
最寄駅からのルートを教えてください | root |
WiFiはありますか | wifi |
公式ドキュメントによると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をクリックする。
ヘッダーのNEW DATASETをクリックして次のダイアログを開く。
Dataset name:restaurant_faq
Location:任意
Select your model objective:Single-label-Classification
でCREATE DATASETをクリックする。
今回はローカルのCSVをアップロードするので、Upload a CSV file from your computerを選択する。
SELECT FILESでrestaurant_faq.csvで保存しておいたCSVデータを選択する。
最後にアップロード先のGSCバケットを指定して、IMPORTをクリックする。
インポートが始まります。同時に、インポート開始メールが送信されます。
このインポートにはめちゃくちゃ時間がかかります。
今回の100Document10Labelのデータでさえ10分以上かかりました。
インポートが終わるとITEMSタブからデータを確認することができます。
Documentの重複等のデータ不備があればこの画面でワーニングが出るので分かります。
学習を開始する
TRAINタブからトレーニング・バリデーション・テストに使うデータ数が確認できます。
Documentの80%がトレーニングに使われ、10%がバリデーション(ハイパーパラメータの調整)、残りの10%がテストに使われます。
START TRAININGボタンをクリックして学習を開始します。
待つこと5時間...無事学習が終わるとEVALUATEタブからモデルの評価を確認できます。
各種データが少ないからなのか、PrecisionとRecallが共に100%出ています。
※学習は1時間3ドルかかります。今回だと15ドルかかった計算になります。GCP特有の無料枠があるかと思い、なくても今回のデータくらいならそんなにかからないだろうと思っていて、料金を調べず試していたら数千円の請求がきてしまいました。Predictは無料枠があるみたいです。
予測してみる
喫煙所ある? を試して見ます。
完全一致の文章は学習データに含まれてませんが、喫煙所という単語は含まれているため、見事にtabaccoのスコアが1.00!
次に全く学習データに含まれていない ニコチン最高! という文章を投げてみると、スコアは落ちるもののtabaccoであると言っています。凄い。タバコ=ニコチンという学習もしてくれていそうですね。
終わりに
FAQの分類に使えそうですね。
長い文章も学習できるので、より複雑なFAQにも対応できそうです。
ただし...お高い。