🐕

AITuberにBERTを使った感情推定を導入する

2023/05/04に公開

今回書くこと

OpenAIで対話するAIの対話アシスタント(AITuber)にPythonを使った感情推定の機能を導入します。感情が扱えるようになるとモデルの表情を変えたり、発言内容を記憶する際に重み付けを変えたりできそうなので導入をしてみることにしました。

具体的にはこんな内容を記載していきます。

  • 感情推定はテキストからBERTを使って感情のラベルとスコアを算出するものとしています。

なぜBERT?

昨今話題の大規模言語モデルで使われるTransformersを使った新しい手法ということで、こちらを試してみることにしました。

また感情推定というとJanome・日本語評価極性辞書といった事例もよく目にします。Janomeと日本語評価極性辞書を使った感情分析と比べると、BERTを使った方が起動時に十数秒待たされる分、遅く感じるらしいのですが、辞書に左右されることなく感情分析が出来るメリットもあるようです。

感情推定に用いるライブラリ

まずは必要なパッケージを環境にinstallしていきます。

  • PyTorch
  • torchvision
  • transformers

requrements.txtに記載して、以下を実行しましょう。

pip install -r requirements.txt

感情推定の実行モジュール

モジュールの実装

感情推定を実行する関数は下記のように作成しました。

# 必要なパッケージのimport
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification, BertJapaneseTokenizer

# 感情分析を行うモジュール
def analyze_emotion(text):
	# 1. 学習済みモデルの準備
	model = AutoModelForSequenceClassification.from_pretrained("koheiduck/bert-japanese-finetuned-sentiment")
	# 2. 日本語の単語分解
	tokenizer = BertJapaneseTokenizer.from_pretrained("cl-tohoku/bert-base-japanese-whole-word-masking")
	# 3. 感情分析モデルの生成
	nlp = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer)
    
	emotion_data = nlp(comment)
	return emotion_data

コメントにある通り、対象となる文章を単語に分解しモデルに応じてスコアリングをかけていくプロセスを取ります。

ステップ1で使う学習済みモデル、ステップ2で使う単語分解に使うtokenizerはHugging Faceで公開されているものを使っています。
※この辺りのモデルはより良いものがありそうな気もします。良いのがあればぜひ教えてください。

HuggingFaceのAPIを取得して、.envファイルに記載などをしておきましょう。

pipelineで生成されるデータ

先に実装したanalyze_emotion(text)で生成される値は以下のような辞書式データになっています。

[{"label":${string}, "score": ${number}]

例)
[{"label":"NEGATIVE", "score": 0.746918797492981}]

labelは POSITIVE NEUTRAL NEGATIVE の3種類あるようです。

まとめ

わたしが制作しているAITuberでは、更に以下のようなことも行っています。

  • 実装した感情データをDBに保存するようなモジュールを準備
  • AITuberと対話が発生するたびにバックグラウンド処理で感情推定と保存を実行
  • 推定した感情データでLive2Dモデルの表情を変更

今後こうした記事や、制作しているAITuber自体も出していこうと思っています。

Discussion