TECH BLOG
メタサイト
メタサイト

Google Natural Language API をリサーチ分野での活用を検討した話

Cover Image for 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テーブル上に用意しました。

    sample_fa_enquete_data

    分析方法について

    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
    

    実行結果

    感情分析

    sentiment_anlyze_result

    アンケートのFA回答結果に、感情分析の結果を付加することができました。 クエリー一つでカラムに分析結果を追加できるのは便利ですね。

    結果の 「magnitude」が感情の強さを 「score」の+がポジティブ、-がネガティブを示しています。

    FAの回答結果は、定性的な結果であるため、一般的に集計しづらいデータなのですが スコア化することで定量的な分析も容易になります。 また回答結果だけでなく回答者の属性情報等を加味することで、このセグメントの方はこの傾向にある。等分析もできそうです。

    エンティティ分析

    entity_analyze_result

    アンケートのFAの回答結果を、エンティティ毎に分割、結果出力することが出来ました。

    「name」が、分析したエンティティ対象の名前を 「Type」が、エンティティのタイプを、 「salience」が、文章中の重要度を示します。

    結果がエンティティ毎にレコードで分けて出力できているので、その後のデータの活用も容易です。

    ただし、「タイプ」についてはOTHERに当たる物が多く見受けられました。今後の改善に期待です。

    Typeの詳細についてはこちらより

    また上記実行結果を元に pythonのWordcloudのライブラリを用いて上記データをテキストマイニングも行いました。 text_mining

    今回はサンプルデータですが、ここから「ポイント」や「クーポン」がとくに重要視されてることがわかります。

    参考: エンティティ分析の結果は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の投稿を分析かけ、 世間的な流行や、ポジティブに捉えらているもの、ネガティブに捉えられているものを分析してみるなど も新しい発見がありそうです。

    私たちは積極的に採用活動をしております。
    https://www.metasite.co.jp/recruit

    Companies

    エクスクリエ
    クロス・マーケティンググループ
    メタサイト
    クロス・コミュニケーション

    Tags