エンジニアのブログです。

日本語の感情分析APIをサーバーレスで公開しました

Posted at

日本語のテキストを感情分析できるAPIをサーバーレス(Lambda + API Gateway)で公開しました。

https://github.com/hareku/sentiment-analysis-api

以下のようにAPIを叩くと、どの感情に分類されるかの確率分布を返します。

curl -X POST -d '{\"TextList\": [\"この映画は最高です\"]}' https://jxbe3mkwui.execute-api.ap-northeast-1.amazonaws.com/Prod/
# {"result": [{"Positive": 0.8138175294673967, "Negative": 0.029238149491493233, "Neutral": 0.15694432104111128}]}

コンセプトは、サーバーレスで低コストに感情分析APIを運用することです。

アルゴリズムは単純ベイズ分類器を使い、精度は72%、AUCは0.86と感情分析の中では割と良いスコアを出せていると思います。詳しい精度や訓練法についてはGitHubのJupyter Notebook (sentiment_api/training.ipynb)で公開しています。

50万回のAPI呼び出しで1ドル

インフラはAWSのLambdaとAPI Gatewayを用いており、いわゆるサーバーレスです。Lambdaのスペックは128MBでレスポンスタイムが50ms以内なので、100万回でおよそ0.5ドルに収まります。そしてAPI Gatewayが100万回で1.29ドルなので、100万回をおおよそ2ドルで捌くことができます。

感情分析のAPIは色々なクラウドが公開しており、例えばAWSはAmazon Comprehendといった自然言語処理のAPIを出していますが、3000ツイート程度を感情分析すると1ドル必要です。

それに比べ今回実装したものは100万ツイートで1ドルです。さらに1リクエストで複数のテキストを処理できるので、1/数十程度に削減できます。

単純ベイズ分類器は精度も高く低メモリ

単純ベイズ分類器を採用した理由は、『精度が十分高い』『訓練が数秒で終わる』『メモリ使用量が低くLambdaと相性が良い』の3点です。

TensorflowでRNN(LSTM)によるテキスト分類も試してみましたが、パラメーターを調整しても精度が75~78%程度しか出せず、それほど単純ベイズ分類器と変わりませんでした。感情分析の精度については色々調べましたが、どうやら70~80%程度で頭打ちになるケースがほとんどのようです。(例: Kaggle Sentiment140 dataset with 1.6 million tweets)

またTensorflowのモデルロード時に1GB程度のメモリが必要で、ロードにも20秒程度掛かるのがサーバーレスにおいて非常にボトルネックとなりました。それに比べ単純ベイズ分類器はモデルサイズが1MBに満たず、ロードも非常に高速です。

おわりに

データセットはTwitter日本語評判分析データセットを用いました。現在も30万ツイートほど残っており、十分訓練に使うことが出来ました。ありがとうございます。

SentencePieceの日本語学習モデルはgithub.com/yoheikikuta/bert-japaneseを用いました。こちらもありがとうございます。サーバーレスにおいてはMeCabだと辞書サイズが大きく使い辛いですが、今回はSentencePieceが非常に役立ちました。


About me
Creative Commons License

This blog's source code is published on GitHub.