IBM Watson Natural Language Understanding APIのSentiment分析が日本語対応していたので試してみた

IT技術 IBMCloud実践

先日、IBM WatsonのNatural Language UnderstandingのSentiment分析APIが日本語対応されていることに気づきました。より高機能なEmotion分析APIはまだ未対応のようですが、この記事ではSentiment分析APIについて試してみたことをまとめてみました。

目次

IBM WatsonのNatural Language Understandingとは

IBM Cloudで提供している自然言語処理APIです。デフォルトで存在する感情分析・カテゴリ分析などさまざまな分析APIがデフォルトであります。また、有料プランであれば、Watson Studioというサービスをつかうことで機械学習を行って作ったオリジナルのモデルをつかって独自の分析を行うこともできます。

ちなみに無料のライトプランだと1ヶ月あたり30,000NLU項目利用までが無料です。NLU項目とは解析量の単位です。1単位10,000文字となっております。つまり、1万文字以下の解析を行う場合、一回のAPIアクセスでは1NLU項目しか使わないため、3万回まで無料で解析できます。一方で1万文字以上の解析を行う場合、2NLU項目以上が使われることになりますので無料の解析回数は減ることになります。

準備

それでは早速準備してみます。IBM Cloudのコンソールでやることは利用登録をすることと、資格情報からアクセスするURLとAPI鍵を確認するだけです。

まずはカタログからNatural Language Understandingを選択してこちらの画面で登録をします。

 

登録が終わったらサービスのコンソールから資格情報を確認しましょう。ここのURLとAPI鍵を後ほどプログラムコードに指定するのでメモしておきましょう。

 

サンプルコード

準備ができたのでサンプルコードを書いてみます。

公式ドキュメントを読んでみると、直接テキストを引数として渡すだけでなく、WEBサイトを指定して、特定のHTMLタグの文章だけを解析するといった高度なこともできるようですが、今回はシンプルに引数に解析したいテキストをいれて解析してみます。

公式ドキュメントのサンプルをちょっと修正しただけですが、利用することもとても簡単なようです。

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

authenticator = IAMAuthenticator('先ほどメモしたAPI鍵')
natural_language_understanding = NaturalLanguageUnderstandingV1(
    version='2020-08-01',
    authenticator=authenticator
)

natural_language_understanding.set_service_url('先ほどメモしたURL')

response = natural_language_understanding.analyze(
    #検証するコメント
    text='''
世界平和のためにできることですか?家に帰って家族を愛してあげてください。
''',
    features=Features(sentiment=SentimentOptions())).get_result()

print(json.dumps(response, indent=2))

こちらのソースコードを実行すると以下のような結果になります。

{
  "usage": {
    "text_units": 1,
    "text_characters": 38,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": 0.8689,
      "label": "positive"
    }
  },
  "language": "ja"
}

ポジティブな言葉なので想定通りpositiveのスコアがでました。解析した言語や文字数もカウントされていることから日本語として解析しているとわかります。

英文と日本語文で調べてみる

せっかくなので英語の解析と日本語の解析、それぞれ見比べてみたいと思います。

アインシュタインの名言

Try not to become a man of success, but rather try to become a man of value.
成功者になろうとするな。価値ある者になろうとせよ。
{
  "usage": {
    "text_units": 1,
    "text_characters": 78,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": 0.780281,
      "label": "positive"
    }
  },
  "language": "en"
}
{
  "usage": {
    "text_units": 1,
    "text_characters": 27,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": 0.642324,
      "label": "positive"
    }
  },
  "language": "ja"
}

両方ともpositiveに判定されました。scoreもほぼ同一です。

マザーテレサの名言

We shall never know all the good that a simple smile can do.
ちょっとした笑顔が可能にするすべての良いことを私たちは知らない。
{
  "usage": {
    "text_units": 1,
    "text_characters": 62,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": 0.954375,
      "label": "positive"
    }
  },
  "language": "en"
}
{
  "usage": {
    "text_units": 1,
    "text_characters": 34,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": 0.618215,
      "label": "positive"
    }
  },
  "language": "ja"
}

こちらも両方ともpositiveに判定されました。ただ、若干英語の方がスコアが高いです。

Walt Disneyの名言

If you can dream it, you can do it.
夢見ることができれば、それは実現できる。
{
  "usage": {
    "text_units": 1,
    "text_characters": 37,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": 0.758837,
      "label": "positive"
    }
  },
  "language": "en"
}
{
  "usage": {
    "text_units": 1,
    "text_characters": 22,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": 0,
      "label": "neutral"
    }
  },
  "language": "ja"
}

ただ、若干英語の方がポジティブと高いのに対して、日本語の方はニュートラルでした。訳に利用した言葉について、ポジティブ評価されなかったのでしょうか。

リンカーンゲティスバーグ演説

ここまで短文でしたがここからは長文にしてみます。

{
  "usage": {
    "text_units": 1,
    "text_characters": 1467,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": 0.422245,
      "label": "positive"
    }
  },
  "language": "en"
}
 % python3 watson.py
{
  "usage": {
    "text_units": 1,
    "text_characters": 829,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": -0.401164,
      "label": "negative"
    }
  },
  "language": "ja"
}

英語はポジティブ、日本語はネガティブになってしまいました。

スタンフォード大学の卒業式で行われたスティーブ・ジョブズの演説

もう一つスティーブ・ジョブズの演説も解析してみます。

{
  "usage": {
    "text_units": 1,
    "text_characters": 344,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": -0.650193,
      "label": "negative"
    }
  },
  "language": "ja"
}
{
  "usage": {
    "text_units": 1,
    "text_characters": 640,
    "features": 1
  },
  "sentiment": {
    "document": {
      "score": 0.436791,
      "label": "positive"
    }
  },
  "language": "en"
}

こちらも英語はポジティブ、日本語はネガティブになってしまいました。

もともと、人間でさえテキストコミュニケーションだとその人の感情がわからないところもあります。また、英語から日本語に訳すときの言葉の使い方でも気持ちの抑揚は変わってしまうものです。なので、精度が悪いとは必ずしもいうことはできませんが、長文であればあるほどズレが出る可能性がありますのでこのあたりは留意して利用した方がいいと思われます。

終わりに

先日以下のWEBアプリのリリースをしました。実は、日本語に完全対応されていないことから、一部の方が無理矢理英語訳して利用しているという実態を知り、IBM WatsonのNatural Language UnderstandingのAPIは利用せず、別の自然言語処理APIサービスを使って開発していました。

もっとも今回の結果をみてみると、テキスト特有の性質を考慮すべきではあるものの、精度はそれなりにありそうなので、今後、こちらのAPIを解析に利用したチューニングも検討してみたいと思います。

最後まで読んでいただきありがとうございました。IBM Watsonの自然言語処理に少しでも興味を持っていただければ幸いです。

Photo by Lee Campbell on Unsplash

 みやうデジタルラボ - にほんブログ村