目次
はじめに
こんにちは、ノミの心臓のomkです。
アンケートで急に否定的な意見が来るとショックを受けてしまうので事前に心構えをしてから意見を見られるように注意書きをつけようと思います。
やってみた
全体の流れとしては以下です。
- Google Formsのフォームで取ったアンケートの結果をCSVで出力してS3に上げます。
- Glue CrawlerでDataCatalogにテーブルを作成します。
- Python Shellのジョブでawswrangler経由でAthenaからテーブルのデータを取得します。
- pandasから対象カラムをAmazon Comprehendに渡して感情分析を行います。
- 分析結果のネガティブ値をもとに注意書きカラムを作成します。
- 出来たDataFrameをS3にCSVで出力します。
という感じです。
1,2はジョブの外部のことなので省略します。必要な権限はあたっている前提です。
そして出来たPythonスクリプトが以下です。
Glue Python Shellの場合、Python3.9でのみデフォルトのライブラリで対応しています。
import sys
import boto3
import json
import pandas as pd
import awswrangler as wr
import s3fs
from awsglue.utils import getResolvedOptions
# Variables
pd.set_option('display.max_columns', 100)
pd.set_option('display.max_rows', 100)
args = getResolvedOptions(sys.argv, ['BUCKET_NAME','TARGET_COL'])
tarcol = args['TARGET_COL']
comprehend = boto3.client(service_name='comprehend', region_name='ap-northeast-1')
# Athenaから取得
pdf_survey= wr.athena.read_sql_query("select * from raw", database="omk-comprehend-database")
# 不要なカラム、値の削除
pdf_survey = pdf_survey[[tarcol]]
pdf_survey = pdf_survey.replace('"', '')
pdf_survey = pdf_survey.dropna(how='all')
pdf_survey = pdf_survey[pdf_survey[tarcol] != ""]
# 感情分析
def detect_sentiment(x):
response = comprehend.detect_sentiment(Text=x[tarcol], LanguageCode='ja')
if response["SentimentScore"]["Negative"] > 0.2:
return "このコメントには否定的な意見が含まれている可能性が高いです"
else:
return ""
#感情分析開始
pdf_survey['caution'] = pdf_survey.apply(detect_sentiment, axis=1)
#print(pdf_survey)
#出力
pdf_survey.to_csv('s3://' + args['BUCKET_NAME'] + '/analyzed/result.csv')
に関して個人的な感覚ではありますが、色々検証してみたなかではNegativeが0.3を超えるぐらいから心がしんどくなる気がします。なので余裕をみて0.2にしています。 if response["SentimentScore"]["Negative"] > 0.2:
昔取ったアンケートで結構辛辣だったものを用いて実行してみたところ注意書きがちらほら見られたので成功です😭
ちなみに
最初はSparkのUDFでやろうと思っていたのですがcomprehendの呼び出しのところでエラーが出て原因がわからなかったのでpandasにしています。
これからやる方はboto3のclientの定義(?)のタイミングに注意です。
おわりに
否定的な意見が悪いということはないと思います。
否定があるからこそ得られる改善があり、見つめ直す現実があると思います。
私自身も省みるべきところが多々ありますが、できるだけポジティブな言い換えを行って皆がハッピーな状態にしていけるといいですね。
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!