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はドキュメントが充実しているので、学習用には良いかと思います。
参考にしたサイト
この記事が気に入ったらサポートをしてみませんか?