ChatGPTログ×感情分析可視化─PythonとJupyterによるセルフリフレクションの背景

超ニッチ図鑑

これは“華やかな結果”より、そこへ至る“泥くさい途中経過”の実験ノートです。

AI×セルフリフレクションの実体験記録──語彙頻度と感情推移を可視化
生成AI×セルフリフレクション実験記録──12,000行のChatGPTログを語彙頻度&感情推移で可視化し、Extended-Mind研究やEU AI Actの論点と併せて“AIがもう一人の語り手になれるか”を検証。

記事のポイント: ChatGPTログを感情分析・可視化するまでの「泥沼」を全公開!
この記事は、12,000行ものChatGPT対話ログをPythonとJupyterを使って感情分析・可視化するまでの、”開発過程でぶつかった数々の課題と解決策を記録した「実験ノート」”です。
華やかな分析結果の裏側には、Pythonのバージョン衝突、シェル環境の違い、文字化けとの格闘など、”リアルな「つまずきポイント」”が満載。感情分析モデルの限界や、可視化が単なるゴールではなく「思考の鏡」となるまでの気づきも包み隠さずお伝えします。
AI×セルフリフレクションの最前線で何が起こったのか、具体的な手順と失敗の汗を追体験できます。


“それっぽさ”の殻を破る序章

前回の記事は、12,000 行の ChatGPT ログを使った語彙・感情分析を “科学っぽく” まとめました。けれども私は書き終えたあと、胸のどこかがざわついていました。
「達成感がない…」「グラフの意味わかりにくいか?」「体験記録として薄くサイエンスに触れたただの日記か?」

  • 抽象的すぎた。 具体的な手順や失敗の汗がこぼれ落ちている。
  • 再現性が弱い。 読者が実験を追体験できる導線がない。

セルフリフレクションの背景には、”そもそも感情分析モデルとは何か?”、”感情分析可視化から垣間見える限界とは何か?”といった疑問符の芽が点在している。

今回は、「ログ抽出→整形→Python撃沈→可視化→気づき」に至るまでの リアルタイムの足跡 を全部ここに記録します。


ChatGPT対話をデータ採掘する

ChatGPTとの対話ログを私のPCに取り込み、htmlファイル、JSONファイルを開いた瞬間の第一声。
「うわっ!長っ!」
でした。

  1. ログ採取
    • ChatGPT の 設定 › データコントロール › データをエクスポート を実行 → chatgpt_export_<date>.zip を取得。
    • ZIP 内の conversations.json を抽出し、ログサイズは 12,046 行・1.4 MB
  2. 粒度の決定
    • メッセージ単位に分割 → ID, role, timestamp, text の 4 列構造へ変換(Python スクリプトで自動化)。
  3. 前処理の泥沼
    • 改行コードのそぐわない (\r?\n) を統一。
    • Unicode 絵文字が感情分析ライブラリで文字化け → emoji パッケージで除去。

⏰ 所要 2.5 時間 —— 実験は「掃除」から始まると痛感。


バージョン地獄とシェル沼からの脱出

障害症状処方箋
①バージョン競合Python 3.12.3 と 3.13.5 の併存で PATH 混乱pyenv や明示的な PATH 指定で一時対応
➁シェルごとの挙動差PowerShell と Git Bash で仮想環境が異常動作シェルごとに PATH 表示・実行確認を徹底
③Jupyter 環境の刷新Notebook ではなく Lab に移行されていたjupyter lab を前提に再設定・起動
④JSON生成の落とし穴コード自作による語彙・感情分析用 JSON 整形message 粒度、key構造の調整に試行錯誤

①Pythonバージョン衝突事件

Pythonは約1年ほど触れていなかったので、この機会に最新バージョンPython3.13.5を利用することを決意しました。
Pathはインストール時に作成するよう、チェックを入れたのですが…

>python –version
python 3.12.3

???
システム環境変数のPATHを確認しますが、間違いなくPython3.13の設定になっています。PATHにはPython3.12は存在しますが、優先順位はPython3.13です。

何が問題か?
これだけでも私の脳内はジェットコースターのように???が駆け回ります。

バージョン競合の問題解決につまずいた根本原因

根本となる原因は、実際に配置されたディレクトリがPython3.12.3と、Python3.13.5で違ったことでした。

システム環境変数優先順位の変更だけでは解決できない本質とは、
【Python3.12】→【C:\Python312】
【Python3.13】→【C:\Users\User\AppData\Local\Programs\Python\Python313】

しばらく、Python3.12.3は利用しません。
システム環境変数から、Python312を除外しました。


➁シェルごとの挙動差による派生問題

バージョン競合の問題から派生した因子として、シェルの違いにも触れます。
これは、PowerShellとGitHub Bashシェルを同等に考えていた私にありました。


PowerShellとbashシェルの違い|Python代表的な作法の違い

シェルコマンド出力結果
PowerShellpython –versionpython 3.13.5
コマンドプロンプトpython –versionpython 3.13.5
bashpython –versionpython 3.13.5

コマンドが同じで出力結果が同じという観念から、いずれも私の脳内ではイコールで結びがち。

ところが、バックグラウンドで動作している挙動の違いから、Path表記の作法が違います。

シェルPath表記の作法
PowerShellWindows標準の\使用C:\data.txt
bashUNIX/Linux流の/使用/c/data.txt

PowerShellと同等の扱いで、bash操作をすると、エラーになります。


使用シェルの違いによる派生因子|Pythonあるある代表因子

ここで、Pythonあるあるの代表的なエラーの派生因子を挙げましょう。
pip install … というコマンドで狙ったライブラリやパッケージのインストールしたが、利用しているPythonのバージョンに反映されない問題。

特徴PowerShellのPATH解釈BashのPATH解釈
参照の仕方Windowsシステム全体のPATHを参照するWindowsのPATHを参照しつつ、自身の設定ファイル(.bashrcなど)で定義されたPATHを積み重ねてしまう
優先順位Windowsシステム設定が優先する場合が多いBashの独自設定がWindowsのシステム設定より優先する場合がある
問題例WindowsのPATHで登録された古いPythonのpipを意図せず使ってしまうBashの設定で指定されたPythonのpipを使ってしまう

問題例にフォーカスし、さらに噛み砕いた解説をすると──

使用シェルPowerShellで最新のpip設定Bashシェルで最新のpip設定
PowerShell最新のpipを参照参照しない
Bash参照しない最新のpipを参照

すなわち、使用するシェルは一定に保つことで、予期せぬエラーを回避できるとも言えます。

現実的に、プロジェクトや目的によって使用するシェルを使い分けるケースはありますが…


③Jupyter Lab 初体験メモ

しばらく、Pythonに触れていなかったこと、Python使用時のPCが違っていたこともあり、Jupyter Notebookを再インストールのためにWEBリサーチ。

すると、見慣れた”Jupyter Notebook”よりも、”Jupyter lab”というワードが目に留まります。

Jupyter Notebookだけでも十分ですが、新しいものを試したいということで、”Jupyter lab”をインストール。

Jupyter NotebookとJupyter labの違い

特徴Jupyter NotebookJupyterLab
💻 UIのタイプ単一ドキュメントビュータブ&パネルによる複数ファイル表示
🧩 拡張性限定的(nbextensions で追加可能)高度な拡張性(JupyterLab Extensions)
📂 ファイル管理外部ツールで行うことが多い統合されたファイルブラウザを搭載
🖼️ 表示の柔軟性基本的にセル単位で処理Markdown・コード・画像・ターミナルなど多様
🔄 複数ウィンドウ不可可能(複数のビューを並べて表示できる)
📊 開発スタイルシンプルな解析やメモに向いている本格的な開発やデータ分析に向いている

④”文字化け祭り”と戦う

コードはざっくりと、おぼろげな記憶を手繰り寄せながら書いてみたものの、タイプミス多発でエラーの嵐でした。

JSONファイル生成はできたものの、対話ログ12,000行の(もはや文字数は測り知れない…)

一見contentの文字列は問題ないと思われる。

jupyter labで構造化したJSONファイル

──Pythonスクリプトでグラフを生成するが、語彙の抽出に問題発生。
グラフの要素が化けてしまう。(エンコードの問題だと思われる)

──ひとまず、正規トークンを抽出するようにスクリプトを修正。
しかし、エラー。

──そのままChatGPTに投げて、スクリプトを修正。
グラフが生成されるが、語彙ではない要素が抽出されている…

このような微調整を繰り返し、グラフを形にしていきました。


NRC & VADER で見えた限界|NRCとは?VADERとは?

  • モデル: NRC + VADER (ネガポジ)
  • 違和感: ネガポジ 0.05 でも「焦り」や「必死」は拾えない。
  • 対処: グラフ読解時に《主観メモ》を同時記録 → 数値×エピソードで補完

結論:数値だけでは感情の“色相”は見えない。主観を重ねて初めて立体になる。

グローバルな設計とは別に、個別でローカルな設計(例えば──日本、男女、年齢層など)を考慮する余地がありかもしれない。

特に島国である日本国では、グローバル視点とは違う。
日本語(国語)は、”漢字&ひらがな”という文字列が存在し、且つ”ひとつの言葉”に”複数の意味”を持たせる特徴がある。

語彙から感情スコアを数値化するという点において、言葉は文脈や背景で変化したり、”行間を読む”という日本独自の文化が文字列に隠れた感情を拾えない。


感情分析モデル|NRCとは?

NRC:NRC Emotion Lexicon(NRC感情辞書)の略称。NRC(Nationnal Research Council Canada)。

カナダ国立研究評議会が開発した感情分析用の辞書。

8つの基本感情に分類される。

  • 喜び(joy)
  • 信頼(trust)
  • 恐れ(fear)
  • 驚き(surprise)
  • 悲しみ(sadness)
  • 嫌悪(disqust)
  • 怒り(anger)
  • 期待(anticipation)

NRC Emotion Lexicon(NRC感情辞書)の詳細


感情分析モデル|VADERとは?

VADER:Valence Aware Dictionary and sEntiment Reasoner の略称。感情分析に特化した辞書+ルールベースのモデル。

  • ポジティブ、ネガティブ、ニュートラルの分類+複合スコア(compound)を算出
  • 絵文字、スラング、感嘆符、大文字強調なども感情スコアに反映
  • 否定語(not, n’t)や文脈反転(butなど)も対応

VADERの出力形式は、ネガティブ(neg)、ニュートラル(neu)、ポジティブ(pos)、総合スコア(compound)。

neg、neu、pos、の値は0~1の範囲で、3つの合計値は1.0になるように正規化されている。

compoundの値は-1.0~1.0の範囲で、全体の感情を1つの値で表す。

分類compoundの範囲
ポジティブ(pos)の”しきい値”≧+0.05
ニュートラル(neu)の”しきい値”>-0.05 and<+0.05
ネガティブ(neg)の”しきい値”≦-0.05

VADERの詳細


語彙頻度が暴いた“問い中毒”

「Top 20 語をみると “image/canvas/xaml” が上位に。プロジェクト相談が会話の主軸だったことが透けて見える」
  • Top20 には image / canvas / xaml が並ぶ — 業務の痕跡
  • 同時に why / how / if が上位

示唆:問い語の頻度は “思考の温度” を映すバロメータになるのでは?

問いを発する瞬間、それは自身が持つ”探求心”、”好奇心”が感情を揺さぶり、ある種の”問い中毒”の状態に陥っているのかもしれない。


可視化はゴールではなく鏡だった

Python グラフから得た一番大きな収穫は「線」ではなく「跳ね返り」だった。

  • グラフ → 記憶を呼び水 → 体感と照合 → 新たな疑問が浮上
  • 可視化は 思考を循環させるインタラクション装置

グラフに投影された感情分析は、輪郭を持たない”こころ”を映し出しているかもしれない。


付録|Notebook & レシピ(近日公開)

  • コード全文 + サンプルログ
  • つまずきポイント即席 FAQ
  • PDF: “語彙・感情分析クイックレシピ”

予告|体験できる Web アプリ計画

Next.js × TS × Tailwind で、以下の機能を実装予定。

  1. 対話ログ貼り付け → 語彙 & 感情グラフ即生成
  2. 《主観メモ欄》 付き — 数値と感情を同時入力
  3. 配布予定の日記アプリと連携した感情グラフ生成

コメント