Sentiment分析(Microsoft Azure, Google Cloud, IBM Watson)

Sentiment分析は、自然言語処理の分野で昔から研究されてきました。クラウドサービスとしても一般的に提供されていますが、その結果がどのくらい自分の感覚と一致するのか?あるいは、サービスによってどの程度異なるのかを試してみたくて、Webアプリを作ってみました。

Microsoft Azure, Google Cloud ,IBM CloudそれぞれのSentiment分析の結果を比較するために、グラフ化しています。

結論としては、各サービスで癖があるので、このまま使うのではなく、タスクに応じて実際のデータで再学習させる、あるいは判定の閾値をチューニングするなどの措置が必要だと思います。

なお、今回は単純化のために、入力された文章(Document)の判定結果を出力していますが、文(Sentence)単位、エンティティ単位の判定も可能です。例えば、商品レビューの場合には、商品そのものの判定と、カスタマーサービスなど商品以外の判定を分離することもできそうです。

Demo

Input Text欄に文章を入力して、「Sentiment分析実行」ボタンをクリックします。

うまく表示できない時のDemoサイトはこちら

Microsoft Azureは、positive, negative, neutral の値を合計が1.0になるように出力します。グラフではこの3つの値の比率を可視化しています。

GoogleCloudは、-1.0(negative)から1.0(positive)の値をscoreとして出力します。またSentimentの強さをmagnitudeとして出力します。グラフはscoreの値のみを使ってSentimentを可視化しています。解釈にはmagnitudeの値も加味する必要があることに注意が必要です。以下のリンク先を確認してください。

Google:感情分析値の解釈について

IBM Cloudは、-1.0(negative)から1.0(positive)の値をscoreとして出力します。また、判断したSentiment[positive, negative, neutral]をlabelとして返します。今回利用した3社の中で、IBMのみemotion分析に対応しており、以下のような結果を得ることができます。残念ながら、日本語には対応していません。

import json
from ibm_watson import NaturalLanguageUnderstandingV1
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
from ibm_watson.natural_language_understanding_v1 \
    import Features, EmotionOptions

authenticator = IAMAuthenticator(API)
natural_language_understanding = NaturalLanguageUnderstandingV1(
    version='2022-04-07',
    authenticator=authenticator
)

natural_language_understanding.set_service_url(url)

response = natural_language_understanding.analyze(
    text ="I lost my wallet",
    features=Features(emotion=EmotionOptions())).get_result()

print(json.dumps(response, indent=2))
{
  "usage": {
    "text_units": 1,
    "text_characters": 16,
    "features": 1
  },
  "language": "en",
  "emotion": {
    "document": {
      "emotion": {
        "sadness": 0.794734,
        "joy": 0.010299,
        "fear": 0.248339,
        "disgust": 0.007741,
        "anger": 0.047469
      }
    }
  }
}