【感情分析】Google Natural Language APIの基礎に触れる
唐突ではありますが、先日担当した案件にてちょうど自然言語処理による感情分析を行う機会がありました。
ビジネスにおいて、膨大なユーザの動向や反響(リアクション)を把握していく為には、人の手を介さないチェックが必要不可欠です。
例えば商品レビューのチェックなど、生身の人間が発信した文章を人の手を介さないチェック、即ちAIによる分析が出来たならば、とある業務フローにおいては大きな業務改善を見込むことが出来るでしょう。
今回はブログをお借りし、その案件で使用した機械学習モデル「Google Natural Language API」についてご紹介をさせて頂きます。
Google Natural Language APIとは
公式サイトでは「Googleの機械学習を使用して非構造化テキストから分析情報を引き出す」ように定義されています。(参考:Natural Language AI)
が、初学者の方にとってはそもそも「非構造化テキスト? 分析情報?」というところからだと思います。
上記については、即ち「任意のテキスト文章を分析し、分析したテキストから情報を得ることが出来るようになる機能」と解釈頂ければ良いと考えます。
例えば、本記事にて掲題している通り【感情分析】を目的とするのであれば、テキストから「感情」の情報を得ることが出来るようになるといった具合です。
このように感情分析についてはNatural Language API以外にいくつも手段はありますが、特にこのAPIを利用することには、以下のようなメリットがあると考えています。
- Google謹製の高品質な機械学習モデルを、コードの記述無しに利用することができる(APIを呼び出す記述は必要です)
- 最新の機械学習モデルを用いた分析結果をアプリに用いることができる
またGoogle Natural Language APIは、具体的に以下のようなことが可能です。
- 【エンティティ分析】 人物・組織、場所、イベント、メディアなど(エンティティ)を識別し、ラベルを付与
- 【感情分析】 テキスト内で示されている全体的な感情(ネガティブ/ポジティブ/ニュートラル)の取得や、感情の強さの数値化
- 【エンティティ感情分析】 テキスト内で示されている各エンティティに対する感情の取得
- 【構文解析】 テキストから言語情報を抽出して一連の文章とトークンに分解することで、 それらのトークンを更に分析できるフォーマットにする。
発生し得るコストについて
これだけ便利な機能、気になるところはその料金だと思います。
利用する機能によって多少の揺れはあるものの、調べてみたところ”一般的な”使い方をする分にはそこまで高額ではない範囲の金額で利用することができるようでした。
詳細な仕様については公式の情報をご参照頂ければと存じますが、簡単にまとめると「1か月の総アクセス数により金額テーブルが変動し、1,000文字単位のテキストごとに料金が発生する」といった形式になっており、しかも「1か月の総アクセスが5,000アクセス以下の場合」は料金が発生せず、特に個人で検証するレベルの利用においては非常に優しい料金形態となっていると言えます。(2022年3月現在 参考:料金単位)
その為、まだ実践したことがないので試してみたいという方は、無料だと思って試しに遊んでみるのも良いですね。
サンプルコード
では、実際に使う場合にはどうしたらいいでしょうか。
公式ドキュメントの記述を参考に作成した感情分析サンプルは以下となります。
import os
import numpy as np
# Natural Language APIを使えるようにするライブラリ
from google.cloud import language_v1
# APIKEYファイルを設定(予めGCPで認証ファイルを作成しておく必要がある)
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = GCP認証ファイルのパス
client = language_v1.LanguageServiceClient()
text_content = '今日は天気が良い'
# Available types: PLAIN_TEXT, HTML
type_ = language_v1.Document.Type.PLAIN_TEXT
# Optional. If not specified, the language is automatically detected.
# For list of supported languages:
# https://cloud.google.com/natural-language/docs/languages
language = "ja"
document = {"content": text_content, "type_": type_, "language": language}
# Available values: NONE, UTF8, UTF16, UTF32
encoding_type = language_v1.EncodingType.UTF8
response = client.analyze_sentiment(request = {'document': document, 'encoding_type': encoding_type})
# Get sentiment for all sentences in the document
score = []
magnitude = []
for sentence in response.sentences:
print( 'score:{}'.format(sentence.sentiment.score) )
print( 'magniture:{}'.format(sentence.sentiment.magnitude ) )
実行結果は以下の通りです。「今日は天気が良い」がポジティブな文章と分析されている事が分かります。
score:0.6000000238418579
magniture:0.6000000238418579
テキストを「今日の天気は悪くない」とした場合の実行結果は以下の通りです。
「悪くない」をポジティブな意味として認識してくれているのが分かります。
score:0.4000000059604645
magniture:0.4000000059604645
このように数行の設定を行うだけで、簡単にテキストの分析を行うことが可能です。
これなら気軽に学習済みの自然言語モデルを利用することが出来そうですね。
(参考:感情分析)
あとがき
今回紹介したNatural Language APIを用いると、DBなどから取得したテキストに対してネガティブ・ポジティブのスコア付けをする機能なども気軽に作成することが可能です。
その他、サイト掲載予定のテキストがネガティブ・ポジティブどちらに寄った文章なのかを判断する、といった使い方も出来るかもしれませんね。
今回紹介したもの以外にもGoogleから提供されているAPIとして、指定のテキストの翻訳を行ってくれるものや音声をテキスト化できるもの、逆にテキストを音声化できるものといった様々な機械学習モデルが利用できます。
あるいは、AWSから提供されている自然言語処理としてAmazon Comprehendといったものもございます。
こちらを少し調べてみると、Natural Language APIと出来ることが若干異なっている為、システム実装の際は要件によって何を選定すべきか熟考する必要がありそうです。
今後利用するチャンスがあれば、これらもご紹介したいと考えています。
その際には、また足を運んで頂けますと幸いです。