見出し画像

PythonでGoogle Mapの口コミを感情分析する

放送大学で「プログラミング入門Python」という授業を受講しています。

授業のなかで、自分でPythonのプログラムを書いて提出する課題がありました。
Pythonに向いている処理という課題だったので、WebAPIでデータを取得してそれを分析するようなプログラムを考えました。
Pythonはデータ分析のライブラリが豊富で、簡単に分析用のプログラムを書くことができます。

課題で提出したものを少し改良して以下に書いてみます。

今回は日本語で感情分析を行うためのライブラリとして、ML-Askを使用しました。

Google Colabで実行する場合は、必要なパッケージ等をインストールします。

!pip install pymlask
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7

分析対象のデータとして、Google Mapのレビューを取得します。
Google Places APIを使って対象の場所の情報を取得しましょう。
(Google Places APIは従量課金制ですが、一ヶ月$200までの枠が無料で利用できます)
対象の場所IDは以下ツールで取得できます。

以下がPythonのプログラムです。

import requests
import json
from mlask import MLAsk
import pandas as pd
import matplotlib.pyplot as plt

# Google Places APIで対象の場所の情報を取得する。
params = {
    "key":"SAMPLE_KEY", # Google Cloudで取得したAPIキーを設定する。
    "place_id":"ChIJTQbYAg2MGGARt22eNwtfGtE", # 皇居の場所ID
    "fields": "reviews",
    "region" : "jp",
    "language" : "ja",
    }
url = "https://maps.googleapis.com/maps/api/place/details/json"
response = requests.get(url, params= params)
result = response.json()

# レビュー情報を取得する。
reviews = []
if "reviews" in result["result"]:
    reviews.extend(result["result"]["reviews"])

# レビュー文の感情分析をする。
emotionAnalyzer = MLAsk()
resultList = []
for review in reviews:
    result = emotionAnalyzer.analyze(review.get("text"))
    # 感情表現が含まれていない場合、「NONE」を設定する。
    if result.get("orientation") == None:
        result.setdefault("orientation", "NONE")
    resultList.append(result)

# 分析結果を集計する。
grouped = pd.DataFrame(resultList).groupby(["orientation"]).size().reset_index(name="count")
print(grouped)

# 円グラフを表示する。
plt.pie(grouped["count"], labels=grouped["orientation"])
plt.show()

Google Places APIから取得したレビュー情報は以下のように格納されています。(Place Details | Places API | Google for Developers
「text」がレビュー文なので、これを分析対象とします。

{'author_name': 'chiaki', 'author_url': 'https://www.google.com/maps/contrib/103292039926819880328/reviews',
 'language': 'ja',
 'original_language': 'ja',
 'profile_photo_url': 'https://lh3.googleusercontent.com/a-/ALV-UjXvCnaMT3p5cPvEY4E3Sow0Q9vFLNzsIn5QI5ZmMAgam3WCPVjR=s128-c0x00000000-cc-rp-mo',
 'rating': 5,
 'relative_time_description': '1 か月前',
 'text': '天皇御一家のお住まいのある皇居へ。\nいつもありがとうございます。\n皇居のお濠沿いに歩き千鳥ヶ淵と靖國神社まで。\n半周近く歩いてると思うけど一周すると\nすごく運動になりますね。お散歩という感じではなかったです🌱家が近くだと歩きに来たい。\nランナーもたくさんでした。\n一般参観に多くの方々が並んでおられました。\n今度は皇居参観や楠木正成様の銅像、二重橋も✨晴れてくれて嬉しかったです。', 
 'time': 1717313770,
 'translated': False},

analyze()の結果は以下のように格納されています。

{'text': '天皇御一家のお住まいのある皇居へ。\nいつもありがとうございます。\n皇居のお濠沿いに歩き千鳥ヶ淵と靖國神社まで。\n半周近く歩いてると思うけど一周すると\nすごく運動になりますね。お散歩という感じではなかったです🌱家が近くだと歩きに来たい。\nランナーもたくさんでした。\n一般参観に多くの方々が並んでおられました。\n今度は皇居参観や楠木正成様の銅像、二重橋も✨晴れてくれて嬉しかったです。',
 'emotion': defaultdict(<class 'list'>,
 {'yorokobi': ['嬉しい', '晴れる']}),
 'orientation': 'POSITIVE',
 'activation': 'NEUTRAL',
 'emoticon': None,
 'intension': 1,
 'intensifier': {'interjections': ['んで', 'ありがとう']},
 'representative': ('yorokobi', ['嬉しい', '晴れる'])}

ML-Askは『感情表現辞典』を基に作成した感情表現データベースを使用して、テキストデータの語句を10種類の感情に分類します。
ここからネガポジ判定の結果(orientation)を取得して集計します。

プログラムの実行結果は以下のようになります。

集計結果と円グラフ

Google Places APIでは最大5件分のレビューしか取得できないので、ちょっと集計結果としては物足りないですね。
GoogleのAPIはドキュメントが充実しているので、学習用には良いかと思います。

参考にしたサイト

この記事が気に入ったらサポートをしてみませんか?