🧪 開発・試作メモ

第10回|感情分析⑤:感情のゆらぎから“気づき”を拾ってみよう!

第10回|感情分析⑤:感情のゆらぎから“気づき”を拾ってみよう!

🎯 今回のゴール

今回のゴールはズバリ、「感情スコアのゆらぎから、“気づき”をAIにまとめてもらう」 こと!

前回までで、

  • 感情を数値化できた
  • グラフで波を見えた
  • 発話比率も把握した

けど、
「で? 結局どこがポイント?」がまだ答えられませんでした。

だから今回は、スコアの波が大きく動いたところをヒントにして、何が響いた? 何が引っかかった? をGPTに丸投げして整理します!

コーチの振り返りメモとしても良し、生徒への共有用フィードバックとしても良し。

これで、AI感情分析シリーズはひとまず“卒業”です🎓✨

🧰 準備するもの

今回必要なのはこれだけ!👇

session_with_speaker.json
→ 「誰が喋ったか(speaker)」と「テキスト」が入ってるファイル!
前回作ったやつそのまま使えます。

session_emotion.json
→ 各発話に「感情スコア(score)」が付いてるファイル!
これを speaker 付きデータとマージして使います。

Google Colab 環境
→ いつもの Colab でOK!ファイルをアップロードして GPT を動かします。

OpenAI APIキー
→ これもいつもの設定でOK。まだの人は Colab準備ガイド を見てね。

この状態で、

「speaker + emotion をマージ → 話題タグを付与 → ゆらぎ検知 → 気づきメモ生成」

まで一気に進められます!

最短ルートでいきましょう🚀✨

📈 感情スコアの波をキャッチしよう

さてさて、ここからが本番です。

アップしてくれた session_with_speaker.json は「speaker」と「text」だけの状態なので、ここに 感情スコア を付けていきます!

🏷 スコアの付け方のイメージ

各発話を GPT に投げて、

  • ポジティブ → +1〜+3
  • ニュートラル → 0
  • ネガティブ → −1〜−3

みたいに数値を返してもらいます。

  • ちょっとポジ → +1
  • めちゃポジ → +3
  • ちょいモヤ → −1
  • ガチ凹み → −3

という感じで、ニュアンスを数字にするわけです。

🔄 前後の変化で「波」を検知!

スコアがついたら、今度は前の発話との差を計算します。

  • 例えば
    前: +1 → 今: −2
    ってなってたら差は −3!
    これ、感情が一気に沈んだサイン。
  • 逆に
    前: −1 → 今: +2
    ってなったら差は +3!
    これも大きな波です。

📌 ポイント

差が ±2 以上だったら「波が立った」とみなすのが目安。

この条件で、全発話をチェックして、波ポイントだけ抽出 しておきます。

🚀これで準備完了!

次はこの「波ポイント」と前後の文脈をセットにして、何が感情を動かしたのか? を GPT に丸投げします!

🧵 前後の文脈も丸ごと分析!

さあ、感情の「波ポイント」が見つかったら、次は その発話だけを見て満足しない のがプロ(誰)。

🔍 単品じゃ弱い!文脈こそ命

感情って、単発の発言よりも前後の流れで変わるもの です。

「なんか急にテンション下がったな?」と思ったら、実は前の話題が原因だったり。

なので、GPTに分析させるときは、必ずこのセットで投げます👇

  • ✅ 波が立った発話
  • ✅ その1つ前の発話
  • ✅ その1つ後の発話(あれば)

🗂 まとめて質問する!

具体的には、

この3つの発言を読んで、何が感情を動かしたか?どんなキーワードが効いてそうか?を簡単に教えて!ってお願いするだけ。

GPTさん、きっといい仕事してくれます。

コツ

前後1個だけでも十分ですが、余裕があれば前後2〜3個つけてもOK。

会話の流れを保つほど、GPTの分析は賢くなります!

🚩 ここまでで何ができる?

  • 波が立ったポイントを検知
  • 前後を含めて「なぜそうなったか」をAIが解析
  • 印象的なキーワードを抽出

これで、ただの感情スコアが“意味あるヒント”に化けるわけです🔥

🗂️ 全発話に「話題タグ」をつけよう

さてさて!ここまでで

session_with_speaker.json(speaker付き)
session_emotion.json(emotion付き)

が用意できましたね!

🔗 まずファイルをマージしよう!

これらを 1つに合体(マージ) させて「誰が何を話したか + その時の感情スコア」 をひとまとめにします!

1️⃣ ファイルを読み込む

import json

# speaker付き
with open('/content/session_with_speaker.json', 'r') as f:
    speaker_data = json.load(f)['segments']

# emotion付き
with open('/content/session_emotion.json', 'r') as f:
    emotion_data = json.load(f)

2️⃣ text をキーにしてマージ

merged = []
for s, e in zip(speaker_data, emotion_data):
    merged.append({
        "speaker": s['speaker'],
        "text": s['text'],
        "emotion": e['score']  # score が emotion!
    })

3️⃣ マージ結果を保存(お好みで)

with open('/content/session_merged.json', 'w') as f:
    json.dump({"segments": merged}, f, ensure_ascii=False, indent=2)

これで 「speaker」「text」「emotion」 が、1つのJSONにまとまりました!

ここからいよいよ GPTで話題タグを付けます!

🏷 なんでタグ付けが必要?

感情スコアがあっても、「どの話題で感情が動いたか?」 が分からないと、ただの数字の羅列になってしまいます。

だから

  • これは雑談?
  • これは学習?
  • これは振り返り?

を明示しておくと、後の分析が100倍わかりやすくなるんです!

🔑 付ける話題タグの例

例えば、こんな感じ👇

タグ
雑談アイスブレイク、世間話
目標確認今日のゴール設定
学習発音練習、テクニック説明
振り返り今日の学びを確認
ToDo確認次回までの課題

実際はこれを GPT に「それぞれの発言をどのカテゴリにする?」って聞くだけ!

✍️ 具体的なタグの付け方

ではお待ちかね、GPTにタグ付けを丸投げする実践手順 です!

Colabで下記をそのまま使ってOK👇

4️⃣ GPTにタグを付けてもらう関数

from openai import OpenAI
client = OpenAI()

def add_topic_tag(text):
    prompt = f"""
    あなたは優秀なコーチングメモAIです。
    以下の発言に、最適な話題タグを1つだけ付けてください。
    タグ例: 雑談 / 目標確認 / 学習 / 振り返り / ToDo確認
    出力は #タグ名 だけにしてください。

    発言: {text}
    """
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "あなたは話題を分類する専門AIです。"},
            {"role": "user", "content": prompt}
        ]
    )
    return response.choices[0].message.content.strip().replace("#", "")

5️⃣ 全発話にタグを付ける

for seg in merged:
    seg['topic'] = add_topic_tag(seg['text'])

6️⃣ タグ付きファイルを保存

with open('/content/session_with_topic.json', 'w') as f:
    json.dump({"segments": merged}, f, ensure_ascii=False, indent=2)

7️⃣ 完成したファイルをPCにダウンロード!

from google.colab import files

# Colabから直接ダウンロード
files.download('/content/session_with_topic.json')

🗂️ これで完全終了!

  • speakeremotion をマージ
  • GPTで topic を付与
  • session_with_topic.json に保存
  • PCにダウンロード

これさえ済ませておけば、どのタイミングでも続きができる安心セーブポイント!

📊 話題別の感情傾向をチェック!

タグ付きの session_with_topic.json が準備できたら、いよいよ仕上げです!

「どの話題で感情がプラス寄り?ネガ寄り?」 を数値とグラフで丸見えにしちゃいましょう!

🎯 何がわかるの?

例えば

  • 「雑談」はポジティブ多め → 空気作りがバッチリ!
  • 「振り返り」はネガティブがちょい多め → 課題に直面してる証拠!
  • 「学習」はニュートラル中心 → 良い集中状態!

こんな風に、話題 × 感情の傾向 をパッと掴めます。

🗂️ どうやって集計する?

やることは超シンプル👇

  • JSONを読み込んで DataFrame にする
  • topic ごとに emotion の平均値を計算する
  • 棒グラフで可視化する

🧑‍💻 Colabでのコード例

import json
import pandas as pd
import matplotlib.pyplot as plt

# タグ付きJSONを読み込み
with open('/content/session_with_topic.json', 'r') as f:
    data = json.load(f)

# DataFrameに変換
df = pd.json_normalize(data['segments'])

# 話題ごとに平均感情スコアを計算
topic_scores = df.groupby('topic')['emotion'].mean().reset_index()

print(topic_scores)

# 棒グラフで可視化
plt.bar(topic_scores['topic'], topic_scores['emotion'])
plt.xlabel('話題')
plt.ylabel('平均感情スコア')
plt.title('話題別の感情傾向')
plt.show()

✨ これで何が見えるの?

グラフを見れば、

  • どの話題で感情が動いてるか
  • どの話題が安心ポイントか
  • どの話題が課題ポイントか

が一目で分かります!

例えば、この画像👇

話題別の感情傾向をチェックした棒グラフ
  • 横軸:話題カテゴリ
  • 縦軸:その話題の平均感情スコア(-1〜+1)

話題ごとの「ポジ・ネガの傾向」が一目で分かるので、ポジが多い話題は褒めポイント!ネガが多い話題は課題ポイント!として活かしてみてください✨

📝 最後は「気づきメモ」にまとめて完成!

ここまでで、

  • ✅ 感情スコア
  • ✅ 話題タグ
  • ✅ 話題別の傾向

ぜーんぶ揃いました!

あとはこの宝の山を GPT に丸投げして、「気づきメモ」 を自動生成しちゃいましょう!

🎯 何をするの?

今回のポイントは、

  • 波が大きかった発話(±2以上の変化)
  • 話題ごとの感情傾向
  • 振り返りで見えた課題やポジポイント

これらを GPT に渡して、

  • 「今回のセッションを一言で振り返ると?」
  • 「何が良かった?」
  • 「次回意識すると良さそうなことは?」

を文章でまとめてもらいます。

🧑‍💻 Colabでの例

こんな感じで GPT に投げればOK👇

# ===============================
# 📌 必要ライブラリを読み込む
# ===============================
import pandas as pd  # データを表(Excelみたい)で扱う
import json  # JSONファイル読み込み用

# ===============================
# 📌 マージ済みデータを読み込む
# (speaker + text + emotion が揃った JSON)
# ===============================
with open('/content/session_merged.json', 'r') as f:
    data = json.load(f)

# ===============================
# 📌 データを表形式にする(Excelのシートみたいに)
# ===============================
df = pd.json_normalize(data['segments'])

# ===============================
# 📌 前の発話との差を自動計算する
# 例)前が +1、今が -1 → 差は -2
# ===============================
df['diff'] = df['emotion'].diff()

# ===============================
# 📌 差が ±2 以上の行だけ抜き出す
# = 感情が大きく動いたところだけ
# ===============================
wave_points_df = df[ df['diff'].abs() >= 2 ]

# ===============================
# 📌 GPTに渡しやすい形(テキスト)にする
# (speaker, text, emotion, diff を文字列化)
# ===============================
wave_points = wave_points_df[['speaker', 'text', 'emotion', 'diff']].to_string(index=False)

# ===============================
# 📌 話題別の感情傾向も用意しておく
# (例:topic_scores は前のステップで作ったやつを想定)
# ===============================
# 例:
# topic_scores = df.groupby('topic')['emotion'].mean().reset_index()

# ===============================
# 📌 GPTにお願いする文章(プロンプト)を作る
# ===============================
insight_prompt = f"""
あなたは優秀なコーチング振り返りメモ作成AIです。
以下の情報を参考に、

1. セッションを一言で要約
2. 良かった点
3. 改善点
4. 次回意識すること

を日本語でシンプルにまとめてください。

【感情が大きく動いた発言】
{wave_points}

【話題ごとの感情傾向】
{topic_scores.to_string(index=False)}
"""

# ===============================
# 📌 GPTを呼び出して気づきメモを生成する
# ===============================
from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "あなたは優秀なコーチングメモ作成AIです。"},
        {"role": "user", "content": insight_prompt}
    ]
)

# ===============================
# 📌 GPTの出力を表示する
# ===============================
insight = response.choices[0].message.content
print(insight)

💡 ポイントまとめ

  • 難しいことはしてない!
    → 「前との差を出す」「大きい差だけ抜き出す」「GPTに読ませる」
  • 全部1ファイルでOK!
    session_merged.json を使えば準備いらず!

最後にダウンロードしておきましょう!

1️⃣ 波ポイント CSVダウンロード

# 日本語対応でCSVを保存(utf-8-sig)
wave_points_df.to_csv('/content/wave_points.csv', index=False, encoding='utf-8-sig')

# Colab からダウンロード
from google.colab import files
files.download('/content/wave_points.csv')

2️⃣ 話題別感情傾向 CSVダウンロード

topic_scores.to_csv('/content/topic_scores.csv', index=False, encoding='utf-8-sig')
files.download('/content/topic_scores.csv')

3️⃣ GPT気づきメモ TXT ダウンロード

with open('/content/insight.txt', 'w', encoding='utf-8') as f:
    f.write(insight)

files.download('/content/insight.txt')

💎 波ポイントを「emotion_highlights」に整理しよう!

感情スコアの波ポイントを拾えたら、次はそれを ポータル用の「emotion_highlights」 に整えておきます!

🎯 なんで整理するの?

今の wave_points.csv は「どの発話で感情が大きく動いたか」までは分かるけど、ポータルに表示するには もう一歩!

✅ 「どんなキーワードが含まれてたのか」
✅ 「どんな気持ちだったのかの一言メモ」

が付いてると、見た目も分かりやすくて、コーチングの振り返りに超便利!

🗂️ どうやって作る?

手順はシンプル👇

  • wave_points_df の各発話をGPTに渡す
  • 「キーワード」と「気持ちのnote」を生成させる
  • emotion_changediff の数値をそのまま入れる
  • これを emotion_highlights.json に保存する

🧑‍💻 Colabでのコード例

# emotion_highlights を作る
emotion_highlights = []

for _, row in wave_points_df.iterrows():
    prompt = f"""
    以下の発話から
    1) 一言キーワード
    2) どんな気持ちだったかの一言メモ
    を日本語で作ってください。

    発話: {row['text']}
    """
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "あなたは感情ハイライトを作るAIです。"},
            {"role": "user", "content": prompt}
        ]
    )
    result = response.choices[0].message.content.strip().split("\n")
    keyword = result[0].replace("1) ", "").strip()
    note = result[1].replace("2) ", "").strip()

    emotion_highlights.append({
        "keyword": keyword,
        "emotion_change": str(int(row['diff'])),
        "note": note
    })

# JSONで保存
import json
with open('/content/emotion_highlights.json', 'w', encoding='utf-8') as f:
    json.dump(emotion_highlights, f, ensure_ascii=False, indent=2)

# ダウンロード
from google.colab import files
files.download('/content/emotion_highlights.json')

これで完成!

これで、感情の波ポイントが「キーワード付きの宝物データ」 に進化!

次回のポータル作りで report.json にそのまま差し込めます🚀

🎁 今回のアウトプット

今回やった内容を一言でまとめると…

「感情の波をキャッチして、何が響いたかを丸裸にしてみた!」 です✨

得られた成果はコレ!

🎯 波ポイントリスト(wave_points.csv)
→ セッション中で感情がグッと動いた発話だけを抽出!
振り返りのハイライト探しに最適!

🎯 話題別の感情傾向(topic_scores.csv)
→ どの話題がポジ寄り?ネガ寄り?を一目で確認できる!
次回のセッション構成のヒントになる!

🎯 気づきメモ(insight.txt)
→ GPT が自動で「今回の学び・次の課題」を整理してくれる!
レポートとしてすぐ共有可能!

📌 これで何が変わる?

  • なんとなくの感覚だったセッション内容が、数値と文章で“気づき”として残る!
  • コーチも生徒も「何が良かった?何を変える?」が明確になる!
  • 次回の目標設定がめちゃくちゃ楽になる!

次は…ここで作ったアウトプットをもとに、自動レポート化 → ポータル化 へ進めば、コーチングがもっとラクで楽しくなりますよ!✨

🏁 おさらいと次回

今回でついに、「感情スコアの波を拾って“気づき”を自動でまとめる」 ところまで到達しました!

これで、
✅ セッション中の気持ちの変化を数値で確認
✅ 大きく動いたところだけをピックアップ
✅ さらに話題ごとの傾向を見える化
✅ そして最後に GPTが振り返りメモを作ってくれる!

という流れが完成です👏✨

「会話を感情の面から振り返る」って、意外とできそうでできなかったことなので、これを自動化できるとセッション後の振り返りがめちゃラクになります!

🚀 次回は…いよいよシリーズのまとめ回!

📌 第11回|まとめ回:ポータル用に1ファイルにまとめよう!

👇 これまでの成果物

  • 文字起こし
  • 感情スコア
  • 波ポイント
  • 話題タグ
  • 傾向
  • 気づきメモ

「1つの JSON にギュッとまとめて」ポータルからいつでも見返せる形に整理します!

これができれば、コーチも生徒もポータルから「全部セットのレポート」を即チェック!

手間ゼロで一元管理が叶います✨

🔗 関連リンク|AI秘書ツール制作シリーズ

💡 迷ったらこちらも

  • この記事を書いた人

SHIRAN

「コードは知らない。でも作れる。」AIとツールで便利を生む非エンジニア。挫折も経験しながら、今は作る楽しさを発信中。詳しくはこちら

-🧪 開発・試作メモ
-, ,