こんにちは、AGESTのバックエンドエンジニアのまさです。今回は社内での問い合わせに対して、それがどんな問い合わせの内容かを判別するというDeepLearningでの分類タスクをできる限りシンプルに実施してみたいと思います!
環境準備
まずは環境の準備ですが、これも簡単に済ますためGoogle Colaboratoryを利用します。(Googleアカウントをお持ちであれば誰でも利用できます。)Google Colaboratoryはブラウザ上で簡単にpythonをオンライン実行できる画期的なツールです。制限はありますがGPUやTPUも利用することが可能です。
分類の実施
Google Colaboratoryに接続すると、下記のようなページが表示されるのでメニューから「ファイル」→「ノートブックを新規作成」を選択します。
するとこのように何も入力されていない新規ノートブックの実行画面に遷移します。
初期のセルに以下のように入力を行い、日本語分類に必要なライブラリのインストールを行います。
インストールしたライブラリをインポートします。
分類用のモデルをロードします。
分類対象の文(text)、分類対象(labels)、分類結果想定文(template)を変数に設定します。
※分類結果想定文 = 分類結果を当てはめて返答として成り立たせる文です。これも恐らく推定に用いられる要素となります。
分類モデルに分類を実行させ、結果を出力します。
この例では問い合わせ文が「お疲れ様です、自宅から会社までの通勤に関しての費用の清算方法についての詳細を知りたいです。」という問い合わせで、この問い合わせが「備品購入」、「有給申請」、「交通費」、「健康診断」のどれに該当するかという分類タスクに対して結果は
‘labels’: [‘交通費’, ‘有給申請’, ‘備品購入’, ‘健康診断’]
‘scores’: [0.9094147086143494, 0.06657364964485168, 0.01835019700229168, 0.005661484319716692]
交通費に関する問い合わせであるという推定結果が90%となり、正しく推定できていると考えられます。では続けて問い合わせの文を変更して再度実行してみます。問い合わせ文の変数を下記のように変更します。
再び分類モデルによる分類を実行します。
今回は問い合わせ文が「すみません、明日お休みをいただきたいのですがどのように申請したらよいでしょうか?」という問い合わせに対して分類結果は
‘labels’: [‘有給申請’, ‘備品購入’, ‘交通費’, ‘健康診断’],
‘scores’: [0.7286087870597839, 0.10699065029621124, 0.09674988687038422, 0.06765064597129822]
となり、有給申請に関する問い合わせであるという結果が72%となり、こちらも正しく推定できています。最終的なコード全体は以下のようになります。
!pip install transformers fugashi unidic_lite
from transformers import pipeline
classifier = pipeline("zero-shot-classification", model="Formzu/bert-base-japanese-jsnli")
text = "お疲れ様です、自宅から会社までの通勤に関しての費用の清算方法についての詳細を知りたいです。"
labels = ['備品購入', '有給申請', '交通費', '健康診断']
template = "この問い合わせは{}に関する問い合わせです。"
out = classifier(text, labels, hypothesis_template = template)
print(out)
text = "すみません、明日お休みをいただきたいのですがどのように申請したらよいでしょうか?"
out = classifier(text, labels, hypothesis_template = template)
print(out)
おわりに
簡単な例ではありますが、実用的な分類を数分で実施できることを検証することができました。本来であれば学習という、分類対象のドメインの情報をモデルに覚えさせる処理を行う必要があるのですが、今回のモデルで実施したのはZeroshot分類という汎用的に広範囲に学習されたモデルを利用しての分類となるため学習も不要で分類ができました。非常に重要な高い精度を求められるシステムでの採用は難しいかもしれませんが、社内システムや簡易的な分類を行う必要があるときにはこうしたモデルでの分類を採用することも検討できるかもしれませんね。
また今回使用したhuggingfaceのtransformersではこちらで様々なモデルを公開していますので、用途に応じて使い分けることで分類だけでなく文章の生成もおこなったりすることが可能ですのでぜひお試しいただければと思います。