Google Natural Language API をリサーチ分野での活用を検討した話
こんにちは、メタサイトのKHです。
私たちクロス・マーケティンググループでは企業理念を元に事業貢献のための挑戦を推奨しています。
今回はGoogle Natural Language APIを私たちの事業で活用できないかを調査、検討を行いました。
はじめに
Google Natural Language APIとは、 Googleが提供する自然言語処理サービスの1つで、Googleにて事前学習済のモデルを用いて 手軽に分析が行えるAPIです。
背景
私たちはデータ分析の基盤としてBigqueryを利用しています。 BigQueryには様々なデータが蓄積していますが、 今回は、リサーチでの活用を検討するにあたり、アンケートの自由回答形式(以下、FA)のデータにてGoogle Natural Language APIを用いた分析を行いました。
アンケート回答形式について
まずはじめに、アンケート回答形式について軽く説明します。 一般的にアンケートの回答形式は大きく2つあり、それぞれ以下の特徴があります。
・選択方式(SA)
- 回答者の負担が少ない
- 機械的な集計が容易
- 回答結果が、アンケート作成者が用意した範囲でしか得ることができない
・自由回答形式(FA)
- 回答者の負担が大きい
- 機械的な集計が難しい
- 回答結果が、アンケート作成者が予期していない有意義な回答結果得る可能性がある。
サンプルデータ
調査用のサンプルデータとして、 ダミーのアンケート回答結果をBigqueryテーブル上に用意しました。
分析方法について
Bigqueryにはリモート関数が用意されており、 Bigqueryからリモート関数経由で、APIを直接実施できます。
なので準備を行ったあとはSQL書くだけでBigquery上のデータの分析が行なえます。
今回の検証ではNatural Language APIに用意されている「感情分析」と「エンティティ分析」を行いました。
・感情分析は、文章の感情をポジティブ/ネガティブかをスコア化し、
・エンティティ分析は、文章のエンティティ毎の、タイプ、メタデータ、文章における重要度等を付加してくれます。
BigqueryからAPIを呼び出し、分析する詳細な手順についてはこちらの記事を参考にしました。
・エンティティ分析用CloudFuction
from google.cloud import language_v1
import json
def analyze_entities(text):
client = language_v1.LanguageServiceClient()
response = client.analyze_entities(
document=language_v1.Document(
content=text,
type_=language_v1.Document.Type.PLAIN_TEXT),
encoding_type=language_v1.EncodingType.UTF8)
result_list = []
for entity in response.entities:
result_dict = {}
print('name: {0}'.format(entity.name))
print('type: {0}'.format(entity.type_.name))
print('salience: {0}'.format(entity.salience))
result_dict['name'] = entity.name
result_dict['type'] = entity.type_.name
result_dict['salience'] = entity.salience
result_list.append(result_dict)
return result_list
def get_entities(request):
try:
return_value = []
request_json = request.get_json()
print(request_json)
calls = request_json['calls']
for call in calls:
for text in call:
return_value.append(analyze_entities(text))
replies = [str(x) for x in return_value]
return_json = json.dumps( { "replies" : replies} )
print(return_json)
return return_json
except Exception as inst:
return json.dumps( { "errorMessage": 'something unexpected in input' } ), 400
実行結果
感情分析
アンケートのFA回答結果に、感情分析の結果を付加することができました。 クエリー一つでカラムに分析結果を追加できるのは便利ですね。
結果の 「magnitude」が感情の強さを 「score」の+がポジティブ、-がネガティブを示しています。
FAの回答結果は、定性的な結果であるため、一般的に集計しづらいデータなのですが スコア化することで定量的な分析も容易になります。 また回答結果だけでなく回答者の属性情報等を加味することで、このセグメントの方はこの傾向にある。等分析もできそうです。
エンティティ分析
アンケートのFAの回答結果を、エンティティ毎に分割、結果出力することが出来ました。
「name」が、分析したエンティティ対象の名前を 「Type」が、エンティティのタイプを、 「salience」が、文章中の重要度を示します。
結果がエンティティ毎にレコードで分けて出力できているので、その後のデータの活用も容易です。
ただし、「タイプ」についてはOTHERに当たる物が多く見受けられました。今後の改善に期待です。
Typeの詳細についてはこちらより
また上記実行結果を元に
pythonのWordcloudのライブラリを用いて上記データをテキストマイニングも行いました。
今回はサンプルデータですが、ここから「ポイント」や「クーポン」がとくに重要視されてることがわかります。
参考: エンティティ分析の結果は1レコードの中に配列で返却しているので、UNNESTを用いて分割しました。
WITH
base as (
SELECT
answer_data,
dataset.get_entities_sample(answer_data) as nlp_entities_result
FROM `dataset.nlp_dummy_data_table`
)
SELECT
answer_data,
JSON_VALUE(nlp_entities_result, '$.name') AS name,
JSON_VALUE(nlp_entities_result, '$.type') AS type,
JSON_VALUE(nlp_entities_result, '$.salience') AS salience,
FROM
base
LEFT JOIN
UNNEST(JSON_QUERY_ARRAY(base. nlp_entities_result)) AS nlp_entities_result
まとめ
アンケートの回答方式である、FAの回答結果は定性的なデータのため、 選択方式(SA)と比べて集計の手間に難点がありますが、 Natural Language APIとBigqueryを利用することで手軽に集計、定量的な分析が行うことができました。
APIは元データに追加で情報を付加するまでなので、この先このデータをどのように分析活用するかが重要で、APIでの分析結果がインサイトの発見に役立つかと思います。
またアンケートのFA回答結果を自動で分析し、データ蓄積することで簡易な自動集計及びにレポートまでであれば自動化も実現可能です。 (Bigqueryであればリモート関数で分析できるので、Scheduled query機能で分析できお手軽です)
ただリサーチ用途には大量のデータを扱う必要があるため、利用コストも気になる所です。
参考までに「エンティティ分析、感情分析」のコスト感も記載しておきます。
・10万件のデータであれば、100ドル
・100万件のデータであれば、500ドル
・1000万件のデータであれば、2500ドル
コストの詳細はこちらを参照ください。
今回はアンケート結果の分析が主でしたが、
他に思いつくAPIを活用するの使い道として 問い合わせフォームの投稿内容を定期的に分析することでネガティブなワードを検知し通知を行ったり、
リサーチにおいても、Twitterの投稿を分析かけ、 世間的な流行や、ポジティブに捉えらているもの、ネガティブに捉えられているものを分析してみるなど も新しい発見がありそうです。