Ahogrammer

Deep Dive Into NLP, ML and Cloud

日本語 Sentiment Analyzer を作ってパッケージ化した話

Sentiment Analysisと言えば自然言語処理ではよく知られたタスクで、典型的にはテキストをポジティブ/ネガティブの2クラスに分類するものだ。 その使い道としては、Twitter等のSNSから自社製品についての投稿を収集して評価や緊急度によって分類し、問題に対応するチームメンバーを決定したり、カスタマーフィードバックを時系列で分析して顧客のsentimentを追跡することで不満が顕在化する前に対処したり、従業員のアンケートを分析して、時系列で変化する従業員感情の変化を追跡して、懸念が表面化する前に解決に導くといったものがある。

そんなSentiment Analysisだが、英語のテキストを分析するためのソフトウェアはこれまで様々な形で提供されてきた。たとえば、PythonパッケージならTextBlobNLTK等があり、クラウドサービスであれば、Google Cloud Natural Language APIAYLIEN等がAPIを提供している。

一方、日本語に対するSentiment Analysis機能の提供はどうなのかというと、Google Cloud Natural Language APIのようなクラウドサービスでは提供されていることが多いが、オープンソースだと充実していないのが現状だと思われる。私の探した限りだと、極性評価辞書を使ったタイプのパッケージがいくつか公開されている程度であった。この手の極性評価辞書を使ったタイプは、単純に極性を足すだけだと上手くいかないので色々とルールを書く必要があり、メンテナンスにコストがかかる。また、クラウドサービスだと課金する必要があるので、ちょっとしたことに使いにくい。






(´・ω・`) しょーがねーなー。作るか。




そういうわけで作ったものをオープンソースで公開した。スターつけてくれると嬉しい。

github.com

デモサイトも用意してあるので、インストールしなくても実際の動作を確認できる。

f:id:Hironsan:20190208120644p:plain

性能的な話

ソースコードを見てもらえればわかるが、asariの中身はとてもシンプルなものになっている。sklearnのTfidfVectorizerLinearSVCしか使っていない。テストセットに対する評価は以下の通り。

              precision    recall  f1-score   support

    negative     0.8484    0.8404    0.8444      2331
    positive     0.9283    0.9322    0.9302      5164

   micro avg     0.9037    0.9037    0.9037      7495
   macro avg     0.8883    0.8863    0.8873      7495
weighted avg     0.9034    0.9037    0.9035      7495

ちなみに、最近流行りのBERTで評価した結果は以下の通り。データセットを分割する際にシードを固定し忘れたので完全に↑と同じテストセットで評価したわけではないことに注意。

             precision    recall  f1-score   support

   negative     0.8735    0.8841    0.8788      2382
   positive     0.9457    0.9403    0.9430      5112

avg / total     0.9228    0.9225    0.9226      7494

BERTと比較してもそれなりの性能を確保できたので、予測速度等を考えて思いっきりシンプルに作っている。こんなモデルで学習して欲しい等あれば、コードを書いてPull Requestを送ってほしい。善処する。